烧录进单片机后,按下按键无法加减时间,led灯正常闪烁。功能要求如下:用定时器实现准确的延时,延时到后点亮或熄灭一盏灯,然 后通过两个按键(增、 减) 改变延时长短。比如:刚开始的时候点
亮 1s 后熄灭 1s,当按下“增”按键后,点亮 1.5s,然后熄灭 1.5s, 再点亮 1.5s,如此循环。当按下“减”按键后,点亮 0.5s,然后 熄灭 0.5s, 再点亮 0.5s,如此循环。
以下是单片机代码,不知道是否合理,出现了按下按键,时间无法加和减
#include <reg52.h>
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
sbit KEY1 = P2^4;
sbit KEY2 = P2^5;
sbit LED = P0^0;
unsigned int i =1000 ; //定时1s
void delay();
void main()
{
bit keybuf1 = 1; //按键值暂存,临时保存按键的扫描值
bit keybuf2 = 1;
bit backup = 1; //按键值备份,保存前一次的扫描值
unsigned int i =1000 ; //定时1s
ENLED = 0; //选择LED进行显示
ADDR3 = 1;
ADDR2 = 1;
ADDR1 = 1;
ADDR0 = 0;
TMOD=0X01;
TH0=0XFC;//赋初值使定时时间为1ms
TL0=0X18;
EA=1; //打开总中断
ET0=1;//打开定时器中断
TR0=1;//打开定时器
P2 = 0xF7; //P2.3置0,即KeyOut1输出低电平
LED = 0;
while (1)
{
keybuf1 = KEY1; //把当前扫描值暂存
if (keybuf1 != backup) //当前值与前次值不相等说明此时按键有动作
{
delay(); //延时大约10ms
if (keybuf1 == KEY1) //判断扫描值有没有发生改变,即按键抖动
{
if (backup == 0) //如果前次值为0,则说明当前是弹起动作
{
i = i+500; //
}
backup = keybuf1; //更新备份为当前值,以备进行下次比较
}
}
keybuf2 = KEY2; //把当前扫描值暂存
if (keybuf2 != backup) //当前值与前次值不相等说明此时按键有动作
{
delay(); //延时大约10ms
if (keybuf2 == KEY2) //判断扫描值有没有发生改变,即按键抖动
{
if (backup == 0) //如果前次值为0,则说明当前是弹起动作
{
i = i-500; //
}
backup = keybuf2; //更新备份为当前值,以备进行下次比较
}
}
}
}
/* 软件延时函数,延时约10ms */
void delay()
{
unsigned int i = 1000;
while (i--);
}
/******中断子程序*******/
void timer0() interrupt 1
{
static int cnt;
TH0=0XFC; //重新赋初值
TL0=0X18;
cnt++;
if(cnt >= i)
{
cnt = 0;
LED = ~LED;
}
}
|