久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2787|回復: 11
打印 上一主題 下一主題
收起左側

請教一個單片機按鍵掃描里的判斷問題

[復制鏈接]
跳轉到指定樓層
樓主
ID:88256 發表于 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. }

復制代碼




分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:235200 發表于 2019-11-7 08:00 | 只看該作者
do{;}while((P2|0xf0) != 0xFF)后面是不是還得有一個分號?加do{;}只是等待,不加do{;},在原while后加分號是一樣的
回復

使用道具 舉報

板凳
ID:275826 發表于 2019-11-7 08:07 | 只看該作者
這個DO是循環語句,怎么說是空語句?
回復

使用道具 舉報

地板
ID:332444 發表于 2019-11-7 10:49 | 只看該作者
執行函數時假設按鍵一直沒按下,那么執行到  while(a==0);這里就是無限循環即死循環了因為函數開頭就賦值=0.do{;}while((P2|0xf0) != 0xFF)這個循環體內不做任何事情就去判斷了這是在有按鍵按下情況這時a不等于0,因此不會死循環,對?
回復

使用道具 舉報

5#
ID:88256 發表于 2019-11-7 10:54 | 只看該作者
csmyldl 發表于 2019-11-7 08:00
do{;}while((P2|0xf0) != 0xFF)后面是不是還得有一個分號?加do{;}只是等待,不加do{;},在原while后加分號是 ...

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

按鍵等待釋放,程序是一直在while里循環運行的,所以理論上來講這兩個語句是一樣的作用,這就是我不理解的地方。
回復

使用道具 舉報

6#
ID:88256 發表于 2019-11-7 11:01 | 只看該作者
tyrl800 發表于 2019-11-7 08:07
這個DO是循環語句,怎么說是空語句?

這個do是循環語句,但里面只有一個分號,沒有任何語句,最多也就是浪費一點時間,不影響程序的變量變化及走向,所以我才認為是空語句
回復

使用道具 舉報

7#
ID:88256 發表于 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之外的顯示,所以在調用鍵掃描后就在這一直等待按鍵按下),才返回一個非零的鍵值。
回復

使用道具 舉報

8#
ID:637424 發表于 2019-11-7 14:20 | 只看該作者
循環這里的有問題吧
回復

使用道具 舉報

9#
ID:88256 發表于 2019-11-7 15:25 | 只看該作者
dhy931023 發表于 2019-11-7 14:20
循環這里的有問題吧

什么問題?
回復

使用道具 舉報

10#
ID:332444 發表于 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. }
復制代碼

這樣看懂了?
回復

使用道具 舉報

11#
ID:332444 發表于 2019-11-7 21:26 | 只看該作者
有按鍵按下時a非0,因此while(a==0);這句就結束了,不會死循環。
回復

使用道具 舉報

12#
ID:213173 發表于 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. }
復制代碼
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲人成网亚洲欧洲无码 | 国产精品免费视频一区 | 精品一二三 | 亚洲入口| 国产高潮av| 欧美在线视频免费 | 精品国产青草久久久久福利 | 亚洲一区二区三区在线播放 | 久久精品日产第一区二区三区 | 日韩精品视频在线免费观看 | 久久久国产精品视频 | 成人av电影免费在线观看 | 国产在线网站 | 国产精品视频网 | 九九精品网 | 二区高清| 亚洲精品三级 | 久久一区视频 | 国产日屁 | 日韩欧美在线观看视频网站 | 久久亚洲精品久久国产一区二区 | 99热视| 国产真实乱对白精彩久久小说 | 欧美一级黄色片在线观看 | 国产95在线 | 色视频成人在线观看免 | 亚洲一区中文字幕 | 亚洲精品一区二区三区四区高清 | 日韩在线国产 | 欧美激情综合 | 免费天天干 | 欧美日韩一区二区三区四区五区 | 中文字幕一区二区三区乱码在线 | 午夜国产一区 | 成人欧美一区二区三区黑人孕妇 | 91在线一区二区 | 免费一区在线 | 色性av| 成人毛片一区二区三区 | 欧美成人精品在线 | 中文字幕精品视频 |