定时器按键消抖代码解释
时间: 2024-06-11 19:01:56 浏览: 16
以下是一个定时器按键消抖的代码解释:
```c
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar keyvalue; // 存储按键状态
uchar keylock; // 锁定标志位
uchar keynum; // 消抖计数器
/* 定时器0初始化函数 */
void Init_Timer0()
{
TMOD = 0x01; // 定时器0工作模式1
TH0 = 0x3C; // 定时器初值,65536-50000=15536=3CB0H
TL0 = 0xB0;
ET0 = 1; // 开启定时器0中断
TR0 = 1; // 启动定时器0
}
/* 定时器0中断处理函数 */
void Timer0_isr() interrupt 1
{
TH0 = 0x3C;
TL0 = 0xB0; // 重新给定时器赋初值
if (keynum < 250) // 如果按键按下且持续时间小于10ms
{
keynum++; // 计数器加1
if (keynum >= 200) // 经过一段时间后
{
keylock = 0; // 解锁按键
if (keynum == 250) // 如果按键最后一次还是按下状态
{
keyvalue = 1; // 表示按键按下
}
}
}
}
/* 按键扫描函数 */
uchar Key_Scan()
{
uchar temp;
if (keylock == 0) // 如果按键没有被锁定
{
temp = P1 & 0x0F; // 读取按键状态
if (temp != 0x0F) // 如果有按键按下
{
keynum = 0; // 清零计数器
keylock = 1; // 锁定按键
}
}
else // 如果按键被锁定
{
temp = P1 & 0x0F; // 读取按键状态
if (temp == 0x0F) // 如果按键已经松开
{
keylock = 0; // 解锁按键
if (keynum < 250) // 如果按键按下时间小于10ms
{
keyvalue = 0; // 表示按键松开
}
else // 如果按键按下时间大于10ms
{
keyvalue = 2; // 表示按键无效
}
}
}
return keyvalue;
}
/* 主函数 */
void main()
{
Init_Timer0(); // 初始化定时器0
while (1)
{
if (Key_Scan()) // 如果有按键按下
{
// 处理按键事件
}
}
}
```
这段代码中,定时器0被初始化为工作模式1,计数器的初值被设为65536-50000=15536=3CB0H,也就是10ms。当按键按下时,按键状态会被存储在keyvalue变量中,然后启动定时器0,并在定时器0中断处理函数中检查按键状态和持续时间,从而消除按键抖动。如果按键被检测到了,Key_Scan函数会返回按键状态,然后在主函数中处理按键事件。
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)