查看原理图,看独立按键分别接的是那些引脚
按键消抖
- 软件延时法:在按键按下时,使用软件延时一段时间,例如10毫秒,然后再检测按键是否还处于按下状态,如果是,则认为按键有效。这种方法简单易行,但会浪费一定的处理器时间,同时需要根据实际情况调整延时时间。
- 硬件滤波法:在按键输入引脚上添加RC滤波电路,可以有效地去除按键信号上的瞬间噪声。这种方法对于高频噪声的去除效果较好,但需要一定的电路设计能力。
- 程序消抖法:在程序中记录按键前后两次的状态,如果两次状态不同,则认为按键有效。这种方法可以根据需要调整检测时间,消抖效果较好,但需要额外的程序设计。
STC8H
实现
当用户按下,或者松开按键时,捕获到这个事件。将事件通过串口发出来
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
| #include "Config.h" #include "STC8G_H_Delay.h" #include "STC8G_H_GPIO.h" #include "STC8G_H_UART.h" #include "STC8G_H_NVIC.h" #include "STC8G_H_Switch.h"
#define KEY1 P51 #define KEY2 P52 #define KEY3 P53 #define KEY4 P54
u8 state = 0x0f;
#define IS_UP(state, i) = ((a & (1 << i)) > 0) #define IS_DOWM(state, i) = ((a & (1 << i)) <= 0)
#define SET_UP(state, i) = state |= (1 << i) #define SET_DOWN(state, i) = state &= ~(1 << i)
u8 get_kay(int i) { if(i == 0) return KAY1; else if(i == 1) return KAY2; else if(i == 2) return KAY3; else if(i == 3) return KAY4; }
void GPIO_Comfig(void) { GPIO_InitTypeDef GPIO_Init; GPIO_Init.Mode = GPIO_PullUp; GPIO_Init.Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4; GPIO_Inilize(GPIO_P5, &GPIO_Init); }
void UART_Config(void) { COMx_InitDefine UART_Init; UART_Init.UART_Mode = UART_8bit_BRTx; UART_Init.UART_BRT_Use = BRT_Timer1; UART_Init.UART_BaudRate = 115200ul; UART_Init.Morecommunicate = DISABLE; UART_Init.UART_RxEnable = ENABLE; UART_Init.BaudRateDouble = DISABLE; }
void mian(void) { int i; EA = 1 UART_Config(); GPIO_Comfig(); while(true) { for(i = 0; i < 4; i++) { if( (get_kay() == 0) && (IS_UP(state, i))) { SET_DOWN(state, i) PrintString1("按钮%d被按下了\n", i); } else if ((get_kay() == 0) && (IS_DOWM(stat, i))) { SET_UP(state, i) PrintString1("按钮%d被松开了\n", i); } } } }
|