前段时间自己设计了矩阵键盘+1602的电路,现在试着设计一个矩阵键盘+数码管的电路,也许能对刚入门51的同学有点帮助
我的这个电路实现的功能是:矩阵键盘输入数据,单片机把数据送到4位数码管上由右向左显示出来,显示满4位时,按下矩阵键盘任意键屏幕清零重新输入。
/***************矩阵键盘送7段4位数码管显示代码(2014.8.18)******************************************************/ #include
- #include
- #define uchar unsigned char
- #define uint unsigned char
***it wei_1=P2^0;
- ***it wei_2=P2^1;
- ***it wei_3=P2^2;
- ***it wei_4=P2^3;
uchar code table[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0x9c,0xf0,0xee,0x9e,0x8e,0x6e}; //这里是0到9的专门给共阴数码管用的16进制编码还有几个我自己定义的字符
- uchar key_tem[4]; //这个数组用来保存矩阵键盘输入的4个键值
- uchar temp,zi,wei,control;
- uint key;
void delay_ms(uint z);
- void led_disp(uchar wei2,uchar num);
- void led_init();
- uchar key_putdown();
- void key_scan();
void delay_ms(uint z)
- {
- uint i;
- while(z--)
- for(i=110;i>0;i--);
- }
- uchar key_putdown()
- {
- P1=0xf0;
- if(P1==0xf0)
- _nop_();
- delay_ms(15);
- while(P1==0xf0)
- {
- _nop_();
- return 0;
- }
- return 1;
- }
void key_scan()
- {
- key=0;
- temp=0; //temp用来临时存放P1口的两次扫描结果
- P1=0xf0;
- temp=P1;
- temp=~((temp>>4)|0xf0); //temp右移4位再跟0xf0按位或再取反即可得到1,2,4,8中的任一个数,每个数代表一行或一列
- if(temp==1)key=0;
- else if(temp==2)key=4;
- if(temp==4)key=8;
- else if(temp==8)key=12;
P1=0xff; //P1口本来是置0xf0,若要再次赋值则必须先把P1口置高,否则它会变成0x00
- P1=0x0f;
- temp=P1;
- temp=~(temp|0xf0); //这里不需要右移4位了
- if(temp==1)key=key+0;
- else if(temp==2)key=key+1;
- if(temp==4)key=key+2;
- else if(temp==8)key=key+3;
}
- void led_init()
- {
- wei_1=1;wei_2=1;wei_3=1;wei_4=1;
- P0=0x00;
- }
- void led_disp(uchar wei2,uchar num)
- {
P0=table[num];
- switch(wei2) //这个switch用来控制数码管的位选
- {
- case 1:wei_1=1;wei_2=1;wei_3=1;wei_4=0;break;
- case 2:wei_1=1;wei_2=1;wei_3=0;wei_4=1;break;
- case 3:wei_1=1;wei_2=0;wei_3=1;wei_4=1;break;
- case 4:wei_1=0;wei_2=1;wei_3=1;wei_4=1;break;
- }
- delay_ms(2);
- P0=0x00; //每次显示完后都要消隐,这非常重要!这句一缺数码管就会闪屏
- wei_1=1;wei_2=1;wei_3=1;wei_4=1;
} void main()
- {
- wei=1;
- control=0;
- led_init();
- if(key_putdown())
- while(1) //这里用了两个while(1)嵌套
- {
- key_scan();
- key_tem[control++]=key;
- if(control==5){led_init();control=0;}
- while(1)
- {
- switch(control) //这个switch用来控制数码管显示矩阵键盘已经输入过的值,因为数码管的结构问题,要让它显示已经输入过的值有点麻烦
- {
- case 1:led_disp(1,key_tem[0]);break;
- case 2:led_disp(1,key_tem[0]);led_disp(2,key_tem[1]);break;
- case 3:led_disp(1,key_tem[0]);led_disp(2,key_tem[1]);led_disp(3,key_tem[2]);break;
- case 4:led_disp(1,key_tem[0]);led_disp(2,key_tem[1]);led_disp(3,key_tem[2]);led_disp(4,key_tem[3]);break;
- }
-
- if(key_putdown()) //这个if是转到第一个while的必要条件
- break;
- }
- }
- }
复制代码
2
|
|
|
|