打印

这样写按键控制数码管动态显示,能不能称作“任务调度”

[复制链接]
2791|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
renwocai|  楼主 | 2012-10-15 15:20 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
以下是电路,我要的功能很简单,按键第按一次,数码管后两位显示加1,到100后回头,看这样写能不能称作“任务调度”,如果是,那么这种方式比较好处理,因为程序执行的间隔时间都是固定的,但对于有些交互式外设,如AD,DA,LCD,必须从对方读取数据,时间间隔是离散的,应该怎样安排任务? 以上请教!




#include <reg51.h>
#define uchar unsigned char
uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar shu=85,count;
bit flag;
sbit kb=P3^4;



void sumaguan()
{
        static uchar i=0;
        i++;
        P0=0XFF;
        P2=~(1<<(i-1));
        if(i<3)
                P0=0XC0;
        else if(i==3)
                P0=tab[shu/10];
        else if(i==4)
                {
                        P0=tab[shu%10];
                        i=0;
                }
}
void anjianchuli()
{
        static uchar zhuangtai=0;
        switch(zhuangtai)
                {
                        case 0:
                                {
                                        if(kb==0)
                                                zhuangtai++;
                                };break;
                        case 1:
                                {
                                        if(kb==0)
                                                zhuangtai++;
                                        else
                                                zhuangtai--;

                                };break;
                        case 2:
                                {
                                        if(kb==0)
                                                {
                                                        zhuangtai++;
                                                        shu++;
                                                        if(shu==100)
                                                                shu=0;
                                                }
                                        else
                                                        zhuangtai--;
                                };break;
                        case 3:
                                {
                                        if(kb==1)
                                                zhuangtai=0;
                                };break;
                }
        }



main()
{
        TMOD = 0x01;
    TH0 = 0x0E8;
    TL0 = 0x90;
    EA = 1;
    ET0 = 1;
    TR0 = 1;
        while(1)
        {
                if(flag==1)
                {
                        flag=0;
                        sumaguan();
                }
                if(count>=3)
                {
                        anjianchuli();
                        count=0;
                }
        }
       
}
void timer0() interrupt 1
{
        flag=1;
        count++;
    TH0 = 0x0E8;
    TL0 = 0x90;
}

QQ截图20121015141527.png (12.36 KB )

QQ截图20121015141527.png

相关帖子

沙发
ayb_ice| | 2012-10-15 15:24 | 只看该作者
差不多吧

使用特权

评论回复
板凳
renwocai|  楼主 | 2012-10-15 15:28 | 只看该作者
差不多吧
ayb_ice 发表于 2012-10-15 15:24


谢谢回复,如果是,那么这种方式比较好处理,因为程序执行的间隔时间都是固定的,但对于有些交互式外设,如AD,DA,LCD,I2C必须从对方读取数据,时间间隔是离散的,应该怎样安排任务? 以上请教!

使用特权

评论回复
地板
ayb_ice| | 2012-10-15 15:59 | 只看该作者
建议一个主循环10MS,如果程序没有执行到10MS,等待到10MS,开始下一循环,显示等任务在定时中断中完成,一个周期将所有任务检查处理一遍,当然有些任务可以几个循环才处理一次。。。

使用特权

评论回复
5
renwocai|  楼主 | 2012-10-15 16:18 | 只看该作者
建议一个主循环10MS,如果程序没有执行到10MS,等待到10MS,开始下一循环,显示等任务在定时中断中完成,一个周期将所有任务检查处理一遍,当然有些任务可以几个循环才处理一次。。。 ...
ayb_ice 发表于 2012-10-15 15:59


我很笨,能否来段简单代码,谢谢。

使用特权

评论回复
6
ayb_ice| | 2012-10-15 16:47 | 只看该作者
本帖最后由 ayb_ice 于 2012-10-15 16:53 编辑

void main(void)
{
    mcu_init();
    while(1)
    {
        task_a();
        if(++flag_x == 3){
            flag_x = 0;
            task_b();
        }
        if(++flag_y == 100){
            flag_y = 0;
            task_c();
        }
        ...

        while(!flag_10ms);
        flag_10ms = 0;
    }
}
void isr_t0(void) interrupt 1
{
    reload_t0(10MS);
    flag_10ms = 1;
}
void isr_other(void) interrupt x
{
    .....
}

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
ocon + 2
7
renwocai|  楼主 | 2012-10-15 17:01 | 只看该作者
谢谢,我领会下。

使用特权

评论回复
8
coody| | 2012-10-16 08:40 | 只看该作者
状态机

使用特权

评论回复
9
renwocai|  楼主 | 2012-10-16 11:30 | 只看该作者
void main(void)
{
    mcu_init();
    while(1)
    {
        task_a();
        if(++flag_x == 3){
            flag_x = 0;
            task_b();
        }
        if(++flag_y == 100){
            flag_ ...
ayb_ice 发表于 2012-10-15 16:47




这个方式的运行实质跟我的写法是一样的哦,主要针对有些任务运行时间超过定时器设定的时间间隔,这样可以保证每个任务都有机会运行到,但如果有的任务运行时间过长(比如我不用状态机处理按键,那就一定要等到按键抬起才能扫描数码管,结果又不好了。

使用特权

评论回复
10
hjs1618| | 2012-10-16 11:37 | 只看该作者
建议一个周期10MS或5MS用于按键扫描或其他定时处理,其余时间处理其他函数。不用一直等        while(!flag_10ms);
        flag_10ms = 0;

使用特权

评论回复
11
ayb_ice| | 2012-10-16 11:44 | 只看该作者
“比如我不用状态机处理按键,那就一定要等到按键抬起才能扫描数码管,结果又不好了。”

一定要禁止死等程序

使用特权

评论回复
12
ayb_ice| | 2012-10-16 11:45 | 只看该作者
“主要针对有些任务运行时间超过定时器设定的时间间隔”

这样的任务一定要分时间片运行

使用特权

评论回复
13
xuxikfg| | 2012-10-16 18:53 | 只看该作者
果断留名。。

使用特权

评论回复
14
gx_huang| | 2012-10-16 20:40 | 只看该作者
貌似很高级的方法。
其实是比较笨的方法,肯定是操作系统之类的书看多了。

最基本的教材里的例子其实最实用:
定时器定时中断,每来一次中断,显示一个数码管。
主程序里只要对需要显示 的内容赋值就可以了。

使用特权

评论回复
15
renwocai|  楼主 | 2012-10-19 10:47 | 只看该作者
貌似很高级的方法。
其实是比较笨的方法,肯定是操作系统之类的书看多了。

最基本的教材里的例子其实最实用:
定时器定时中断,每来一次中断,显示一个数码管。
主程序里只要对需要显示 的内容赋值就可以了。 ...
gx_huang 发表于 2012-10-16 20:40



可能对这个任务来说的确是这样,这里我只想请教一种方法,一种思想

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

173

帖子

1

粉丝