4x4矩阵键数值的读取和显示;
按键被按下后只有被松开才会有效果;
多个按键被按下只有按键都被松开最先被按下的按键起效果;
采用共阳极数码管显示;
附件包含完整仿真设计和C程序。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include<reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- /**************物理连线
- P1对应数码管;
- P2前四位对应矩阵行
- P2后四位对应矩阵列
- *****************/
- #define saomiao P2
- #define DB P1
- void display(uchar dat); //显示键盘值函数
- uchar key_scan( ); //键盘扫描函数
- uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e }; //0~15数码管代码,共阳极
- uchar key; //键盘值
- /********************************************************************
- 延时函数
- *********************************************************************/
- void delay10ms(void) //延时程序
- {
- unsigned char i,j;
- for(i=20;i>0;i--)
- for(j=248;j>0;j--);
- }
- //*****************键盘扫描函数*****************
- uchar key_scan()
- {
- uchar temp;
- saomiao=0xfe; //扫描第1行键
- temp=saomiao;
- temp=temp&0xf0;
- if(temp!=0xf0)
- delay10ms(); //延时10ms
- temp=saomiao;
- temp=temp&0xf0; //确认按键被按下
- if(temp!=0xf0)
- {
- temp=saomiao;
- switch(temp)
- {
- case 0xee: //第1行第1列被按下
- key=0;
- break;
- case 0xde: // 第1行第2列被按下
- key=1;
- break;
- case 0xbe: // 第1行第3列被按下
- key=2;
- break;
- case 0x7e: // 第1行第4列被按下
- key=3;
- break;
- default:
- break;
- }
- K1:
- temp=saomiao;
- temp=temp&0xf0;
- while(temp!=0xf0) //等待按键被松开才可以有效果
- goto K1;
- }
- saomiao=0xfd; //扫描第2行键
- temp=saomiao;
- temp=temp&0xf0;
- if(temp!=0xf0)
- delay10ms();
- temp=saomiao;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- temp=saomiao;
- switch(temp)
- {
- case 0xed:
- key=4;
- break;
- case 0xdd:
- key=5;
- break;
- case 0xbd:
- key=6;
- break;
- case 0x7d:
- key=7;
- break;
- default:
- break;
- }
- K2: temp=saomiao;
- temp=temp&0xf0;
- while(temp!=0xf0) //等待按键被松开
- goto K2;
- }
- saomiao=0xfb; //扫描第3行键
- temp=saomiao;
- temp=temp&0xf0;
- if(temp!=0xf0)
- delay10ms();
- temp=saomiao;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- temp=saomiao;
- switch(temp)
- {
- case 0xeb:
- key=8;
- break;
- case 0xdb:
- key=9;
- break;
- case 0xbb:
- key=10;
- break;
- case 0x7b:
- key=11;
- break;
- default :
- break;
- }
- K3:
- temp=saomiao;
- temp=temp&0xf0;
- while(temp!=0xf0) //等待按键被松开
- goto K3;
- }
- saomiao=0xf7; //扫描第4行键
- temp=saomiao;
- temp=temp&0xf0;
- if(temp!=0xf0)
- delay10ms();
- temp=saomiao;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- temp=saomiao;
- switch(temp)
- {
- case 0xe7:
- key=12;
- break;
- case 0xd7:
- key=13;
- break;
- case 0xb7:
- key=14;
- break;
- case 0x77:
- key=15;
- break;
- default:
- break;
- }
- K4: temp=saomiao;
- temp=temp&0xf0;
- while(temp!=0xf0) //等待按键被松开
- goto K4;
- }
- return key;
- }
- void display(uchar dat)
- {
- DB=table[dat];
- }
- main()
- {
- key=0;
- while(1)
- {
- key=key_scan(); //读取按键值
- display(key); //显示按键值
- }
- }
-
复制代码
所有资料51hei提供下载:
4x4矩阵键.zip
(54.63 KB, 下载次数: 13)
|