找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2196|回复: 1
打印 上一主题 下一主题
收起左侧

想问一下关于单片机按键切换显示内容的问题

[复制链接]
跳转到指定楼层
楼主
因为在显示的时候加了左右滚动,上下滚动特效,所以切换时要一直按着按键,一直显示的内容停止,松开按键才能切换,师傅跟我说可以定义一个切换标志位,按下按键置1,然后显示内容再置0,可是我要切换的内容有5项,请问怎么才能用标注位来切换程序?(之前我用的是按下按键i++,不同的显示不同的内容,i==5的时候i=0。)

单片机源程序如下:

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:565305 发表于 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 需要分拆为片段等【比方说每显示一行字就为一个片段?】,留待题主自己根据项目复杂度去评估了【其实有些机器在画面的移动卷屏时,只是操作显示缓存,多出来的地方留黑边。操作缓存的效率可比读取字模快多了】


评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:756622 发表于 2020-5-20 21:12 | 只看该作者
这样行吗?当你的页面滚动程序显示完后把对应的页面的标志位置为当前页数,比如这样if(h==1&&biaozhi==5)不过这样的话好像只能朝着一个方向循环滚动。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表