DSP2833x实验_按键
按键原理:
按下\释放抖动时间 大约5~10ms;
消除抖动:
1. 硬件消抖。串联RC电路;
2.软件消抖。程序延时delay_ms(10),再采样;
按下扫描:(独立按键(直接判断线上高低电平)/矩阵键盘(行列线接GPIO))
矩阵键盘检测方法有多种,最常用的是行列扫描和线翻转法。
行列扫描法检测时, 先送一列为低电平, 其余几列全为高电平(此时我们确定了列数),然后立即轮流检测一次各行是否有低电平, 若检测到某一行为低电平(这时我们又确定了行数), 则我们便可确认当前被按下的键是哪一行哪一列的, 用同样方法轮流送各列一次低电平,再轮流检测一次各行是否变为低电平, 这样即可检测完所有的按键, 当有键被按下时便可判断出按下的键是哪一个键。 当然我们也可以将行线置低电平, 扫描列是否有低电平。 从而达到整个键盘的检测。
线翻转法,就是使所有行线为低电平时,检测所有列线是否有低电平,如果有, 就记录列线值;然后再翻转, 使所有列线都为低电平, 检测所有行线的值, 由于有按键按下,行线的值也会有变化, 记录行线的值。 从而就可以检测到全部按键。
硬件电路:
软件设计:
/* * key.c * * Created on: 2021年7月7日 * Author: Administrator */ #include "key.h" void KEY_Init(void) { EALLOW; GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 0; // GPIO GpioCtrlRegs.GPADIR.bit.GPIO12 = 0; // input GpioCtrlRegs.GPAPUD.bit.GPIO12 =0; GpioCtrlRegs.GPAMUX1.bit.GPIO13 = 0; // GPIO GpioCtrlRegs.GPADIR.bit.GPIO13 = 0; // input GpioCtrlRegs.GPAPUD.bit.GPIO13 =0; GpioCtrlRegs.GPAMUX1.bit.GPIO14 = 0; // GPIO GpioCtrlRegs.GPADIR.bit.GPIO14 = 0; // input GpioCtrlRegs.GPAPUD.bit.GPIO14 =0; GpioCtrlRegs.GPAMUX1.bit.GPIO15 = 0; // GPIO GpioCtrlRegs.GPADIR.bit.GPIO15 = 0; // input GpioCtrlRegs.GPAPUD.bit.GPIO15 =0; EDIS; } Uint16 KEY_Scan(Uint16 mode)//mode 0:不支持连按;1:支持连按 { static int key_up = 1;//按键按下/松开标志位 if(mode) key_up = 1; if(key_up&&(KEY_1 == 0 || KEY_2 == 0 || KEY_3 == 0 || KEY_4 == 0 )) { DELAY_US(10000);//延时10ms key_up = 0; if(KEY_1 == 0) return KEY1_PRESS; else if(KEY_2 == 0) return KEY2_PRESS; else if(KEY_3 == 0) return KEY3_PRESS; else if(KEY_4 == 0) return KEY4_PRESS; } else if(KEY_1 == 1 && KEY_2 == 1 && KEY_3 == 1 && KEY_4 == 1 ) key_up = 1; return 0; } //void main(void) //{ // InitSysCtrl(); // // LED_Init(); // KEY_Init(); // Uint16 key = 0; // while(1) // { // key = KEY_Scan(0); // switch(key) // { // case KEY1_PRESS:LED1_ON,LED4_OFF;break; // case KEY2_PRESS:LED2_ON,LED1_OFF;break; // case KEY3_PRESS:LED3_ON,LED2_OFF;break; // case KEY4_PRESS:LED4_ON,LED3_OFF;break; // default: LED5_ON,LED6_ON,LED7_ON,LED8_ON; // } // DELAY_US(100); // } // }
/* * key.h * * Created on: 2021年7月7日 * Author: Administrator */ #ifndef KEY_H_ #define KEY_H_ #include "DSP2833x_Device.h" // DSP2833x 头文件 #include "DSP2833x_Examples.h" // DSP2833x 例子相关头文件 void KEY_Init(void); Uint16 KEY_Scan(Uint16 mode); #define KEY1_PRESS 1 #define KEY2_PRESS 2 #define KEY3_PRESS 3 #define KEY4_PRESS 4 #define KEY_1 (GpioDataRegs.GPADAT.bit.GPIO12) #define KEY_2 (GpioDataRegs.GPADAT.bit.GPIO13) #define KEY_3 (GpioDataRegs.GPADAT.bit.GPIO14) #define KEY_4 (GpioDataRegs.GPADAT.bit.GPIO15) #endif /* KEY_H_ */