单片机c语言的按键单按判断 if((key&0x80)!=0x80) { while((ke

单片机c语言的按键单按判断
if((key&0x80)!=0x80)
{
while((key&0x80)!=0x80);
mark=2;
}
如果矩阵按键没按就key|=0x80
想按键按下再松开就让mark=2
这样为什么就是不行
有什么别的办法

51单片机有《位操作》功能,可以针对某个引脚直接编程。

用C语言的与或非运算语句来写单片机程序,简直是弱暴了。

还是先学学单片机吧。追问

我要判断变量key的0x80的位置不等于0为真;
你有什么好的方法!

追答

参考:

http://zhidao.baidu.com/question/2010688492696896068.html

追问

和我想的一样啊!
while((key&0x80)!=0x80);这个就是按键按下就停住不执行其他非定时器的程序等待按键松开啊

追答

1.你的程序,是按字节进行处理,算法相对复杂,不如按位进行操作简练。

2.你的程序,缺少消抖部分。
  每当发现按下,没有经过延时后再次确认,就等待释放了。

3.你的电路,也不知道是怎么连接的。

追问

    我的是矩阵按键,不是独立按键,我只能想到字节操作。

    有消抖!在key_scan()函数里,等一下上传。

    现在就上传http://pan.baidu.com/s/1jGBo5SU

追答

看你到程序,毛病很多。

---------------------

读出按键的程序,并没有消抖环节。
消抖,是延时后、再次读出,两次相同,才确认按键按下,给出按下的数。

如果没有按键按下,key,也应该有个数。
但是你的按键程序,没有给出《没按键》的数。
---------------------

void InitTimer0(void)
{
TMOD = 0x02;----T0方式2,自动重装
TH0 = 0x00;
TL0 = 0x9C;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void Timer0Interrupt(void) interrupt 1

{
TH0 = 0x00;----方式2,并不用重装初值
TL0 = 0x9C;

KEY_SCAN();//按键扫描--主函数中,也有按键扫描,这不就乱了吗?
……
void main()
{
InitTimer0();
while(1) {

KEY_SCAN();//按键扫描--定时中断函数中,也有按键扫描,这不就乱了吗?

IMAGE2();//专门在主循环里判断按键并给mark赋值
}
}
---------------------

另外,显示点阵,显示出来了吗?

追问

有消抖

现在那个按键程序可以用了,错误就是出在Tab1=[7];的7引发的一连串的错误改了8就可以了

有消抖

现在那个按键程序可以用了,错误就是出在Tab1=[7];的7引发的一连串的错误改了8就可以了

追答

连续的,读出四次,时间间隔,是多少?

应该隔开约 10ms,再读出。
------
况且,先读出的四次,当你确认都相等后,你却并没有用这些,

而是重新又读了几次:
P2 = 0xef;//第一排--------写P2
if(P2 == 0xee) {key = 1; goto key_loop;}--重读P2
……
P2 = 0xdf;//第二排
if(P2 == 0xde) {key = 2; goto key_loop;}
……
P2 = 0xbf;//第三排
if(P2 == 0xbe) {key = 3; goto key_loop;}
……
P2 = 0x7f;//第四排
if(P2 == 0x7e) {key = 4; goto key_loop;}
……

后来读出的四次,并不能说是《有消抖》了。

追问

我的想法是:如果连续4个时钟周期按键都是稳定的,就是都等于一。
那就可以进行按键扫描了。如果样例不够可以用for循环做个在10us内连续采样10按键状态。
这样的好处就是扫描一次矩阵按键只需数百个us而不是10个ms以上相当于10000个us
特别是放在放在1ms触发定时器里,
还有这不是我想出来的,是听我同学说买的(手把手教你单片机)新出的课程讲了这个高大上的方法,我就做了一个,是真的可以用!

追答

算不上什么高大上,以前就有,是淘汰了的用法。

只需数百个us,扫描一次按键,让时间尽量的短,这是对的。
确实应该尽量避免扫描期间,按键的变化。

但是,这只是一次读键的结果而已,并不是消抖的结果。

隔开约 10ms,再扫描出来一个结果,两次相同了再确认,这才是消抖。

可以用的按键程序有很多很多,你现在用的高大上,明显有漏洞。

追问

好吧!你说的10ms消抖很管用!我还是得在看看宋老师的原程序是个什么样的

温馨提示:内容为网友见解,仅供参考
第1个回答  2014-10-03
笨蛋。。。按键没有松手检测。函数一下就跳过好几十遍,追问

我就是想做个松手检测
if((key&0x80)!=0x80) //当无按键按下的标志位0x80没有就往下走
{
while((key&0x80)!=0x80);//当按键还是按下就一直在这循环,while循环嘛!一松开往就下
mark=2;
}
理论上可以实现,现实太残酷

追答

不是,,你一摁下,程序就跑肥了,,,还是没有松手检测,也就是摁下一次程序走一次

第2个回答  2014-10-03
在while里面写if
第3个回答  2014-10-03
需要帮你写吗

单片机c语言的按键单按判断 if((key&0x80)!=0x80) { while((ke
用C语言的与或非运算语句来写单片机程序,简直是弱暴了。还是先学学单片机吧。

C语言的按键开关防抖程序~
key为按键,规定按下为低电平 if(key==0){ delay(50); \/\/延时50ms,消抖 if(key==0) \/\/再判断是否按下 { while(!key); 松手检测 ···该按键按下要实现的功能程序 ···} } 我的习惯是这样写

用单片机C语言控制6位密码锁。要求有一个清除键和确认键,密码输错了...
出口参数:按键值或无按键*\/uchar Find_Key(){ uchar KeyTemp,i; KEYPORT=0xf0;\/\/行线输出0,列线输出全1 KeyTemp=KEYPORT;\/\/读按键端口值 if(KeyTemp==0xf0) return NO_KEY;\/\/无键按下,返回 KEYPORT=KeyTemp|0x0f;\/\/列线输出,行线输入 KeyTemp=KEYPORT;\/\/读取按键端口值 for(i=0;i<16;i++) ...

if(tem_in)k |= 0x80是什么意思啊(单片机 C语言的)
if(tem_in)k| = 0x80;这个是当tem_in为真,或者说tem_in为1的时候,K的最高位BIT7赋值1.

在keil中编程 if(num&0x80)与if(num&0x80==0x80)有什么不同 num是uch...
两者一样啊!num&0x80会清掉前面的7位!若第八位为1,则IF为真;

...编程发送一个字节程序中,if((temp&0x80)==0x80的含义?
if((temp&0x80) == 0x80)sda = 1;else sda = 0;\/\/下面一个SCL上升沿,把数据线SDA上的数据发送出去 scl = 1;\/\/因为前面始终判断的temp最高位,\/\/第(2,3,4...8)次循环,要依次把数据的第(7,6,5..1)位移到temp的最高位。\/\/满足这个要求,每次循环移动一位就可以了 temp = ...

单片机c程序中if(dat&0x01)和dat|=0x80是什么意思?
dat&0x01就是取dat的最低位\\x0d\\x0a如果dat=0x08 dat=0000 1000 dat&0x01=0\\x0d\\x0a如果dat=0x09 dat=0000 1001 dat&0x01=1\\x0d\\x0a\\x0d\\x0aif(dat&0x01)就是指如果dat最低位为1\\x0d\\x0a\\x0d\\x0adat|=0x80 就是指\\x0d\\x0adat=dat|0x80\\x0d\\x0a将dat|0x80的结果重新...

if((temp&0x80)==0x80) 什么意思
判断变量temp 是不是 1XXX XXXX(二进制),即判断他的第7位是否为1

按键实验
if(P1!=0xfd)\/\/确认 { kp=P1;\/\/读取端口键值 while(P1!=0xfd);\/\/等待键松开 switch(kp&0xf0)\/\/屏蔽低4位,判断高4位 { case 0xe0:\/\/若高4位为e(即1键)key=1;\/\/赋键值 break;case 0xd0:\/\/若高4位为d(即5键)key=5;\/\/赋键值 break;case 0xb0:\/\/若高4位为b(即9键)key=...

请问if((date&0x80)==0x80) 和if(date&0x80==0x80)有区别吗
有区别 if((date&0x80)==0x80)会先判断date&0x80,结果为1或者0 然后再判断这个结果是否等于0x80,所以结果总是0 if(date&0x80==0x80)会先判断0x80==0x80,这个结果总是1 然后再判断date与1 如果date非零,结果就是1

相似回答