看惯了千篇一律的0X55这样的代码,再来看我写的以十进制的按键扫描,是否眼前一新?
要说明的是,延时消抖,可用int i=350;while(i--);这两句替换.
接下来看按键定义:
这样就完成了矩阵按键扫描,及按键重新定义,要说明的是,要取得相加的十进制值,可以直接从送数码管显示读出,就可以对按键进行任意重新定义了.
上述的矩阵按键也可以采用中断消抖,如50-100毫秒甚至更短的时间。
其实我挺讨厌case
准备改写以前的代码,用其他方式实现同样功能。
修改以上代码不足:
#include"ShuJu_LeiXin.H" /*头文件,数据类型定义*/
#include"YanShi.H" /*延时函数:毫秒,1.08微秒,5微秒*/
#include"QuZhen_JianPan.H"
U8 JianZhi = 0; /*存按键值*/
extern bit k; /*调用主文件变量*/
/*检测20个(4*4 +4)按键的键盘扫描函数,0~19数值*/
//U8 JianPan_QuZhi()
//{
// P3 = 0xf0;/*判断哪一列被按下1111 0000 P3^0~7*/
// if( P3 != 0xf0)
// {
// YanShi5us(/*消抖*/);
// switch(P3)
// {
// case 0xe0: JianZhi = 0; break; /*s6 s10 s14 s18*/
// case 0xd0: JianZhi = 1; break; /*s7 s11 s15 s19*/
// case 0xb0: JianZhi = 2; break; /*s8 s12 s16 s20*/
// case 0x70: JianZhi = 3; break; /*s9 s13 s17 s21*/
// }
//
// P3 = 0x0f;/*判断哪一行被按下0000 1111 P3^0~7*/
// switch(P3)
// {
// /*s 6 s 7 s 8 s 9*/
// case 0x0d: JianZhi += 4; break; /*s10 s11 s12 s13*/
// case 0x0b: JianZhi += 8; break; /*s14 s15 s16 s17*/
// case 0x07: JianZhi += 12; break; /*s18 s19 s20 s21*/
// }
// while(P3 != 0x0f)k=1; YanShiUs(350);
// }
// P3 = 0xff;/*判断独立按键 1111 1111 P3^0~7*/
// if(P3 != 0xff)
// {
// switch(P3)
// {
// case 0xfe: JianZhi = 16; break;
// case 0xfd: JianZhi = 17; break;
// case 0xfb: JianZhi = 18; break;
// case 0xf7: JianZhi = 19; break;
// }
// while(P3 != 0xff)k=1; YanShi5us(/*松手检测*/);
// }
// return JianZhi;
//}
unsigned char JianPan_ShaoMiao(/*使用行列反转扫描法,简易计算器1602显示*/)
{
unsigned char H,L;
unsigned int i=350;
P3=15;
if(P3!=15)
{
H=P3;
P3=240;
L=P3;
while(P3!=240)k=1;
while(i--);
}
P3 = 255;
return(H+L);
}
unsigned char JianPan_QuZhi16()
{
unsigned char JianZhi;
switch(JianPan_ShaoMiao())
{
case 238:JianZhi = 0; break; /*s06=0 s07=4 s08=8 s09=12*/
case 237:JianZhi = 1; break; /*s10=1 s11=5 s12=9 s13=13*/
case 235:JianZhi = 2; break; /*s14=2 s15=6 s16=10 s17=14*/
case 231:JianZhi = 3; break; /*s18=3 s19=7 s20=11 s21=15*/
case 222:JianZhi = 4; break;
case 221:JianZhi = 5; break;
case 219:JianZhi = 6; break;
case 215:JianZhi = 7; break;
case 190:JianZhi = 8; break;
case 189:JianZhi = 9; break;
case 187:JianZhi = 10; break;
case 183:JianZhi = 11; break;
case 126:JianZhi = 12; break;
case 125:JianZhi = 13; break;
case 123:JianZhi = 14; break;
case 119:JianZhi = 15; break;
default: JianZhi = 255;break;
}
return JianZhi;
}
unsigned char code ShaoMiaoZhi[]={238,237,235,231,222,221,219,215,190,189,187,183,126,125,123,119};
unsigned char JianPan_QuZhi()
{
unsigned char Jian_Zhi=0,LinShi=JianPan_ShaoMiao();
while(LinShi!=ShaoMiaoZhi[Jian_Zhi])if(++Jian_Zhi > 15)break;
return (Jian_Zhi > 15)? 255 : Jian_Zhi;
}