使用STC8g1k08芯片编写一个简单的长按按键2秒,对应P15 IO口电平翻转的程序,现在存在如下2个问题:
问题1:按下按键2秒钟后,led灯会高亮,松手后led灯才会熄灭(即:当前led的电平为0,长按按键2秒后led会变亮,当前led电平为1,led点亮,长按按键2秒后,led亮度增加,不松手一直亮,按键松手led熄灭),不清楚为什么led到2秒为什么会高亮?
问题2:按键按下2秒后,led高亮后马上松手,led未马上亮或灭,会保持之前状态。
#include "main.h"
extern char wptr;
extern char rptr;
extern char buffer[16];
void main()
{
GPIO_Init();
P15 = 0;
P32 = 1;
UartInit(); //串口初始化
EA = 1; //打开总中断
ES = 1; //打开串口中断
ConfigTimer0(); //定时2ms
UartSendStr("Uart Test !\r\n");
while (1)
{
KeyDriver(); //按键扫描
if (rptr != wptr) //读写指针不等,说明有数据需要发送
{
UartSend(buffer[rptr++]);
rptr &= 0x0f;
}
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
led.c:
#include "Key.h"
sbit PWR_key_det = P3^2;
sbit PWR_HOLD = P1^5;
void ConfigTimer0();
void KeyDriver();
void KeyScan();
unsigned long KeyDownTime = 0;
void KeyDriver()
{
if(KeyDownTime > 0)
{
if(KeyDownTime >= 1000)
{
_nop_();
_nop_();
PWR_HOLD = ~PWR_HOLD; //按下按键2秒,PWR_HOLD状态取反
}
}
}
void KeyScan() //按键扫描函数
{
static unsigned char keybuf = 0xFF;
keybuf = (keybuf <<1) |PWR_key_det;
if(keybuf == 0x00)
{
KeyDownTime += 1;//按键按下每次进入中断就加2
}
else if(keybuf == 0xFF)
{
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();
TH0 = 0xF8;
TL0 = 0xCD;
TF0 = 0;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
GPIO.c
void GPIO_Init()
{
P1M0 = 0x00;
P1M1 = 0x00;
P3M0 = 0x00;
P3M1 = 0x00;
}