-----------------------------------------------------------
从上面的这段代码来看,你在主函数里调用了扫描函数扫描按键,软件置TF0=1产生定时中断,而事实上,T0已在处理在定时中断的当中,然而中断函数使用了下面的语句:
while(keybuf!='E')
{
move(0x00);//移动LCD光标
getkey();
wrdata(keybuf);//向LCD当前位置写入键盘值,此处scan()无效
}
这些语句很容易让程序处在中断当中而无法退出,建议你在中断当中用if语句适合。
同时,我建议你在编写程序时注意程序的结构,尽量模块化,一个函数在中断外部调用了,就不要在中断外部再调用,中断当中注意使用while语句,防止处在中断当中退不出来或不确定状态。
------------------------------------------------
米德电子-Mide
Technology研发中心
>
这个我知道有个类似的,
你的意思就是按1下,执行函数1;按第2下,执行函数2
你在检测按键按下的时候。设置个变量sum=0;按1次就sum++
然后就可以区分按下两次的不同了。
void keyscan()
{
if(s==0)
{
delay(5);
if(s==0)
{
while(!s);
snum++;
}
}
if(snum==1)
{
TR0=0;
ET0=0;
}
if(snum==2)
{
TR0=1;
ET0=1;
snum=0;
}
}
比如,我写的一个暂停的函数,按1下,执行一个函数1,暂停;
再按1下,执行另一函数2,开始工作。
不懂的QQ358357912说吧 ,另外你发问题不给分,这个态度是不对滴^-^
定义一个按键缓冲区
用普通的按键扫描程序,当扫描到有按键按下的时候。按键键的值写入缓冲区。继续扫描直到完成。
然后返回缓冲区地址就可以得到多个按键的数据了。
这样只要定义16字节的缓冲区全部按键都能检测到。(一般不需要那么多6个足够)
还有一种方式 是 如果只返回2个按键的话。
可以这样
常规按键扫描 返回范围在0-15也就是0-F
读取到一个值后把这个值左移4位
再继续读取。当读取到第二个值的时候与上第一个值。就能获取2个按键的值了。
本人是学C的,但还看得懂汇编语言。
MOV P2,A 是把扫描码赋给P2口,其实是赋给P2口的低四位,进行扫描;
MOV A,P2 是读取P2口的值,后面一句把低四位屏蔽了,最终还是读取了高四位
以上就是关于51单片机,定时中断与键盘扫描的问题。全部的内容,包括:51单片机,定时中断与键盘扫描的问题。、51单片机按键键盘抖动的实现以及如何设置键盘中的复合键、51单片机矩阵键盘程序问题求解等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)