|
/********************************* 功能描述:T0定时器中断法,矩阵键盘扫描(线反转法)。 返回值:key键值为1-16,出错码为0。 *********************************/ #include /*头文件*/ unsigned char keydelay; /*keydelay按键持续ms数; */ bit nkey,okey; /*按键(新/旧)状态*/ void main() { TMOD=0x01; /*T0工作方式1*/ TH0=0xfc; /*T0装载初值,定时1ms*/ TL0=0x18; EA=1; /*开中断*/ ET0=1; TR0=1; /*启动T0*/ while (1) { /*以下为键值计算核心*/ if (nkey!=okey) /*按键的新旧状态不相等?*/ { okey=nkey; /*把当前按键状态保存起来*/ if (nkey&&(P3!=0x0f)) /*按键是否按下,没有松开?*/ { unsigned char keyX,keyY,key; /*keyX按键行坐标;keyY按键列坐标;key按键键值*/ keyX=P3&0x0f; /*开始用线反转法计算键值*/ P3=0xf0; keyY=P3&0xf0; key=keyX|keyY; switch (key) { case 0xee: key=1; break; case 0xde: key=2; break; case 0xbe: key=3; break; case 0x7e: key=4; break; case 0xed: key=5; break; case 0xdd: key=6; break; case 0xbd: key=7; break; case 0x7d: key=8; break; case 0xeb: key=9; break; case 0xdb: key=10; break; case 0xbb: key=11; break; case 0x7b: key=12; break; case 0xe7: key=13; break; case 0xd7: key=14; break; case 0xb7: key=15; break; case 0x77: key=16; break; default: key=0; /*出错码*/ break; } P1=key; /*P1流水灯显示按键值*/ } } } } void time0 () interrupt 1 /*T0中断服务程序*/ { TH0=0xfc; /*T0装初值定时1ms*/ TL0=0x18; /**************************中断法检测按键代码:开始**************************/ P3=0x0f; /*线反转法*/ if (P3!=0x0f) /*判断按键按下?*/ { keydelay++; /*按键按下持续时间++,单位ms*/ if (keydelay>=15) /*按键按下等于15ms,则认为按键按下*/ { keydelay=0; /*清零*/ nkey=1; /*按键已按下*/ } } else { keydelay=0; nkey=0; } /**************************中断法检测按键代码:结束**************************/ }
|