51_矩阵键盘
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 | /*************************************************************************** * 实 验 名 : 矩阵键盘显示试验 * 实验说明 : 静态数码管显示矩阵键盘键值 * 注 意 : *******************************************************************************/ #include<reg51.h> //--定义使用的IO口--// #define GPIO_DIG P0 #define GPIO_KEY P1 //--定义全局变量--// unsigned char code DIG_CODE[17]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码 unsigned char KeyValue; //用来存放读取到的键值 //--声明全局函数--// void Delay10ms(unsigned int c); //延时10ms void KeyDown(); //检测按键函数 /******************************************************************************* * 函 数 名 : main * 函数功能 : 主函数 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void main( void ) { while (1) { KeyDown(); GPIO_DIG = ~DIG_CODE[KeyValue]; } } /******************************************************************************* * 函 数 名 : KeyDown * 函数功能 : 检测有按键按下并读取键值 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void KeyDown( void ) { char a = 0; GPIO_KEY=0x0f; if (GPIO_KEY!=0x0f) //读取按键是否按下 { Delay10ms(1); //延时10ms进行消抖 if (GPIO_KEY!=0x0f) //再次检测键盘是否按下 { //测试列 GPIO_KEY=0X0F; switch (GPIO_KEY) { case (0X07): KeyValue=0; break ; case (0X0b): KeyValue=1; break ; case (0X0d): KeyValue=2; break ; case (0X0e): KeyValue=3; break ; } //测试行 GPIO_KEY=0XF0; switch (GPIO_KEY) { case (0X70): KeyValue=KeyValue; break ; case (0Xb0): KeyValue=KeyValue+4; break ; case (0Xd0): KeyValue=KeyValue+8; break ; case (0Xe0): KeyValue=KeyValue+12; break ; } while ((a<50) && (GPIO_KEY!=0xf0)) //检测按键松手检测 { Delay10ms(1); a++; } } } } /******************************************************************************* * 函 数 名 : Delay10ms * 函数功能 : 延时函数,延时10ms * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void Delay10ms(unsigned int c) //误差 0us { unsigned char a, b; //--c已经在传递过来的时候已经赋值了,所以在for语句第一句就不用赋值了--// for (;c>0;c--) { for (b=38;b>0;b--) { for (a=130;a>0;a--); } } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!