如下为长按按键2秒让io口翻转,点亮LED或熄灭LED的代码,长按按键2秒LED灯会亮,此时不松手继续按住按键,又经过大约2秒,LED灯会熄灭?我已经在程序中设计了if(KeySta != backup)的判断,不清楚为什么一直按着按键会熄灭,我想实现按着按键不松手,LED应该常亮,松手后再按2秒,LED熄灭。
-----------------------------------------------------------------------------------key.c------------------------------------------------------------------------
#define _KEY_C
#include "Key.h"
#include "config.h"
bit KeySta = 1;
bit IsTiming = 0;
sbit PWR_key_det = P3^2;
sbit PWR_HOLD = P1^5;
unsigned long KeyDownTime = 0; //记录按键按下时间
void ConfigTimer0();
void KeyDriver();
void KeyScan();
void KeyDriver()
{
bit backup = 1;
if(KeyDownTime > 0 && !IsTiming)
{
if(KeyDownTime >= 1000)
{
if(KeySta != backup)
{
_nop_();
_nop_();
PWR_HOLD = ~PWR_HOLD; //按下按键2秒,PWR_HOLD状态取反
IsTiming = 1;
backup = KeySta;
}
}
}
}
void KeyScan() //按键扫描函数
{
static unsigned char keybuf = 0xFF;
keybuf = (keybuf <<1) |PWR_key_det;
if(keybuf == 0x00)
{
KeySta = 0;
KeyDownTime ++;//按键按下每次进入中断就加2
}
else if(keybuf == 0xFF)
{
KeySta = 1;
KeyDownTime = 0;
}
else
{}
}
void ConfigTimer0()
{
AUXR &= 0x7F; //2ms定时
TMOD &= 0xF0;
TH0 = 0xF8;
TL0 = 0xCD;
ET0 = 1; //使能T0中断
TR0 = 1; //启动T0
}
void TM0_Isr() interrupt 1
{
KeyScan();
if(IsTiming)
{
KeyDownTime = 0;
IsTiming = 0;
}
TH0 = 0xF8;
TL0 = 0xCD;
TF0 = 0;
}
#define _MAIN_C
#include "main.h"
#include "Battery.h"
#include "Key.h"
#include "GPIO.h"
#include "config.h"
#include "Uart.h"
-----------------------------------------------------------------------------------main.c------------------------------------------------------------------------
void main()
{
GPIO_Init();
UartInit(); //串口初始化
EA = 1; //打开总中断
ES = 1; //打开串口中断
ConfigTimer0(); //定时2ms
ConfigTimer1(); //定时2ms
UartSendStr("Uart Test !\r\n");
while (1)
{
KeyDriver(); //按键扫描
BatCheck();//电池插入扫描
if (rptr != wptr) //读写指针不等,说明有数据需要发送
{
UartSend(buffer[rptr++]);
rptr &= 0x0f;
}
}
}