矩阵键盘
矩阵键盘用来控制功能的选择
按键的返回值又分为物理键值和逻辑键值,物理键值是按键实际的01代码,而逻辑键值是01代码翻译而来的十进制数。
key.c
#include "myhead.h"
unsigned char key_scan(void)//返回按键的物理键值
{
unsigned char keyvalue;
KEYPORT = 0xf0;
if(0xf0 != KEYPORT)//有按键按下
{
delay_ms(10);
if(0xf0 != KEYPORT)//确实有按键按下
{
KEYPORT = 0xfe;
if(0xfe != KEYPORT)
{
keyvalue = KEYPORT;
keyvalue &= 0xf0;
keyvalue += 0x0e;
while(0xfe != KEYPORT);
//有按键抬起
delay_ms(10);
while(0xfe != KEYPORT);
//确实有按键抬起
return keyvalue;
}
KEYPORT = 0xfd;
if(0xfd != KEYPORT)
{
keyvalue = KEYPORT;
keyvalue &= 0xf0;
keyvalue += 0x0d;
while(0xfd != KEYPORT);
//有按键抬起
delay_ms(10);
while(0xfd != KEYPORT);
//确实有按键抬起
return keyvalue;
}
KEYPORT = 0xfb;
if(0xfb != KEYPORT)
{
keyvalue = KEYPORT;
keyvalue &= 0xf0;
keyvalue += 0x0b;
while(0xfb != KEYPORT);
//有按键抬起
delay_ms(10);
while(0xfb != KEYPORT);
//确实有按键抬起
return keyvalue;
}
KEYPORT = 0xf7;
if(0xf7 != KEYPORT)
{
keyvalue = KEYPORT;
keyvalue &= 0xf0;
keyvalue += 0x07;
while(0xf7 != KEYPORT);
//有按键抬起
delay_ms(10);
while(0xf7 != KEYPORT);
//确实有按键抬起
return keyvalue;
}
}
}
return 0x00;
}
// unsigned char key_pro()//返回按键的逻辑键值
// {
// unsigned char keynum;
// keynum = key_scan();
// switch(keynum)
// {
// case 0x7e :return 0;break;
// case 0xbe :return 1;break;
// case 0xde :return 2;break;
// case 0xee :return 3;break;
// case 0x7d :return 4;break;
// case 0xbd :return 5;break;
// case 0xdd :return 6;break;
// case 0xed :return 7;break;
// case 0x7b :return 8;break;
// case 0xbb :return 9;break;
// case 0xdb :return 10;break;
// case 0xeb :return 11;break;
// case 0x77 :return 12;break;
// case 0xb7 :return 13;break;
// case 0xd7 :return 14;break;
// case 0xe7 :return 15;break;
// default:return 16;break;
// }
// }
此处将逻辑键值注释掉是因为,我在编译代码下载到51板子上时,代码总量超过了51单片机的最大容量,所以在程序中直接选用物理键值。
key.h
#ifndef _KEY_H
#define _KEY_H
extern unsigned char key_scan(void);
extern unsigned char key_pro();
#endif