|
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define KEY P1 //用P1口控制4*4个矩阵键盘
- //------------------------------------------------
- uchar code duanma[17]={ //码表的定义
- 0x3f,0x06,0x5b,0x4f,
- 0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,
- 0x39,0x5e,0x79,0x71
- };
- //------------------------------------------------
- void delay(uchar x) //延时函数的定义
- {
- uchar y,z;
- for(y=x;y>0;y--)
- for(z=110;z>0;z--);
- }
- //------------------------------------------------
- uchar kayscan() //按键检测函数的定义
- {
- uchar keyvalue=0; //键值的定义,并且用于返回
- uchar temp;
- uchar and;
- temp=0x0f;
- KEY=0x0f;
- if(KEY != 0x0f) //检测按键是否被按下
- {
- delay(10); //延时10毫秒,以便消抖
- if(KEY != 0x0f) //再次检测按键是否被按下
- {
- and = KEY & temp; //行检测
- switch(and)
- {
- case(0x0e) : keyvalue=0 ; break; //第一行的按键被按下了
- case(0x0d) : keyvalue=4 ; break; //第二行的按键被按下了
- case(0x0b) : keyvalue=8 ; break; //第三行的按键被按下了
- case(0x07) : keyvalue=12; break; //第四行的按键被按下了
- }
-
- temp=0xf0; //列检测
- KEY=0xf0;
- and = KEY & temp;
- switch(and)
- {
- case(0xe0) : keyvalue=keyvalue+0; break; //第一列的按键被按下了
- case(0xd0) : keyvalue=keyvalue+1; break; //第二列的按键被按下了
- case(0xb0) : keyvalue=keyvalue+2; break; //第三列的按键被按下了
- case(0x70) : keyvalue=keyvalue+3; break; //第四列的按键被按下了
- }
- }
- }
- return(keyvalue);
- }
- //------------------------------------------------
- void main() //主函数
- {
- P0=0; //初始化,让所有led都灭
- while(1)
- {
- P0=duanma[kayscan()]; //矩阵键盘的扫描,并且返回键值,赋值给P0
- }
- }
复制代码
|
|