51单片机矩阵键盘扫描函数 参考代码

[复制链接]
查看3 | 回复0 | 2021-6-24 00:12:15 | 显示全部楼层 |阅读模式
键盘扫描代码:
  1. void IO_KeyScan(void)
  2. {
  3. u8 j;
  4. j = IO_KeyState1; //保存上一次状态
  5. P7 = 0xf0; //X低,读Y
  6. IO_KeyDelay();
  7. IO_KeyState1 = P7 & 0xf0;
  8. P7 = 0x0f; //Y低,读X
  9. IO_KeyDelay();
  10. IO_KeyState1 |= (P7 & 0x0f);
  11. IO_KeyState1 ^= 0xff; //取反
  12. if(j == IO_KeyState1) //连续两次读相等
  13. {
  14. j = IO_KeyState;
  15. IO_KeyState = IO_KeyState1;
  16. if(IO_KeyState != 0) //有键按下
  17. {
  18. F0 = 0;
  19. if(j == 0) F0 = 1; //第一次按下
  20. else if(j == IO_KeyState)
  21. {
  22. if(++IO_KeyHoldCnt >= 20) //1秒后重键
  23. {
  24. IO_KeyHoldCnt = 18;
  25. 28
  26. F0 = 1;
  27. }
  28. }
  29. if(F0)
  30. {
  31. j = T_KeyTable[IO_KeyState >> 4];
  32. if((j != 0) && (T_KeyTable[IO_KeyState& 0x0f] != 0))
  33. {
  34. KeyCode = (u8)(((j - 1) * 4 )+ (T_KeyTable[IO_KeyState &
  35. 0x0f]) ); //计算键码,17~32 + 16
  36. }
  37. }
  38. }
  39. else IO_KeyHoldCnt = 0;
  40. }
  41. P7 = 0xff;
  42. }
复制代码
主函数
  1. void main(void)
  2. {
  3. IO_init(); //IO口初始化
  4. LCD_Init();//液晶屏初始化
  5. delay1ms(10);
  6. LCD_Clear(WHITE);//清屏白底
  7. UartInit(); //串口初始化
  8. UartSendStr("按键测试\r\n");
  9. KeyCode = 0; //给用户使用的键码, 1~16有效
  10. IO_KeyState = 0;
  11. IO_KeyState1 = 0;
  12. IO_KeyHoldCnt = 0;
  13. Gui_StrCenter(0,16,RED,BLUE,"KEY 测试程序",16,1);//居中显示
  14. Show_Str(20,56,BLUE,YELLOW,"KeyCode:",16,0);
  15. //循环
  16. while(1)
  17. {
  18. IO_KeyScan();
  19. if(KeyCode>0)
  20. {
  21. UartSendStr("pressed");
  22. LCD_ShowNum(100,56,KeyCode,2,16);
  23. }
  24. KeyCode=0;
  25. delay1ms(100);
  26. }
  27. }
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则