4X4矩阵键盘扫描仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include<reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define SCANPORT P1
- sbit spk=P2^3; //按键提示音驱动端口
- uchar code table[]={ 0x3f,0x06,0x5b,0x4f,0x66,
- 0x6d,0x7d,0x07,0x7f,0x6f, //数码管显示代码
- 0x77,0x7c,0x39,0x5e,0x79,
- 0x71};
- uchar a_LineScan[4]={0xEF,0xDF,0xBF,0x7F}; //列扫描赋值
- void delay(uchar x)
- {
- uchar j;
- while(x--)
- for(j=110;j>0;j--);
- }
- uchar KeyScan() //扫描函数
- {
- uchar Temp=0;
- uchar i=0,j=0;
- for(i=0;i<4;i++)
- {
- SCANPORT=a_LineScan[i]; //定义扫描端口
- Temp=SCANPORT & 0x0F; //取低四位扫描信号
- if(Temp!=0)
- {
- delay(10); //消抖函数
- if(Temp!=0)
- {
- if(Temp!=0x0F) //扫描按键是否按下
- {
- switch(Temp)
- {
- case 0x0E: j=10;break; //第一列
- case 0x0D: j=20;break; //第二列
- case 0x0B: j=30;break; //第三列
- case 0x07: j=40;break; //第四列
- default: j=50;break; //输入错误
- }
- break;
- }
- }
- }
- }
- return i+j+1; //送出返回值
- }
- void KeyProcess(unsigned char KeyCode) //数码管显示函数
- {
-
- switch(KeyCode)
- { //j=10
- case 11:P0=table[0];spk=1;break; //'0'
- case 12:P0=table[1];spk=1;break; //'1'
- case 13:P0=table[2];spk=1;break;
- case 14:P0=table[3];spk=1;break;
- //j=20
- case 21:P0=table[4];spk=1;break; //'4'
- case 22:P0=table[5];spk=1;break; //'5'
- case 23:P0=table[6];spk=1;break;
- case 24:P0=table[7];spk=1;break;
- //j=30
- case 31:P0=table[8];spk=1;break; //'8'
- case 32:P0=table[9];spk=1;break; //'9'
- case 33:P0=table[10];spk=1;break;
- case 34:P0=table[11];spk=1;break;
- //j=40
- case 41:P0=table[12];spk=1;break; //'C'
- case 42:P0=table[13];spk=1;break; //'d'
- case 43:P0=table[14];spk=1;break;
- case 44:P0=table[15];spk=1;break;
- default:break; //无法识别
- }
- }
- void main()
- {
- spk=0; //扬声器初始化
- P0=0;
- while(1)
- {
- KeyProcess(KeyScan());
- spk=0; //复位扬声器
- }
- }
复制代码
所有资料51hei提供下载:
20161111144-李作鑫4×4键盘矩阵按键.rar
(66.55 KB, 下载次数: 130)
|