单片机矩阵键盘扫描函数单片机解密
| 单片机解密void IO_KeyScan(void) { u8 j; j = IO_KeyState1; //保存上一次状态 P7 = 0xf0; //X低,读Y IO_KeyDelay(); IO_KeyState1 = P7 & 0xf0; P7 = 0x0f; //Y低,读X IO_KeyDelay(); IO_KeyState1 |= (P7 & 0x0f); IO_KeyState1 ^= 0xff; //取反 if(j == IO_KeyState1) //连续两次读相等 { j = IO_KeyState; IO_KeyState = IO_KeyState1; if(IO_KeyState != 0) //有键按下 { F0 = 0; if(j == 0) F0 = 1; //第一次按下 else if(j == IO_KeyState) { if(++IO_KeyHoldCnt >= 20) //1秒后重键 { IO_KeyHoldCnt = 18; 28 F0 = 1; } } if(F0) { j = T_KeyTable[IO_KeyState >> 4]; if((j != 0) && (T_KeyTable[IO_KeyState& 0x0f] != 0)) { KeyCode = (u8)(((j - 1) * 4 )+ (T_KeyTable[IO_KeyState & 0x0f]) ); //计算键码,17~32 + 16 } } } else IO_KeyHoldCnt = 0; } P7 = 0xff; } 2、主函数 void main(void) { IO_init(); //IO口初始化 LCD_Init();//液晶屏初始化 delay1ms(10); LCD_Clear(WHITE);//清屏白底 UartInit(); //串口初始化 UartSendStr("按键测试\r\n"); KeyCode = 0; //给用户使用的键码, 1~16有效 IO_KeyState = 0; IO_KeyState1 = 0; IO_KeyHoldCnt = 0; Gui_StrCenter(0,16,RED,BLUE,"KEY 测试程序",16,1);//居中显示 Show_Str(20,56,BLUE,YELLOW,"KeyCode:",16,0); //循环 while(1) { IO_KeyScan(); if(KeyCode>0) { UartSendStr("pressed"); LCD_ShowNum(100,56,KeyCode,2,16); } KeyCode=0; delay1ms(100); } } |
上一篇:单片机热敏电阻温度计单片机解密

芯片解密