要设计的显示任务需要完成的功能如下:
(1)、仪表上电自检后,“四个”数码管每隔500ms依次显示“1111”,“2222”,“3333”,“版本号”。
(2)、自检完成(2秒钟)后,四个数码管开始显示测量数据
(3)、用户按面板上的《编程》键后,四个数码管显示“待设置的参数值”,同时当前正编程的数码管位置开始闪烁
(4)、当编程状态时,用户按下面板上的《确认》键
(a).如果参数在合法的范围内,则保存当前参数值,然后自动将下一个待设置的参数值显示在数码管上;
(b).否则,当设置的参数值超出范围,则数码管显示“Err”,同时数码管持续1秒钟内都显示“Err”,1秒钟后,四个数码管重新将初始的参
数值显示在数码管上。
以下是最终程序框架:
一、规划消息队列传输协议
定义一个消息队列MSQ[10](10只是我打个比方的,要根据实际状态去设计),这个MSQ[10]既要传递AD采样值,也要传递按键值。那么我们规定:
MSQ[0]=1 ----表示有按键按下
MSQ[0]=2 ----表示有AD采样过来
--------------------------------------------------------------
在MSQ[0]=1时,
MSQ[1]=1:表示【编程键】,
MSQ[1]=2:表示【确认键】,
MSQ[1]=3:表示【上键】,
MSQ[1]=4:表示【下键】,
MSQ[1]=5:表示【移位键】
在MSQ[0] = 2时,
MSQ[1] = 测量数据高字节
MSQ[2] = 测量数据低字节
--------------------------------------------------------------
二、规划任务
规划3个任务:
1、AD采集任务 ---> 周期性任务,每隔200毫秒执行一次,采样完成,给数码管显示任务发送消息队列
2、按键任务 ---> 周期性任务,每隔50毫秒执行一次,如果采集到按键按下,给数码管显示任务发送消息队列
3、数码管显示任务 ---->等待消息队列任务
三、具体任务代码
1、第一个任务---AD采样任务
TASKAD
{
while(1)
{
采集AD值;
if (采集到采样值)
{
MSQ[0]=2 //因为我们规定MSQ[0]=2 表示有新AD采样
MSQ[1]=AD采样值的高字节 //这个值具体参照你自己设定的协议来
MSQ[2]=AD采样值的低字节
MSQPOST……//发送消息队列
}
延时节拍(200毫秒)
}
}
第二个任务---扫键任务
TASKKEY
{
while(1)
{
扫描按键;
if(有按键按下)
{
//要把按键值打包到MSQ里面去,如
MSQ[0]=1 //因为我们规定MSQ[0]=1 表示有按键按下
MSQ[1]=按键代码 //这个值具体参照你自己设定的协议来
MSQPOST……//发送消息队列
}
延时节拍50毫秒;
}
}
第三个任务----数码管显示任务
TASKDISP
{
uint8_t status = 0; //0=上电默认为测量状态 1= 编程模式
uint8_t no;//参数号
uint8_t bit;//数码管位号
显示1111,延时节拍500毫秒
显示2222,延时节拍500毫秒
显示3333,延时节拍500毫秒
显示4444,延时节拍500毫秒
显示版本号,延时节拍2秒
while(1)
{
限时等待接收消息队列消息
if (收到消息队列消息数据)
{
if(MSQ[0]==1) //按键按下消息
{
switch(MSQ[1])//解析各个按键,然后根据各个按键进行操作
{
case 1:编程模式
if (status ==0)
{
status = 1;//进入编程模式
no = 1;//参数号=1
bit=4;//最右边1个数码管编程
发出最右边1个数码管开始闪烁的命令
取出第1个参数号对应的数值,将该数值显示到数码管
}
else
status=0;//退出编程模式,返回测量状态
break;
case 2:【确认键】
if (status ==1)
{
检查参数值是否合法;
if (合法)
{
存参数
数码管显示OK;
延时节拍1秒
no++;//参数号+1
bit=4;//最右边1个数码管编程
取出no参数号对应的数值,将该数值显示到数码管
}
else
{
数码管显示ERROR;
延时节拍1秒
取出第no个参数号对应的数值,将该数值显示到数码管
}
break;
case 3: 【上键】
if (status ==1)
{
bit位对应的数码管上的数字+1
if (bit位对应的数码管上的数字 >9)
bit位对应的数码管上的数字=0
将该数值显示到数码管
}
break;
case 4: 【下键】
if (status ==1)
{
bit位对应的数码管上的数字-1
if (bit位对应的数码管上的数字 < 0)
bit位对应的数码管上的数字=9
将该数值显示到数码管
}
break;
case 5:【移位键】
if (status ==1)
{
bit-1; //左移一位数码管
if (bit <= 0)
bit=4
发出前一个数码管开始闪烁命令
}
break;
default:
break;
}
}
else if(MSQ[0]==2) //ad采样消息
{
读取AD采样数据
if (status ==0)//在测量状态
显示AD采样数据到数码管
}
}//if (收到消息队列消息数据)
确实RTOS编程模式和前后台编程模式差别太大啦!要想顺利的从前后台编程模式转到RTOS模式编程需要大量的实践呀!