51单片机中如何通过一个按键实现暂停与恢复?需要一个编程的思想
背景是这样的:我采用矩阵式键盘,有十二个键执行不同的任务。有很多循环。现在我需要一个按键,这个键的功能就是,我那十二个任务不论执行到什么地方,只要暂停建按下,那么程序原地...
背景是这样的:我采用矩阵式键盘,有十二个键执行不同的任务。有很多循环。
现在我需要一个按键,这个键的功能就是,我那十二个任务不论执行到什么地方,只要暂停建按下,那么程序原地踏步,按其他键都不管用,再按暂停键恢复到原来的地方。 展开
现在我需要一个按键,这个键的功能就是,我那十二个任务不论执行到什么地方,只要暂停建按下,那么程序原地踏步,按其他键都不管用,再按暂停键恢复到原来的地方。 展开
展开全部
有以下几种情况:
1.循环查询按键。当按键按第一次时间,进入第一层循环查询语句内部,执行恢复。不跳出该层循环,继续查询按键。当第二次按下时间,进入第二层循环查询语句内部,执行暂停。循环结束。若想反复暂停和恢复,就在外面再加一层while(1)类似的死循环,反复执行其内部的两层循环查询语句。
2.用一个标志变量,记住按键的状态。初始化为个值,如“暂停”,按键之后检查标志变量,是“暂停”就执行“恢复”,再让它变为“恢复”说明当前已经执行了恢复。反之亦然。
3.掉电暂停。这样需要按键能触发cpu工作。所以,需要按键接到外部中断上面。中断后可以恢复CPU工作。在中断中再判断是否要让cpu掉电与否。
不知道这种方法你能接受不?还是用外部中断。此按键触发中断后,关掉所有其他的中断,也即EA=0(最好先用个变量记住EA,方便恢复),然后就一直在中断中等待该按键第二次按下再恢复EA,最后退出中断。
1.循环查询按键。当按键按第一次时间,进入第一层循环查询语句内部,执行恢复。不跳出该层循环,继续查询按键。当第二次按下时间,进入第二层循环查询语句内部,执行暂停。循环结束。若想反复暂停和恢复,就在外面再加一层while(1)类似的死循环,反复执行其内部的两层循环查询语句。
2.用一个标志变量,记住按键的状态。初始化为个值,如“暂停”,按键之后检查标志变量,是“暂停”就执行“恢复”,再让它变为“恢复”说明当前已经执行了恢复。反之亦然。
3.掉电暂停。这样需要按键能触发cpu工作。所以,需要按键接到外部中断上面。中断后可以恢复CPU工作。在中断中再判断是否要让cpu掉电与否。
不知道这种方法你能接受不?还是用外部中断。此按键触发中断后,关掉所有其他的中断,也即EA=0(最好先用个变量记住EA,方便恢复),然后就一直在中断中等待该按键第二次按下再恢复EA,最后退出中断。
更多追问追答
追问
谢谢大侠,你给的答案最全面。我考虑了一下,适合我用的只能是方式三了。请问,掉电模式和空闲模式有何区别?暂停后如何恢复?一个按键如何具体操作?
追答
空闲模式是指CPU不再执行程序,但是片内的外围电路(如定时/计数器,中断控制电路,串口)仍然工作。掉电模式是指当进入掉电模式时,执行最后一条指令后,振荡器停止,cpu不工作了,可以将电压降低到2V,片内RAM和SFR的值保持原值。终止空闲模式有两种方法:a.任何使能的中断,程序自动从中断服务程序处恢复。b.硬件复位。终止掉电模式:要先将电压恢复至cpu正常工作电压,再进行下列方法:A.硬件复位,这种复位不像正常复位一样RAM,SFR的值都恢复为默认值,而是能保存RAM掉电前的值,SFR就不能了。B. 外部中断0或1被触发,前提是他们要被使能,并且为电平触发。中断服务中不能有其他语句,直接返回(汇编RETI指令),cpu就恢复执行掉电执行指令后的下一条指令。
具体怎么控制,你看PCON寄存器吧,很容易。PD=1,进入掉电模式,IDL=1进入空闲模式。
按照你的意思,要使用外部中断恢复比较好。那个按键就接到外部中断上面吧。
外部中断终止掉电模式,RAM与SFR都能保存的。硬件复位是只能保存RAM。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
就是使用51的中断就可以了!
你的其他12个按键也可以使用中断来处理,只是把那个暂停键设为级别最高,不管什么情况下改建按下就到该键的子程序运行(注意此时要关闭中断功能、只是判断该暂停键是否第二次按下),若按下就跳到原来暂停前的位置即可,并开启中断!
看是这个意思吗!
你的其他12个按键也可以使用中断来处理,只是把那个暂停键设为级别最高,不管什么情况下改建按下就到该键的子程序运行(注意此时要关闭中断功能、只是判断该暂停键是否第二次按下),若按下就跳到原来暂停前的位置即可,并开启中断!
看是这个意思吗!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你说的暂停是指的,程序不执行其他操作?若是,请接着看
设定一个标志,当程序始终停滞在这个位置,或者是不执行其他程序,这个标志设为1时,此时执行空语句;当按键时,触发中断,把标志清零。
设定一个标志,当程序始终停滞在这个位置,或者是不执行其他程序,这个标志设为1时,此时执行空语句;当按键时,触发中断,把标志清零。
追问
谢谢大侠的回答。我的暂停是:程序在执行其他任何动作的时候,只要一按这个键,自动停住原地踏步。再按,返回到原程序继续执行。你给的答案暂时应该不能解决这个问题哦
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
推荐暂停 用 掉电模式
更多追问追答
追问
嗯,谢谢大侠。答案很好。有人也这么给我说过。只是我以前还没用过掉电模式,请问具体操作?而且,用掉电模式一个键能处理的来么?我怎么想都需要两个键哦...
追答
你看下PCON这个寄存器 其实很简单 写个数据就行了 至于一个按键 你用一个全局整型变量 每次按键中断取反即可
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询