51单片机实现无延时按键扫描,按键按下为0,当连续监测到8个0的时候表示按键被按下,按下则LED闪烁否则则常亮,检测间隔2ms,共16ms,利用定时器0方式1实现,用c语言实现
时间: 2024-05-01 16:17:55 浏览: 73
好的,关于你的问题,以下是对应的C语言代码:
```c
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit BUTTON = P1^0; // 定义按键引脚
sbit LED = P1^1; // 定义LED引脚
uchar code KEYCODE[] = {0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F}; // 按键状态数组
uchar button_cnt = 0; // 按键计数器
void timer0_init() // 定时器0初始化函数
{
TMOD &= 0xF0; // 定时器0工作模式1
TH0 = 0xF8; // 定时器0的高8位赋初值
TL0 = 0xCC; // 定时器0的低8位赋初值
ET0 = 1; // 打开定时器0中断
TR0 = 1; // 启动定时器0
EA = 1; // 打开总中断开关
}
void timer0_isr() interrupt 1 // 定时器0中断服务程序
{
TH0 = 0xF8; // 定时器0的高8位赋初值
TL0 = 0xCC; // 定时器0的低8位赋初值
if(BUTTON == 0) // 如果检测到按键按下
{
button_cnt++; // 按键计数器加1
}
else
{
button_cnt = 0; // 按键计数器清零
LED = 1; // LED常亮
}
if(button_cnt >= 8) // 如果连续监测到8个0
{
button_cnt = 0; // 按键计数器清零
LED = ~LED; // LED闪烁
}
}
void main()
{
timer0_init(); // 定时器0初始化
while(1)
{
// 此处循环体为空即可
}
}
```
以上是代码,其中TIMER0的初值使用16进制设置为F8CC,因为这个值计算出来是50000,而timer0的最大值为65535,所以在2ms内计数到50000是没问题的,这样可以精确地控制检测间隔。在此仅做参考,仅供学习交流。
阅读全文