//接收键盘数据(读165)<br />unsigned char ReadKeyByte(void) using 0<br />{<br />unsigned char i, key;<br /> PL = 0;//接收74HC165并行数据<br /> RX = 1;//延时<br /> PL = 1;//锁存74HC165并行数据<br /> for (i = 0; i < 8; i ++) {<br /> TX = 0;//拉低74HC165时钟 <br /> _nop_();<br /> CY = RX;//读74HC165串行数据<br /> _rlca_();<br /> TX = 1;//拉高74HC165时钟<br /> _nop_();<br /> }<br /> key = ~ACC;//存键盘串行数据<br /> return key;//键值a..h(D7..D0)//无键压下0x00<br />}<br /><br />//执行键盘命令<br />void KeyCommandExec(unsigned char commgroup, unsigned char commnum) using 0<br />{<br />unsigned int i;<br />unsigned key;<br />code void *KeyArray[3][4] = {//二维函数数组指针阵列表(散转命令地址表)<br /> {(void *)Key00 + 0x5b7d, (void *)Key01 + 0xa6ea, (void *)Key02 + 0xf157, (void *)Key03 + 0x4cc4},<br /> {(void *)Key10 + 0x9731, (void *)Key11 + 0xe2ae, (void *)Key12 + 0x3d1b, (void *)Key13 + 0x8888},<br /> {(void *)Key00 + 0xd3f5, (void *)Key21 + 0x2e62, (void *)Key02 + 0x79df, (void *)Key23 + 0xc44c} <br /> };<br /> if ((commgroup < 3) && (commnum < 4)) {<br /> key = commgroup * 4 + commnum + 1;<br /> i = ((key * 53 & 0xf) * 0x1000)+ ((key * 43 & 0xf) * 0x100) + ((key * 23 & 0xf) * 0x10) + (key * 13 & 0xf);<br /> _icall_((void *)KeyArray[commgroup][commnum] - i);//键盘命令散转<br /> }<br />}<br /><br /><br /><br /><br />/*------------------------------------<br /> 定时器T0中断服务程序(5mS)<br />------------------------------------*/<br />void t0proc() interrupt TF0_VECTOR using 0<br />{<br />unsigned char key;<br />code unsigned char KeyPosTab[] = {0x80, 0x40, 0x20, 0x10};<br /> TL0 = T0_5mS & 0xff;<br /> TH0 = T0_5mS >> 8;<br /> key = ReadKeyByte();//接收键盘数据(读74HC165)(每次可取多键)<br /> if (key & KeyPosTab[SystemBuffers.TimeCount & 0x03]) {//有键压下(每次只取1键以实现“零耗时消除键盘抖动”)<br /> SystemBuffers.KeyCount[SystemBuffers.TimeCount & 0x03] ++;//压键计数<br /> if (SystemBuffers.KeyCount[SystemBuffers.TimeCount & 0x03] == 2) {//短压键<br /> SystemBuffers.WaitTime = 0;<br /> KeyCommandExec(0, SystemBuffers.TimeCount & 0x03);//单击键Key00()~Key03()<br /> }<br /> else {<br /> if (SystemBuffers.LedWorkPosition) key = SysFastPushKeyTime;//50<br /> else key = SysPushKeyTime;//150//3S<br /> if (SystemBuffers.KeyCount[SystemBuffers.TimeCount & 0x03] >= key) {//长压键X * 20mS<br /> SystemBuffers.WaitTime = 0;<br /> KeyCommandExec(2, SystemBuffers.TimeCount & 0x03);//长压键Key20()~Key23()<br /> SystemBuffers.KeyCount[SystemBuffers.TimeCount & 0x03] = 3;//清除长压键计数器(躲过单击键)<br /> }<br /> }<br /> }<br /> else {//无键压下(包括放键)<br /> if (SystemBuffers.KeyCount[SystemBuffers.TimeCount & 0x03] >= 2) {//放键事件<br /> SystemBuffers.WaitTime = 0;<br /> KeyCommandExec(1, SystemBuffers.TimeCount & 0x03);//键释放Key10()~Key13()<br /> }<br /> SystemBuffers.KeyCount[SystemBuffers.TimeCount & 0x03] = 0;//清除压键计数器<br /> }<br />//...............................<br />}
|