打印

读键的程序为什么不对?

[复制链接]
1729|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
海宁|  楼主 | 2007-6-13 08:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

各位高手请看一看,我的读键的程序为什么返回不了0;

unsigned char GET_key() 
{
 static unsigned char data l20070610; 
 
 ET0=0;
 _nop_();
 l20070610=key_OK_data; 
 key_OK_data=0;  //是在定时器0中赋值的
 
 ET0=1;
 return l20070610;
}
我是在定时器0中20MS进行一次读键的操作,在去抖动后将值给key_OK_data;
而key_OK_data,只在这个程序中清0,但是在我读一次键,没有按其它键的时候
如果再一次读这个程序,还是回来原来的键值,不是0,我不知道为什么?
如果在RETURN处加一个是不是值为0的IF语句判断后会好一些。
这是怎么回事。
这是我的定时器0的函数定义:
void timer0() interrupt 1 using 0
内中函数是十分简单的不传上来了。
其中用到的全局变量定义如下:
static unsigned char idata key_OK_data;

我是这样使用的:
                           do
  {
   kk=GET_key();
  }while(!kk);
但是在我第一次按键后,第二个键没有铵下时,KK也会回来原来的值,使我的程序不稳定
这是为什么,请高手指教,小女多谢了!

我的QQ:772159495 请高手加我,本周我全天在线。

相关帖子

沙发
jmx| | 2007-6-13 11:21 | 只看该作者

你這個循環本來就只能執行一次


你這個循環本來就只能執行一次,
因為你用!kk判斷,當第一次有鍵按下去以后,GET_key()就會返回非0啊,
你的循環就會停止啊。

使用特权

评论回复
板凳
海宁|  楼主 | 2007-6-13 12:03 | 只看该作者

但是我前面用了一个循环的

我用这个函数进行按键的测试
while(1)
{
    do{
        kk=GET_key();
    }while(!kk);
    disp_one(0,0,kk);
}

我是想在没有键按下的时候,在DO中循环等待,在有时再显示,但是我发现按一次键后,没有按键也显示前面的键值,一直到再按下一个键,不知道是为什么,定时器是没有错的,

使用特权

评论回复
地板
wjy1107| | 2007-6-13 12:18 | 只看该作者

是不是又进20Ms中断了

在那里 key_OK_data又被重新赋值了。是在按键抬起时还是按下时进行检测的按键值啊?

使用特权

评论回复
5
yuyixuanta| | 2007-6-13 12:21 | 只看该作者

正确的

就应该显示前面的键值嘛。
在没有确定按键的时候,在do-while中循环,一旦有键值,立即跳出do-while,执行disp_one(0,0,kk);显示按键值,然后又进入do-while循环,这时如果没有新的按键,则不会跳出,即显示值不会被修改,肯定显示的是以前的键值。
如果你要显示0,在第一次检测到0的时候重新显示一下就ok了。

使用特权

评论回复
6
海宁|  楼主 | 2007-6-14 16:03 | 只看该作者

问题解决了!不是大家说的那样!

多谢各位,在网友的帮助下,我反复测试了程序,发现了问题所在。
我的问题是这样的,我用这个get_key()的函数来处理对比度的调节,但是因为
这个函数的问题,在只按加键的时候也会出现多按加键的情况,使我按一次加键,对比度快速上升,因而我才发现这个函数有问题,我发现这是由于我在
定时器的中断程序处用了,USING 0而产生的,我将这个USING 0去掉就没有问题了,
按一次键就是一次,但是为什么是这种情况我还不太明白,因为单片机默认是寄存器组0的,强调一下反而不可以,如果有高手知道请解答!
总之问题解决了,好高兴,多谢回复的朋友们!

使用特权

评论回复
7
conwh| | 2007-6-14 16:21 | 只看该作者

MM也厉害,看来真是y胜y也衰了。

使用特权

评论回复
8
shinep| | 2007-6-14 17:16 | 只看该作者

中断不能用寄存器组0啦,换1或什么的,因为主程序就用0

C 中断函数没对寄存器堆栈好像

使用特权

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

本版积分规则

1

主题

3

帖子

0

粉丝