欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 請教一個單片機按鍵掃描里的判斷問題 [打印本頁]

作者: hhdsdy    時間: 2019-11-6 22:21
標題: 請教一個單片機按鍵掃描里的判斷問題
本帖最后由 hhdsdy 于 2019-11-7 10:58 編輯

以前都是用匯編的,因為不會英文一直學不會C語言,這個是自己寫的第一個c程序里的一段,P2口低四位接按鍵,因為不確定if里面能否直接使用端口進行比較判斷,因此用變量a進行過渡,待軟件仿真調試正常后,重改程序才發現我這個無法用if((P2|0xf0) != 0xff)來代替a=P2|0xf0; if(a != 0xff)語句,可是記得后來看過別人的程序是可以的,是哪里錯了嗎?
另外,在按鍵消抖那里,之前是沒有do{;}這一部分的,結果一直退不出循環,后來看了好多人的按鍵處理程序,看到有一個和我類似的有用上do,試著加上就可以了,這個do后面只是一個空語句,加不加上不是一樣的嗎,怎么會有差別?


誤刪分號,編輯補回
  1. uchar KEY_SCAN()

  2. {   

  3.           uchar a=0;

  4.           do

  5.     {

  6.                           a=P2|0xf0;

  7.               if(a != 0xff)

  8.         {

  9.                         Delay1ms(50);

  10.             do{;}while((P2|0xf0) != 0xFF);   //因為復制過來的注釋誤碼,在刪除注釋時誤刪分號,現編輯補回
  11.                     }

  12.     }

  13.                 while(a==0);

  14.     return a;

  15. }

復制代碼





作者: csmyldl    時間: 2019-11-7 08:00
do{;}while((P2|0xf0) != 0xFF)后面是不是還得有一個分號?加do{;}只是等待,不加do{;},在原while后加分號是一樣的
作者: tyrl800    時間: 2019-11-7 08:07
這個DO是循環語句,怎么說是空語句?
作者: xianfajushi    時間: 2019-11-7 10:49
執行函數時假設按鍵一直沒按下,那么執行到  while(a==0);這里就是無限循環即死循環了因為函數開頭就賦值=0.do{;}while((P2|0xf0) != 0xFF)這個循環體內不做任何事情就去判斷了這是在有按鍵按下情況這時a不等于0,因此不會死循環,對?
作者: hhdsdy    時間: 2019-11-7 10:54
csmyldl 發表于 2019-11-7 08:00
do{;}while((P2|0xf0) != 0xFF)后面是不是還得有一個分號?加do{;}只是等待,不加do{;},在原while后加分號是 ...

謝謝指教!這個語句后面確實是有分號,否則編譯也無法通過,只是我復制過來的時候因為注釋亂碼,我把注釋刪除時誤刪了分號而沒有看到
我百度到的解釋是
while循環如果條件不成立,可能導致語句一次都不執行.
而do..while方法即使條件不成立,語句至少也會執行一次.

按鍵等待釋放,程序是一直在while里循環運行的,所以理論上來講這兩個語句是一樣的作用,這就是我不理解的地方。
作者: hhdsdy    時間: 2019-11-7 11:01
tyrl800 發表于 2019-11-7 08:07
這個DO是循環語句,怎么說是空語句?

這個do是循環語句,但里面只有一個分號,沒有任何語句,最多也就是浪費一點時間,不影響程序的變量變化及走向,所以我才認為是空語句
作者: hhdsdy    時間: 2019-11-7 13:02
xianfajushi 發表于 2019-11-7 10:49
執行函數時假設按鍵一直沒按下,那么執行到  while(a==0);這里就是無限循環即死循環了因為函數開頭就賦值=0. ...

你這沒有符號的一口氣看下去,讓人看不明白是什么意思
do{;}while((P2|0xf0) != 0xFF); 是一對循環的,和第24行的while(a==0);不是一對;第24行的是和第7行到第23行的這一段是一對,所以只要a==0;就一直執行這一段的程序,直到有鍵按下(我這個程序很簡單,沒用中斷和LCD之外的顯示,所以在調用鍵掃描后就在這一直等待按鍵按下),才返回一個非零的鍵值。
作者: dhy931023    時間: 2019-11-7 14:20
循環這里的有問題吧
作者: hhdsdy    時間: 2019-11-7 15:25
dhy931023 發表于 2019-11-7 14:20
循環這里的有問題吧

什么問題?
作者: xianfajushi    時間: 2019-11-7 21:25

  1. uchar KEY_SCAN()
  2. {   
  3.     uchar a=0;
  4.     do
  5.     {
  6.          a=P2|0xf0;
  7.          if(a != 0xff)//按鍵按下執行下面
  8.         {
  9.              Delay1ms(50);
  10.             do{;}while((P2|0xf0) != xFF); //等待按鍵釋放
  11.         }
  12.     }
  13.     while(a==0);//循環判斷,假如執行該函數時按鍵沒按下則在這里死循環了
  14.     return a;
  15. }
復制代碼

這樣看懂了?
作者: xianfajushi    時間: 2019-11-7 21:26
有按鍵按下時a非0,因此while(a==0);這句就結束了,不會死循環。
作者: wulin    時間: 2019-11-7 22:02
在實際應用中P2高4位可能另有它用,它們的狀態不能帶入按鍵判斷。
要用a=P2&0x0f; if(a!=0x0f)判斷P2低4位。給你一個簡單示例。
  1. #include <reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit LED1=P2^4;
  5. sbit LED2=P2^5;
  6. sbit LED3=P2^6;
  7. sbit LED4=P2^7;
  8. bit flag=0;
  9. void Delay1ms(uint k)
  10. {
  11.         uint i,j;
  12.         for(i=k;i>0;i--)
  13.                 for(j=125;j>0;j--);
  14. }

  15. uchar KEY_SCAN()
  16. {   
  17.         uchar a=0;
  18.         a=P2&0x0f;
  19.         if(a!=0x0f)
  20.         {
  21.                 Delay1ms(10);
  22.                 if(a!=0x0f&&flag==0)
  23.                 {
  24.                         flag=1;
  25.                         return a;
  26.                 }
  27.         }
  28.         else        flag=0;
  29. }

  30. void main()
  31. {
  32.         uchar i=0;
  33.     while (1)
  34.     {
  35.                 i=KEY_SCAN();
  36.                 switch(i)
  37.                 {
  38.                         case 0x0e: LED1=~LED1;break;
  39.                         case 0x0d: LED2=~LED2;break;
  40.                         case 0x0b: LED3=~LED3;break;
  41.                         case 0x07: LED4=~LED4;break;
  42.                         default: break;       
  43.                 }
  44.     }
  45. }
復制代碼





歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1