独立按键

查看原理图,看独立按键分别接的是那些引脚

按键消抖

  1. 软件延时法:在按键按下时,使用软件延时一段时间,例如10毫秒,然后再检测按键是否还处于按下状态,如果是,则认为按键有效。这种方法简单易行,但会浪费一定的处理器时间,同时需要根据实际情况调整延时时间。
  2. 硬件滤波法:在按键输入引脚上添加RC滤波电路,可以有效地去除按键信号上的瞬间噪声。这种方法对于高频噪声的去除效果较好,但需要一定的电路设计能力。
  3. 程序消抖法:在程序中记录按键前后两次的状态,如果两次状态不同,则认为按键有效。这种方法可以根据需要调整检测时间,消抖效果较好,但需要额外的程序设计。

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; // 0000 1111

// 按下/回弹 软件消抖
#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)

// 轮询四个按键 1~4
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;
}

// GPIO 配置
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);
}

// UART 配置
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))) {
// 将用于消抖的控制位置 0
SET_DOWN(state, i)
PrintString1("按钮%d被按下了\n", i);
} else if ((get_kay() == 0) && (IS_DOWM(stat, i))) {
// 将用于消抖的控制位置 1
SET_UP(state, i)
PrintString1("按钮%d被松开了\n", i);
}
}
}
}