各位友友们,下面这个代码怎么让它按键检测更灵敏一点,我做的是一个时钟它现在的情况是在调时间状态下,有时候按一下就可以实现加减,有时候需要按两次,非常不灵敏,有没有什么办法?
#include "regx52.h"
#include "T0.h"
#include "LCD1602.h"
#include "key.h"
#include "Delay.h"
unsigned int count;
char s, min = 59, h = 23;
unsigned char keynum;
char n=1;
unsigned char change;
void main()
{
T0_init();
LCD_Init();
LCD_ShowString(1, 1, "Clock");
LCD_ShowNum(2, 1, h, 2);
LCD_ShowChar(2, 3, ':');
LCD_ShowNum(2, 4, min, 2);
LCD_ShowChar(2, 6, ':');
LCD_ShowNum(2, 7, s, 2);
while (1)
{
keynum = key();
if (keynum == 1) { n = -n; if (n == -1)TR0 = 0; else if (n == 1)TR0 = 1; }
if (keynum == 4) {change = (change + 1) % 3;}
if (n==-1)
{
if(change==1)
{
LCD_ShowNum(2, 4, min, 2);
Delay(20);
LCD_ShowString(2, 4, " ");
Delay(20);
if (keynum == 2) { min++; if (min >= 60)min = 0; }
else if (keynum == 3) { min--; if (min < 0)min = 59; }
}
else if (change == 0)
{
LCD_ShowNum(2, 7, s, 2);
Delay(20);
LCD_ShowString(2, 7, " ");
Delay(20);
if (keynum == 2) { s++; if (s >= 60)s = 0; }
else if (keynum == 3) { s--; if (s < 0)s = 59; }
}
else if (change == 2)
{
LCD_ShowNum(2, 1, h, 2);
Delay(20);
LCD_ShowString(2, 1, " ");
Delay(20);
if (keynum == 2) { h++; if (h >= 24)h = 0; }
else if (keynum == 3) { h--; if (h < 0)h = 23; }
}
}
else
{
LCD_ShowNum(2, 1, h, 2);
LCD_ShowNum(2, 4, min, 2);
LCD_ShowNum(2, 7, s, 2);
}
}
}
void T0_stop() interrupt 1
{
TL0 = 0x18;
TH0 = 0xFC; TF0 = 0;
count++;
if (count >= 1000)
{
s++; count = 0;
if (s >= 60)
{
min++; s = 0;
if (min >= 60)
{
h++; min = 0;
if (h >= 24)
{
h = 0;
}
}
}
}
}
【以下回答由 GPT 生成】
问题分析和解决方案:
问题分析: 在给定的代码中,按键检测不够灵敏,有时需要按两次才能成功操作。这可能是由于按键的抖动或延迟导致的。为了提高按键检测的灵敏度,可以采取以下几个步骤:
解决方案:
#include "regx52.h"
#include "T0.h"
#include "LCD1602.h"
#include "key.h"
#include "Delay.h"
unsigned int count;
char s, min = 59, h = 23;
unsigned char keynum;
char n=1;
unsigned char change;
// 外部中断0服务例程
void ExternalInterrupt0() interrupt 0
{
keynum = key(); // 在中断中获取按键信号
}
void main()
{
T0_init();
LCD_Init();
LCD_ShowString(1, 1, "Clock");
LCD_ShowNum(2, 1, h, 2);
LCD_ShowChar(2, 3, ':');
LCD_ShowNum(2, 4, min, 2);
LCD_ShowChar(2, 6, ':');
LCD_ShowNum(2, 7, s, 2);
EX0 = 1; // 开启外部中断0
EA = 1; // 全局中断使能
while (1)
{
if (keynum == 1)
{
n = -n;
if (n == -1)
TR0 = 0;
else if (n == 1)
TR0 = 1;
}
if (keynum == 4)
{
change = (change + 1) % 3;
}
if (n == -1)
{
if(change==1)
{
LCD_ShowNum(2, 4, min, 2);
Delay(20);
LCD_ShowString(2, 4, " ");
Delay(20);
if (keynum == 2)
{
min++;
if (min >= 60)
min = 0;
}
else if (keynum == 3)
{
min--;
if (min < 0)
min = 59;
}
}
}
}
}
// 外部中断0服务例程
void ExternalInterrupt0() interrupt 0
{
// 按键消抖
Delay(20); // 根据实际情况调整延时时间
keynum = key(); // 在中断中获取按键信号
}
// 外部中断0服务例程
void ExternalInterrupt0() interrupt 0
{
// 按键消抖
Delay(10); // 减小延时时间以提高扫描频率
keynum = key(); // 在中断中获取按键信号
}
修改后的代码中,通过使用外部中断检测按键信号,并加入按键消抖处理和优化扫描频率,可以提高按键检测的灵敏度和响应速度。根据实际情况,可能需要根据具体硬件和需求进行调整。
【相关推荐】