|
问题描述:我想写一个程序想要达到目的是:通过矩阵键盘s1~s10分别代表数字0~9,按下矩阵键盘代表的数字然后在数码管的最左两位显示出来。想要达到的效果就像计算器那样当有第一个数字输入时,在最右侧显示;当有第二个数字输入时,最右侧数字向左移动一位,空出来的位置显示第二个数字。
我的思路是:定义一个两字节数组,初值都是0,分别存放个位和十位。第一个输入的数字存入个位,当有第二个数字输入时,先把个位的值存入十位,再将第二个数字存入个位。
下面是我写的一段不完整的代码:请会的大神帮我完成一下代码或者按照你的思路给我一个参考代码,谢谢您!(我用的板子是单核A2开发板)
单片机代码:
- #include
- #define uchar unsigned char
- #define uint unsigned int
- uchar seg_value[2]; //数码管编码存储,数组的0、1位分别存储个位、十位
- void delay1();
- uchar KEY_SCAN();
- void seg_updata(uchar x);
- void SEG_display();
- uchar code seg_table[] = {0xc0,0xf9,0xa4,0xb0, //定义一个数组,将0~f对应的编码存入数组
- 0x99,0x92,0x82,0xf8,
- 0x80,0x90,0x88,0x83,
- 0xc6,0xa1,0x86,0x8e};
- sbit LSA=P2^2;
- sbit LSB=P2^3;
- sbit LSC=P2^4;
- void delay1()
- {
- uint i;
- for(i = 0;i<1000;i++);
- }
- uchar KEY_SCAN()
- {
- uchar key_buf; //暂时存储P1口状态
- uchar key_state; //存储按键状态
- P1 = 0xf0; //高四位高电平,第四位低电平
- key_buf = P1; //读取P1口状态
- if(key_buf != 0xf0)
- {
- delay1(); //延时消抖
- if(P1 == key_buf) //再次判断是否有按键按下
- {
- key_state = key_buf & 0xf0; //高四位状态存入key_state
- P1 = 0x0f; //高四位低电平,第四位高电平
- key_buf = P1; //读取P1口状态
- key_state = key_state | key_buf; //第四位状态存入key_state
- return key_state; //返回该按键坐标值(请允许我用坐标形容这个值)
- }
- else
- return 0; //如果没有按键按下,返回0
- }
- else
- return 0; //如果没有按键按下,返回0
- }
- /***************************************************
- * 键值判断子函数
- * 判断按键值,更新到数组seg_value[]
- ****************************************************/
- void seg_updata(uchar x)
- {
- uchar table_num; //存储字符在数组中对应的编号
- switch(x)
- {
- case 0x77: table_num = 0;break; //S1被按下时,对应数字0
- case 0x7b: table_num = 1;break; //S2被按下时,对应数字1,
- case 0x7d: table_num = 2;break;
- case 0x7e: table_num = 3;break;
- case 0xb7: table_num = 4;break;
- case 0xbb: table_num = 5;break;
- case 0xbd: table_num = 6;break;
- case 0xbe: table_num = 7;break;
- case 0xd7: table_num = 8;break;
- case 0xdb: table_num = 9;break;
- default: table_num = 10; //如有其它坐标值,不作处理
- }
- if(table_num<10)
- {
- seg_value[1] = seg_value[0];
- seg_value[0] = seg_table[table_num];
- }
- }
- /***************************************************
- * 数码管显示子函数
- * 每隔一段时间,更新数据
- ****************************************************/
- void SEG_display()
- {
- uint i;
- for(i=0;i<2;i++)
- {
- switch(i) //位选,选择点亮的数码管,
- {
- case(0):
- LSA=0;LSB=0;LSC=0; break;
- case(1):
- LSA=1;LSB=0;LSC=0; break;
- }
- P0=seg_value[i];//发送段码
- delay1(); //间隔一段时间扫描
- P0=0x00;//消隐
- }
- }
- void main()
- {
- uchar key_value;
- uint state_cnt=1;
- while(1)
- {
- SEG_display();
- }
- }
复制代码
|
|