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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3035|回復: 11
打印 上一主題 下一主題
收起左側(cè)

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

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:88256 發(fā)表于 2019-11-6 22:21 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最后由 hhdsdy 于 2019-11-7 10:58 編輯

以前都是用匯編的,因為不會英文一直學不會C語言,這個是自己寫的第一個c程序里的一段,P2口低四位接按鍵,因為不確定if里面能否直接使用端口進行比較判斷,因此用變量a進行過渡,待軟件仿真調(diào)試正常后,重改程序才發(fā)現(xiàn)我這個無法用if((P2|0xf0) != 0xff)來代替a=P2|0xf0; if(a != 0xff)語句,可是記得后來看過別人的程序是可以的,是哪里錯了嗎?
另外,在按鍵消抖那里,之前是沒有do{;}這一部分的,結(jié)果一直退不出循環(huán),后來看了好多人的按鍵處理程序,看到有一個和我類似的有用上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);   //因為復制過來的注釋誤碼,在刪除注釋時誤刪分號,現(xiàn)編輯補回
  11.                     }

  12.     }

  13.                 while(a==0);

  14.     return a;

  15. }

復制代碼




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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

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

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

使用道具 舉報

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

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

使用道具 舉報

7#
ID:88256 發(fā)表于 2019-11-7 13:02 | 只看該作者
xianfajushi 發(fā)表于 2019-11-7 10:49
執(zhí)行函數(shù)時假設(shè)按鍵一直沒按下,那么執(zhí)行到  while(a==0);這里就是無限循環(huán)即死循環(huán)了因為函數(shù)開頭就賦值=0. ...

你這沒有符號的一口氣看下去,讓人看不明白是什么意思
do{;}while((P2|0xf0) != 0xFF); 是一對循環(huán)的,和第24行的while(a==0);不是一對;第24行的是和第7行到第23行的這一段是一對,所以只要a==0;就一直執(zhí)行這一段的程序,直到有鍵按下(我這個程序很簡單,沒用中斷和LCD之外的顯示,所以在調(diào)用鍵掃描后就在這一直等待按鍵按下),才返回一個非零的鍵值。
回復

使用道具 舉報

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

使用道具 舉報

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

什么問題?
回復

使用道具 舉報

10#
ID:332444 發(fā)表于 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)//按鍵按下執(zhí)行下面
  8.         {
  9.              Delay1ms(50);
  10.             do{;}while((P2|0xf0) != xFF); //等待按鍵釋放
  11.         }
  12.     }
  13.     while(a==0);//循環(huán)判斷,假如執(zhí)行該函數(shù)時按鍵沒按下則在這里死循環(huán)了
  14.     return a;
  15. }
復制代碼

這樣看懂了?
回復

使用道具 舉報

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

使用道具 舉報

12#
ID:213173 發(fā)表于 2019-11-7 22:02 | 只看該作者
在實際應用中P2高4位可能另有它用,它們的狀態(tài)不能帶入按鍵判斷。
要用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. }
復制代碼
回復

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表