先定义u16 Count_ms = {0,0,0}; //3个记时变量
接着在中断函数里:
void Timer0_Isr(void) interrupt 1 //1毫秒执行一次
{
for( i=0:i<3:i++)
{
Count_ns ++;
}
}
if ( Count_ms>=300)
{
Count_ms=0;
Statel =!Statel;
P00= Statel;
}
按这个模版,就好解决600ms,900ms的任务了把?
今天的第二个任务是:
流水灯就是这样:
低位 高位
LED0
01111111
10111111
11011111
11101111
11110111
11111011
11111101
11111110
0是亮,1是灭
搞个反相的数组:
u8 State={0x01,0x02, 0x04, 0x08, x10, 0x20,0x40, 0x80};
到用的时候取反就OK了
先定义变量:
u8 Run_State = 0;//运行状态
u8 nun+0:
//ul6 Count_300=0//
//ul6 Count_600=0
//ul6 Count_900 = 0;
u16 Count_ns={0,0,0}://三个计时变量
在主循环里加上:
if(Count_ms>=500) //500ms执行一次
{
Count_ms= 0:
P0=~State: //num 取值0-7,~的意思是按位取反
num++;
}
if(num>7)
num=0;
我们现在有试验箱了,就看看效果:
编译连接下载:
接着看任务三:
注意按键松开检测,就不能用while 啦:
按键松开检测,以前是这样:
P =~State: //num 取值0-7
if(P32 == 0)
{
Delay10ms ():
if( P32 ==0)
{
while(P32 ==0)
num++;
}
}
程序会卡死在while( P32 == 0):这里
如果多一个任务,就没人干活啦
加个打印任务:
if(Count_ns>1000) //1000ms执行一次
{
Count_ns= 0;
printf("Ai8051U\r\n");
}
结果程序会卡死在while( P32 == 0):这里
就没人去打印啦
编译连接下载,看现象:
持续按下按键:
打印动作就不执行啦,卡在while语句!
怎么解决这个问题:
先仔细分析按键的过程:
检加按键连续按下。统计计数变量++,只要松开一下,计数清0,计数累积到50ms的时候判定为按下。
用次数代替while ,才能解决这个问题!
程序如下:
ul6 Key_Vol = 0;//按键按下持续时间检测变量
if(Count_ms>=10)//10ms执行一次,每50ms确认按下
{
Count_ns=0;
if(P32==0) //按键按下
{
Key Vol++;
if(Key_Vol--5) //按键按下
{
num++;
}
else
{
Key_Vol-0;
}
}