标题: 想问一下关于单片机按键切换显示内容的问题 [打印本页]

作者: chengyuyu    时间: 2020-5-20 11:55
标题: 想问一下关于单片机按键切换显示内容的问题
因为在显示的时候加了左右滚动,上下滚动特效,所以切换时要一直按着按键,一直显示的内容停止,松开按键才能切换,师傅跟我说可以定义一个切换标志位,按下按键置1,然后显示内容再置0,可是我要切换的内容有5项,请问怎么才能用标注位来切换程序?(之前我用的是按下按键i++,不同的显示不同的内容,i==5的时候i=0。)

单片机源程序如下:


作者: egypt    时间: 2020-5-20 16:55
本帖最后由 egypt 于 2020-5-21 09:37 编辑

从题主给的代码,无法看出 “切换的内容有5项”,所以只能从别的角度来分析
首先假设一个 main 中主逻辑循环长这样
main ()
{
     InitHardware();       // 硬件初始化
     while(1)
     {     GetKey();        //  扫描按键函数
            ProcessKey();  // 根据按键设定标志函数
            DoDisplay();    // 根据标志进行显示函数
            ....                  // 此处为  delay 或者其它功能性的函数
     }
}
这个流程简单说,像  获取消息事件 → 分拣处理消息事件并生成内部标志 → 根据内部标志执行对应动作

回过来说题主的代码, 假设 GetKey / ProcessKey / DoDisplay 函数都是只耗费 【1毫秒】的代码, 那么 GetKey 哪怕写在 DoDisplay() 里头都没问题(代价是:可读性、可维护性就非常差了。一点都不模块化);

但是,大部分情况下 DoDisplay() 函数的耗时,经常是一个不定的,而且很大的值。可以设想一下,假设 DoDisplay() 这个函数耗费 10秒 才结束,那么跑完一次外围 while 循环,就得 10秒,衍生为,读取按键就变成 10秒读取一次,或者说按键要按住 10秒才能让逻辑循环往下走一轮(从题主开头的表述就是,一直按着按键,一直显示的内容停止,松开按键才能切换)……

常见改法是,要确保 GetKey / ProcessKey 有机会被执行和【设置标志】。这也是题主提及的,【定义一个切换标志位】的核心意思了。至于 GetKey 在 中断上 或者 轮询 等机制,或者说 DoDisplay 需要分拆为片段等【比方说每显示一行字就为一个片段?】,留待题主自己根据项目复杂度去评估了【其实有些机器在画面的移动卷屏时,只是操作显示缓存,多出来的地方留黑边。操作缓存的效率可比读取字模快多了】



作者: 新征途    时间: 2020-5-20 21:12
这样行吗?当你的页面滚动程序显示完后把对应的页面的标志位置为当前页数,比如这样if(h==1&&biaozhi==5)不过这样的话好像只能朝着一个方向循环滚动。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1