我写的这个函数,是想要完成 按下一次对应按键时,LED 以 5Hz 频率闪烁 (代表进门)
,双击对应按键时,LED 以 2Hz 频率闪烁(代表出门),每个门
最多可以进入三次,超出进入上限时 LED 常亮 5s;这个任务,但是我发现我·按下按键后第一次能进门,第二次时就进不去了,试了好久也没改出来。求大佬帮帮
#include <REGX52.H>
void Timer01Init()
{
TMOD = 0x11; //令T0,T1的M1,M0分别为0,1.启用16定时器0,1,启用TL,TH
TL0 = 0xD8; //1ms,11.0592Hz
TH0 = 0xF0;
TL1 = 0xD8;
TH1 = 0xF0;
TF0 = 0; //溢出中断标志位,为1时向cpu请求中断;
TF1 = 0;
TR0 = 1; //先禁止定时器计数,按下按键才允许计数;1允许
TR1 = 1;
EA = 1; //总中断允许控制位;
ET0 = 1; //溢出中断允许位;
ET1 = 1;
PT0 = 1; //优先级;
}
#include <REGX52.H>
#include "Timer01Init.h"
#define red P1_0
//#define yellow P1_1
//#define blue P1_3
unsigned char A , C , LEDtime , GateNumr , GateNumy , GateNumb , sure , Gatered , Gateyellow , Gateblue ; //B;
unsigned char Mode ;
unsigned int counter ;
void main()
{
///////////////////////red
Timer01Init();
while(1)
{
if(P3_1 == 0) //这里有问题 :我不加 && Gatered == 1这个函数可以执行,我加上之后我没想明白为啥会运行不了。 //5Hz,进门
{
if(GateNumr < 3) //门只能进入三次
{
if(counter >= 100)
{
counter = 0;
red = !red;
LEDtime++;
}
if(LEDtime >= 6) //P1_2亮一个周期LEDtime会加两次,所以LEDtime不为3;
{
// LCD12864_show_string(1,0,"red");
LEDtime = 0;
GateNumr++;
TR1 = 0;
A = 0;
B = 0;
C = 0;
}
}else //进门超出三次常亮5秒
{
counter = 0;
while(counter <= 5000) //不是5秒?
{
red = 0 ;
}
red = 1;
GateNumr = 0;
counter = 0;
TR1 = 0;
}
}
if(C == 2) //2Hz, 出门
{
if(GateNumr <= 3)
{
// LCD12864_show_string(0,1,"KeyPress(P3_1)");
if(counter >= 250)
{
counter = 0;
red = !red;
LEDtime++;
}
if(LEDtime >= 6) //P1_2亮一个周期LEDtime会加两次,所以LEDtime不为3;
{
LEDtime = 0;
GateNumr--;
TR1 = 0;
A = 0;
B = 0;
C = 0;
}
}
}
Gatered = 0;
}
}
|