这个动态显示对时间有要求:
接着看看怎么实现任务二?
实际上任务一容易把调用忽视了:
任务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 */
};
先定义几个变量:
u8 Seg_no = 0;
u8 shi=0;
u8 fen=0;
u8 miao =0;
//下面这个是结构体数组执行函数,由结构体
//规定反复循环执行,执行次数、间隔详见结构体
//task.c中的static TASK_COMPONENTS Task_Comps[]
比较难理解的还是结构体数组执行函数
下面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次!
结果又出了点问题:
原来是SEG_NUM+1,是不到的
正确应该是SEG_NUM
是数组元素加1
调整好之后,任务2就完成了:
任务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;
往上是任务三显示部分的代码*/
编译链接下载: