《上次发过一次,这次程序写法不同。供大家参考参考》
//希望不要再有不懂装懂的人再说成逐行扫描,不知道就不要瞎BB (此行为注释)
*实现效果16个按键数码管对应显示0~f
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载):
程序:
- #include <reg51.h>
- void delay(unsigned int i) //延时函数
- {
- unsigned int k;
- for(k = 0; k < i; k++);
- }
- unsigned char table[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //数码管显示码0~f
- unsigned char code key_code[] ={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77}; //键盘扫描码
- char keyscan(); //行列反转法实现的矩阵键盘扫描函数
- void main()
- {
- char i;
- P0=0x00;
- while(1)
- {
- i=keyscan();
- if(i!=-1) //当有按键被按下
- {
- P0=table[i];
- delay(10000);
- }
- }
-
- }
- char keyscan()
- {
- char scan1,scan2,keycode,j,key;
- key =-1; //按键值初值为-1,如果没有扫描到按键,函数返回-1
- P2 =0xf0; //写:行为全1,列为全0
- scan1 =P2; //读:行列值
- if(scan1 !=0xf0) //如果读入值不为0xf0,则表示有按键按下
- {
- delay(1200);
- scan1 = P2; //再次读入
- if(scan1 != 0xf0) //再次判断是否有按键按下,去除抖动
- {
- P2 =0x0f; //行列反转,写:行为全0,列为全1
- scan2 =P2; //读入行列值
- keycode = scan1 | scan2; //合并行列值,得到扫描码
- for(j=0;j<16;j++) //由扫描码表得到按键值
- {
- if(keycode ==key_code[j])
- {key =j;
- break;
- }
- }
- }
- }
- return (key); //返回按键值
- }
复制代码 全部资料51hei下载地址:
行列反转法矩阵键盘扫描.rar
(83.25 KB, 下载次数: 81)
|