YangHY 发表于 2025-12-25 21:27:46

这个动态显示对时间有要求:

YangHY 发表于 2025-12-25 21:28:47

接着看看怎么实现任务二?


实际上任务一容易把调用忽视了:


YangHY 发表于 2025-12-26 09:15:51

任务2:数码管显示"12345678"

首先确定一下任务调度里:

static TASK_COMPONENTS Task_Comps[]=
{
//状态计数周期函数
       
   {0,    1 ,1   ,   Seg_Task},      /* task 1 Period: 600ms */
// {0,1000,1000,   TIMECOUNT_Task},   /* task 1 Period: 600ms */
// {0,1000,1000,   PLED_40},   /* task 1 Period: 600ms */   
// {0,1000,1000,   SEG_PC},   /* task 1 Period: 600ms */   

};

YangHY 发表于 2025-12-26 09:18:13

先定义几个变量:

u8 Seg_no = 0;
u8 shi=0;
u8 fen=0;
u8 miao =0;

//下面这个是结构体数组执行函数,由结构体
//规定反复循环执行,执行次数、间隔详见结构体
//task.c中的static TASK_COMPONENTS Task_Comps[]

比较难理解的还是结构体数组执行函数

YangHY 发表于 2025-12-26 09:22:44

下面4行是任务二代码      ,显示12345678,
SEG_NUM是段码,~T_NUM 是位码,注意前面取反!


      Display_Seg(SEG_NUM,~T_NUM);   //数码管刷新段码和位码
      Seg_no++;
                if(Seg_no >7 )
                        Seg_no = 0;


这里是不用循环执行的,因为函数void Seg_Task(void)
是这样被调用的:


static TASK_COMPONENTS Task_Comps[]=
{
//状态计数周期函数
       
   {0,    1 ,1   ,   Seg_Task},      /* task 1 Period: 600ms */
// {0,1000,1000,   TIMECOUNT_Task},   /* task 1 Period: 600ms */
// {0,1000,1000,   PLED_40},   /* task 1 Period: 600ms */   
// {0,1000,1000,   SEG_PC},   /* task 1 Period: 600ms */   

};


结构体数组执行函数是1毫秒执行1次!

YangHY 发表于 2025-12-26 09:36:48

结果又出了点问题:

YangHY 发表于 2025-12-26 09:46:49

原来是SEG_NUM+1,是不到的
正确应该是SEG_NUM

是数组元素加1

YangHY 发表于 2025-12-26 09:59:30

调整好之后,任务2就完成了:

YangHY 发表于 2025-12-26 10:17:13

任务3:数码管显示“00-00-00”分别代表时分秒

每过1秒加1

刚才定义好了时shi分fen秒miao

先显示出来:


/*往下是任务三显示部分的代码                       
        u8 num = 0;
       
        if( Seg_no ==0 )                                                                //小时十位
        {
                num = shi/10;
                Display_Seg( SEG_NUM , ~T_NUM);                //数码管刷段码和位码
        }
        else if( Seg_no ==1 )                                                                //小时的个位
        {
                num = shi%10;
                Display_Seg( SEG_NUM , ~T_NUM);                //数码管刷段码和位码
        }       
        else if( Seg_no ==2 )                                                                //第一个横杠
        {
                Display_Seg( SEG_NUM , ~T_NUM);                     //数码管刷段码和位码
        }       
        else if( Seg_no ==3 )                                                              //分钟的十位
        {
                num = fen/10;
                Display_Seg( SEG_NUM , ~T_NUM);                //数码管刷段码和位码
        }
        else if( Seg_no ==4 )
        {
                num = fen%10;                                                      //分钟的个位
                Display_Seg( SEG_NUM , ~T_NUM);                //数码管刷段码和位码
        }       
        else if( Seg_no ==5 )                                                         // 第二个横杠
        {
                Display_Seg( SEG_NUM , ~T_NUM);                //数码管刷段码和位码
        }       
        else if( Seg_no ==6 )
        {
                num = miao/10;                                                   //秒的十位
                Display_Seg( SEG_NUM , ~T_NUM);                //数码管刷段码和位码
        }
        else if( Seg_no ==7 )
        {
                num = miao%10;                                                       //秒的个位
                Display_Seg( SEG_NUM , ~T_NUM);                //数码管刷段码和位码
        }       
        else
        {
               
        }
        Seg_no ++;
        if( Seg_no>7 )
                Seg_no=0;
往上是任务三显示部分的代码*/

YangHY 发表于 2025-12-26 10:28:26

编译链接下载:

页: 24 25 26 27 28 29 30 31 32 33 [34] 35 36 37 38 39 40 41 42 43
查看完整版本: 第一课 序言《AI8051U的特点》