YangHY 发表于 2026-1-13 21:12:00

先定义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的任务了把?

YangHY 发表于 2026-1-13 21:13:24

今天的第二个任务是:

YangHY 发表于 2026-1-13 21:34:12

流水灯就是这样:

低位   高位
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;




YangHY 发表于 2026-1-13 21:35:49

我们现在有试验箱了,就看看效果:

编译连接下载:

YangHY 发表于 2026-1-13 21:41:19

接着看任务三:

注意按键松开检测,就不能用while 啦:

YangHY 发表于 2026-1-13 21:51:59

按键松开检测,以前是这样:

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):这里

就没人去打印啦

YangHY 发表于 2026-1-13 21:53:36

编译连接下载,看现象:

持续按下按键:


打印动作就不执行啦,卡在while语句!

YangHY 发表于 2026-1-13 21:55:35

怎么解决这个问题:

YangHY 发表于 2026-1-13 21:56:23

先仔细分析按键的过程:

YangHY 发表于 2026-1-13 22:06:18

检加按键连续按下。统计计数变量++,只要松开一下,计数清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;
   }
}
页: 53 54 55 56 57 58 59 60 61 62 [63] 64 65 66 67 68 69 70 71 72
查看完整版本: 第一课 序言《AI8051U的特点》