▼点击下方名片,关注公众号,获取更多精彩内容▼
欢迎关注【玩转单片机与嵌入式】公众号,回复关键字获取更多免费视频和资料
回复【加群】,【单片机】、【STM32】、【硬件知识】、【硬件设计】、【经典电路】、【论文】、【毕业设计】、【3D封装库】、【PCB】、【电容】、【TVS】、【阻抗匹配】、【资料】、【终端电阻】、【Keil】、【485】、【CAN】、【振荡器】、[USBCAN]、【PCB】、【智能手环】、【智能家居】、【智能小车】、【555】、【I2C】、【华为】、【中兴】,等……
一:旧方案
sbit KEY = P1^3;
///按键读取函数
uint8_t GetKey(void)
{
if(KEY == 1)
{
DelayMs(20); //延时消抖
if(KEY == 1)
{
return 1;
}
else
{
return 0;
}
}
else
{
return 0;
}
}
推荐方案
// 定义开关信号结构体
typedef struct {
bool lastState; // 上次开关信号状态
bool currentState; // 当前开关信号状态
bool validState; // 有效的开关信号状态
int debounceDelayCounter; // 开关信号消抖计数器
} DebouncedSwitch;
// 初始化开关信号结构体
void initializeSwitch(DebouncedSwitch* switchObj) {
switchObj->lastState = false;
switchObj->currentState = false;
switchObj->validState = false;
switchObj->debounceDelayCounter = 0;
}
// 模拟读取开关信号状态的函数
bool readSwitchState() {
// 在这里替换为实际的开关信号读取代码
// 返回开关信号的当前状态(true表示开,false表示关)
return false;
}
// 处理开关信号消抖的函数
void debounceSwitch(DebouncedSwitch* switchObj, int debounceTime) {
// 读取当前开关信号状态
switchObj->currentState = readSwitchState();
// 如果当前状态与上次状态不同,重置计数器并更新上次状态
if (switchObj->currentState != switchObj->lastState) {
switchObj->debounceDelayCounter = 0;
} else {
// 如果状态相同,增加计数器值
switchObj->debounceDelayCounter++;
}
// 如果计数器达到指定的消抖时间,表示开关信号状态稳定
if (switchObj->debounceDelayCounter >= (debounceTime / 10)) {
// 如果当前状态与 validState 不同,表示发生了有效的状态变化
if (switchObj->currentState != switchObj->validState) {
switchObj->validState = switchObj->currentState;
}
}
// 更新上次状态
switchObj->lastState = switchObj->currentState;
}
int main() {
// 创建一个开关信号的DebouncedSwitch结构体
DebouncedSwitch switchObj;
initializeSwitch(&switchObj);
while (1) {
debounceSwitch(&switchObj, 100); // 设置消抖时间为100毫秒
if (switchObj.validState) {
if (switchObj.validState) {
// 执行开关信号为开的操作
printf("开关信号为开\n");
} else {
// 执行开关信号为关的操作
printf("开关信号为关\n");
}
}
// 在这里可以添加其他需要执行的代码
// 模拟延时或等待开关信号状态变化
// 这里使用usleep函数来模拟10毫秒的延时
// 实际上,你需要根据你的硬件和操作系统来等待开关信号状态变化
usleep(10000); // 10毫秒
}
return 0;
}
DebouncedSwitch switchObj_key1;
DebouncedSwitch switchObj_key2;
//其他代码
debounceSwitch(&switchObj_key1, 100);
debounceSwitch(&switchObj_key2, 50);
总结
END
扫描上方二维码加群,回复【加群】或扫码加我好友,限时免费进入技术交流群。
【专辑】器件选型
【专辑】单片机
【专辑】经验分享
【专辑】STM32
【专辑】硬件设计
【专辑】软件设计
【专辑】开源项目
【专辑】职业发展
感谢大家阅读,如果喜欢
请点赞和“在看”吧,或者分享到朋友圈。
点击跳转到原文,限时优惠加入我们的知识星球(加好友获取免费券)