|
网上获得一个多击按键程序,理论上可以响应任意次多击,烧进单片机后在实验板上运行,一两次多击可以成功识别,可是8次多击就不能识别了,想了好久也想不出问题出在哪里?请各位高人指导迷津!
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit LED0 = P1^0;
sbit LED1 = P1^1;
sbit LED2 = P1^2;
sbit KEY1 = P3^2;
uint count = 0,ClickFlag = 0,ClickFlagCount = 0,LongClickFlag = 0;
uchar i = 0,Click = 0;
uchar keynum = 0;
uchar ucLedMode;
typedef struct{
uchar bBkpGpio; //原例程中为:bit bBkpGpio
uchar ucPushNum;
uint usPopCnt;
uchar ucScaleCnt;
uchar ucNum;
}Key_Typedef;
Key_Typedef stKey;
bit keyscan(void)
{
bit bThisGpio = 0;
bit bRtn = 0;
if (++stKey.ucScaleCnt >= 10)
{
stKey.ucScaleCnt = 0;
bThisGpio = KEY1;
if (bThisGpio)
{
if (++stKey.usPopCnt >= 50)
{
stKey.ucNum = stKey.ucPushNum;
stKey.ucPushNum = 0;
bRtn = 1;
}
}
if (bThisGpio != stKey.bBkpGpio)
{
if (!bThisGpio)
{
stKey.ucPushNum++;
stKey.usPopCnt = 0;
}
stKey.bBkpGpio = bThisGpio;
}
}
return bRtn;
}
void main()
{
EA = 1; //使能总中断
TMOD = 0x01; //设置T0为模式1
TH0 = 0xFC; //为T0赋初值0xFC67,定时1ms
TL0 = 0x67;
ET0 = 1; //使能T0中断
TR0 = 1; //启动T0
while (1)
{
if(ucLedMode==1)
LED0 = ~LED0;
if(ucLedMode==2)
LED1 = ~LED1;
if(ucLedMode==8)
LED2 = ~LED2;
}
}
/* 定时器0中断服务函数 */
void InterruptTimer0() interrupt 1
{
TH0 = 0xFC; //重新加载初值
TL0 = 0x67;
if (keyscan())
{
ucLedMode = stKey.ucNum;
}
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|