矩阵按键模块
//学习B站江科大自化协51单片机入门教程
视频讲解矩阵键盘按列扫描,不与蜂鸣器冲突
扫描第一列时候给P1口高电平(0xFF),然后给第一列低电平(P1_3=0;)
这时判断是第一列哪个按键按下即可
示例代码如下:
1. /** 2. * @brief 矩阵键盘读取按键键码 3. * @param 无 4. * @retval KeyNumber 按下按键的键码值 5. 如果按键按下不放,程序会停留在此函数,松手的一瞬间,返回按键键码,没有按键按下时, 返回0 6. */ 7. //采用逐列扫描,不与蜂鸣器冲突 8. unsigned char Matrixkey() 9. { 10. unsigned char Keynumber=0; 11. 12. 13. P1=0xFF;//P1按键全给高电平 14. P1_3=0;//再给P1_3一个低电平,扫描第一列 15. if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);Keynumber=1;} 16. if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);Keynumber=5;} 17. if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);Keynumber=9;} 18. if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);Keynumber=13;} 19. 20. P1=0xFF;//P1按键全给高电平 21. P1_2=0;//再给P1_2一个低电平,扫描第二列 22. if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);Keynumber=2;} 23. if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);Keynumber=6;} 24. if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);Keynumber=10;} 25. if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);Keynumber=14;} 26. 27. P1=0xFF;//P1按键全给高电平 28. P1_1=0;//扫描第三列 29. if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);Keynumber=3;} 30. if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);Keynumber=7;} 31. if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);Keynumber=11;} 32. if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);Keynumber=15;} 33. 34. P1=0xFF;//P1按键全给高电平 35. P1_0=0;//扫描第四列 36. if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);Keynumber=4;} 37. if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);Keynumber=8;} 38. if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);Keynumber=12;} 39. if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);Keynumber=16;} 40. 41. return Keynumber; 42. }
然后在main.c主函数定义一个全局变量,放在while(1)里调用即可
unsigned char KeyNum;//矩阵键盘返回值接口
1. #include <REGX52.H> 2. #include "Delay.h" 3. #include "LCD1602.h" 4. #include "Matrixkey.h" 5. 6. unsigned char KeyNum;//矩阵键盘返回值接口 7. 8. void main() 9. { 10. LCD_Init(); 11. LCD_ShowString(1,1,"MatrixKey:"); 12. while(1) 13. { 14. KeyNum = MatrixKey(); 15. if(KeyNum) 16. { 17. LCD_ShowNum(2,1,KeyNum,2); //在LCD1602上显示按键键码数值 18. } 19. 20. } 21. 22. }
延时函数封装起来了
函数如下:
1. #include "Delay.h" 2. //延时1ms函数 3. 4. void Delay(int xms) { //@11.0592MHz 5. unsigned char i, j; 6. while (xms--) { 7. i = 2; 8. j = 199; 9. do { 10. while (--j); 11. } while (--i); 12. } 13. }
函数比较少,可以不模块化,也可以把矩阵按键函数和延时函数都放在main.c里