发新帖我要提问
12
返回列表
打印

同事遇到的难题,大家看看(上代码了,keil软仿真)。。。

[复制链接]
楼主: 渤海三叠浪
手机看帖
扫描二维码
随时随地手机跟帖
21
李富贵| | 2013-1-19 23:36 | 只看该作者 回帖奖励 |倒序浏览
今天晚上正在试着用iar visualstate这个状态机软件,想把你的要求用状态机实现,结果不幸的发现visualstate出来的代码也是基于rtos的。看来解决延迟和读键盘最简单的方案也就是rtos了。

使用特权

评论回复
评论
渤海三叠浪 2013-1-20 09:10 回复TA
大侠,很明显了,从应用者(同事)角度来说,我楼主位那个是最简单的方案,因为就一个函数。 当然,从开发者角度看,你那OS更简单。 
22
misra| | 2013-1-20 16:36 | 只看该作者
明月小厨 发表于 2013-1-19 16:41
状态机都不需要,直接进入;只有一层状态,没必要状态机;

典型的吹牛X患者

使用特权

评论回复
23
mohanwei| | 2013-1-20 19:15 | 只看该作者
本帖最后由 mohanwei 于 2013-1-20 19:17 编辑

既然是资源紧张,可以这样:
typedef enum
{
    KeyA=0,
    KeyB,
    KeyC,
    KeyD,
}KEY;
void FUN_A(KEY CurKey)
{
    #define MyKey KeyA //注册本流程的特定按键
    static KEY OldKey=0xFF;//初始化为一个不可能出现的键值
    static step = 0;//状态机
    if(MyKey == OldKey)
    {
        if(MyKey == CurKey)//继续本流程(之前已初始化)
        {
            ;
        }
        else//按下了其他按键,中断本流程:
        {
            OldKey = CurKey;//保存键值
            step = 0;
            return;
        }
    }
    else//开机,或运行过但已停止
    {
        if(MyKey == CurKey)//轮到本流程,先初始化(原文要求从头执行)
        {
            OldKey = CurKey;//保存键值
            timer_s = 0;//初始化全局软件定时器(在定时中断里每秒把这个变量加1)
            step = 0;
        }
        else
        {
            return;
        }
    }
    //流程体:
    switch(step)
    {
        case 0:
        {
            //处理动作1
            //……
            if(timer_s >= 1)//时间到,切换下一个动作
                step++;
            break;
        }
        case 1:
        {
            //处理动作2
            //……
            if(timer_s >= 3)//时间到,切换下一个动作
                step++;
            break;
        }
        //其他动作:
        //……
        default:
        {
            step = 0;
            break;
        }
        
    }
    #undef MyKey //注销本流程的特定按键
}
void FUN_B(KEY CurKey)
{
    //参考FUN_A()
}
void FUN_C(KEY CurKey)
{
    //参考FUN_A()
}
void FUN_D(KEY CurKey)
{
    //参考FUN_A()
}
void main(void)
{
    //初始化……
   
    while(1)
    {//在按键中断里刷新Key这个全局变量
        FUN_A(Key);
        FUN_B(Key);
        FUN_C(Key);
        FUN_D(Key);
    }
}

使用特权

评论回复
24
mohanwei| | 2013-1-20 19:22 | 只看该作者
不要纠结于代码行数……如果单纯计较行数,其实C比汇编强悍多,如果不使用宏,无论多大的C工程都可以压缩为一行

使用特权

评论回复
25
明月小厨| | 2013-1-21 00:57 | 只看该作者
如果是灯光设备的话,以前看我们经理做过,他的方法就是灯亮灭用1,0表示好,直接烧到ROM里;然后只要控制地址线就可以出来对应的效果;低端地址用计数器;高端为A,B,C.D(二线);如果用单片机,把这个表放在FLASH里也行;

使用特权

评论回复
26
qingx| | 2013-1-21 09:07 | 只看该作者

使用特权

评论回复
27
渤海三叠浪|  楼主 | 2013-1-21 22:44 | 只看该作者
明月小厨 发表于 2013-1-21 00:57
如果是灯光设备的话,以前看我们经理做过,他的方法就是灯亮灭用1,0表示好,直接烧到ROM里;然后只要控制地址线 ...

小厨  写个看看别老放空**:shutup:

使用特权

评论回复
28
明月小厨| | 2013-1-23 01:48 | 只看该作者
渤海三叠浪 发表于 2013-1-21 22:44
小厨  写个看看别老放空**

我那里有这个精神头;我只是说说而已;很多年前流水灯就是用ROM(4位输出)加计数器搞的;成本极低,稳定;当时的单片机价格不便宜;所以如果不能用模型描述(逻辑关系);就直接0101搞搞算了;只是这样处理起来不够档次;

使用特权

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

本版积分规则