单片机c语言的按键单按判断
if((key&0x80)!=0x80)
{
while((key&0x80)!=0x80);
mark=2;
}
如果矩阵按键没按就key|=0x80
想按键按下再松开就让mark=2
这样为什么就是不行
有什么别的办法
æè¦å¤æåé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æ¶æå¾ç®¡ç¨ï¼æè¿æ¯å¾å¨ççå®èå¸çåç¨åºæ¯ä¸ªä»ä¹æ ·ç
我就是想做个松手检测
if((key&0x80)!=0x80) //当无按键按下的标志位0x80没有就往下走
{
while((key&0x80)!=0x80);//当按键还是按下就一直在这循环,while循环嘛!一松开往就下
mark=2;
}
理论上可以实现,现实太残酷
不是,,你一摁下,程序就跑肥了,,,还是没有松手检测,也就是摁下一次程序走一次
单片机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