基于STM32库函数编写的键盘扫描程序,根据键值触发相应的事件。
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
|
//按键端口初始化 void Key_Init(void){ GPIO_InitTypeDef GPIO_InitStructure; //开启按键端口(PA)的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入 GPIO_Init(GPIOB, &GPIO_InitStructure); } //扫描按键 int Key_Scan(void) { int Down_Value=0; /*检测是否有按键按下*/ if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8) == 0 ) { delay_ms(20); if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8) == 0 ) { if(k1_shortpress_happen==0) { k1_shortpress_happen = 1; key1_shortpress_Flag = 1; key1_timing=0; } if(k1_shortpress_happen==1) { if(key1_timing > 3000) { Down_Value = 2; //长按生效标志位 k1_shortpress_happen = 0; k1_LongPress_Flag=1; } } } } if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8)==1) { key1_shortpress_Flag = 0; if(k1_shortpress_happen==1) { k1_shortpress_happen = 0; if(k1_doublepress_happen==0) { k1_doublepress_happen = 1; key1_doublepress_Flag=1; key1_doublepress_timing = 0; } else { if(key1_doublepress_timing < 300) { k1_doublepress_happen = 0; Down_Value = 0; //短按生效标志位 } } } else if(k1_doublepress_happen == 1) { if(key1_doublepress_timing > 300) { if(k1_LongPress_Flag==1) { k1_LongPress_Flag=0; } else { Down_Value = 1; //双击生效标志位 } k1_doublepress_happen = 0; key1_doublepress_Flag = 0; } } else if(k1_longpress_happen==1) { k1_longpress_happen = 0; } } }
|
近期评论