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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機旋轉彩虹燈在運行時按鍵無反應

[復制鏈接]
回帖獎勵 8 黑幣 回復本帖可獲得 1 黑幣獎勵! 每人限 1 次
跳轉到指定樓層
樓主
ID:452212 發表于 2020-5-18 19:38 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  在用C語言寫旋轉彩虹燈(按鍵控制方向和速度)時遇到一個小問題,我知道問題在哪,但是解決不了;完整單片機代碼如下:
  1. #include<reg51.h>
  2. #define unit unsigned int
  3. #define uchar unsigned char

  4. uchar code KEY_TABLE[]=
  5.                                 {0x11,0x21,//0001 0001,KEY0;0010 0001,KEY1
  6.                                 0x12,0x22};//0001 0010,KEY2;0010 0010,KEY3//按鍵表
  7. uchar code Out_TABLE[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//輸出
  8. //1111 1110;1111 1101;1111 1011;1111 0111
  9. uchar code T_TABLE[]={0x64,0x50,0x3c,0x28,0x14};//延時部分
  10. uchar code Sout_TABLE[]={0x0f,0x17,0x1b,0x1d,0x1e};//指示燈
  11. //0000 1111;0001 0111;0001 1011;0001 1101;0001 1110;

  12. //延時10ms,基本延時單位和按鍵消抖部分
  13. void delay()
  14. {
  15. uchar t,ms;
  16. ms=10;
  17. while(ms--)for(t=0;t<120;t++);
  18. }
  19. //速度選擇部分
  20. void delay1(uchar n)//n=20,40,60,80,100
  21. {
  22. uchar i;
  23.         for(i=0;i<n;i++)
  24.         {
  25.                 delay();
  26.         }
  27. }


  28. void main()
  29. {

  30.         
  31. uchar DIR = 0;//方向選擇
  32. uchar m = 0;//方向實現(通過燈亮的順序)
  33. uchar speed = 0;//速度檔位
  34. uchar t=T_TABLE[speed];//速度對應延時表
  35. uchar i,num,key,temp;//變量定義
  36. P1=Out_TABLE[m];//輸出
  37. P0=Sout_TABLE[speed];//速度擋位指示

  38. while(1)
  39. {        
  40.         //檢測按鍵部分(線反轉法)
  41.                 P3=0x30;//0011 0000;
  42.                         if(P3!=0x30)//
  43.                         {
  44.                         delay();//
  45.                         P3=0x30;//
  46.                                 if(P3!=0x30)//0001 0000;
  47.                                         {
  48.                                         temp =P3;//0001 0000;
  49.                                         P3=0x03;//0000 0011;=>0000 0010
  50.                                         key=temp|P3;//KEY=0001 0010;
  51.                                         key=0x33-key;//KEY=0010 0001;ZHAODAO 0X21,
  52.                                                 for(i=0;i<4;i++)
  53.                                                 {
  54.                                                         if(key==KEY_TABLE[i])
  55.                                                         {
  56.                                                         num = i;//NUM = 1;
  57.                                                         break;
  58.                                                         }
  59.                                                 }
  60.         //按鍵不同,功能不同
  61.                                                 switch(num)
  62.                                                 {        
  63.                                                   case 0:DIR=0;
  64.                                                         
  65.                                                         break;
  66.                                                 
  67.                                                         case 1:DIR=1;

  68.                                                         break;
  69.                                                         case 2:
  70.                                                         
  71.                                                         {
  72.                                                                 speed++;//=1,=2,=3,=4,=5
  73.                                                                 if(speed==5)
  74.                                                                         speed =0;
  75.                                                                 break;
  76.                                                         }
  77.                                                         case 3:
  78.                                                         {
  79.                                                                 speed--;//=4,=3,=2,=1,=0
  80.                                                                 if(speed==-1)
  81.                                                                         speed =4;
  82.                                                                 break;
  83.                                                         }
  84.                                                         
  85.                                                 }
  86.                                                 P0=P0=Sout_TABLE[speed];//指示燈輸出
  87.                                                 t=T_TABLE[speed];
  88.                                                 
  89.                                                 if(DIR==0)
  90.                                                 {
  91.                                                         for(;m<=7;m++)
  92.                                                         {
  93.                                                                 P1=Out_TABLE[m];
  94.                                                                 delay1(t);
  95.                                                                
  96.                                                                 if(m==7)
  97.                                                                 {
  98.                                                                         m=-1;
  99.                                                                 }
  100.                                                         }
  101.                                                 }
  102.                                                 if(DIR==1)
  103.                                                 {
  104.                                                         for(;m>=0;m--)
  105.                                                         {
  106.                                                                 P1=Out_TABLE[m];
  107.                                                                 delay1(t);
  108.                                                                 if(m==0)
  109.                                                                 {
  110.                                                                         m=8;
  111.                                                                 }
  112.                                         }        
  113.                         }
  114.                 }        
  115. }
  116. }
  117.                 }
復制代碼
問題點在:
if(DIR==0)
{
for(;m<=7;m++)
{
P1=Out_TABLE[m];
delay1(t);

if(m==7)
{
m=-1;
}
}
}

如果我這樣寫,執行時,再按鍵就失效了。我試著在里面加上“if(P3!=0x30)break;”,效果不好。希望有大佬可以幫幫忙或者提醒一下這種多次使用按鍵的應該怎么寫。謝謝


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

使用道具 舉報

沙發
ID:739545 發表于 2020-5-19 17:21 | 只看該作者
這樣表達經常出問題,定義某個管腳,然后判斷P3_x==0試一下
回復

使用道具 舉報

板凳
ID:565305 發表于 2020-5-19 18:14 | 只看該作者
從你現在代碼結構來看:

    在 delay(1) 的 for(i=0;i<n;i++) 前面,要改幾個局部變量為全局變量,并且加入按鍵判斷的那段邏輯代碼(改成函數形式),還要【狀態變更】。

    當然,可能會覺得,沒必要每次都判斷按鍵啊, 所以,判斷按鍵的時機,也有幾種選擇:

    # 在 delay(1) 中加全局計數器,當滿某計數 CountMax 后,例如 CountMax=50 ms 就處理一次按鍵并【狀態變更】一次
     (從目前代碼看后續顯示有大量 delay1() 函數)
      假設 n 大于了 CountMax 怎么處理? 簡單,目前代碼中,可以用 10ms 為一個單位,
      延遲 100 毫秒就相當于循環 10 次 10ms,會觸發 CountMax>=50ms 兩次。
      當然,這種方法,因為代碼執行耗費時間長度不一樣,計時會有偏差。

   # 或者,每輪 for(;m>=0;m--) / for(;m<=7;m++) 之后,再才讀取按鍵并【狀態變更】一次,當然這種會丟按鍵。
      一般來說,每一次按鍵,大概會有 60ms 以上 ,折算最高每秒按 15 下按鍵,一般人按 12  13 下最多了

   # 又或者在計時器中斷上,每隔 XX 毫秒 讀取按鍵消息(做個記錄), 然后在 delay1() 中處理該消息,再進行【狀態變更】。

   注:【狀態變更】,包含強行退出 每輪 for(;m>=0;m--) / for(;m<=7;m++) 的循環結構的標志處理。
         簡單點,可以讓 delay1 返回值來做這樣的判斷 ,例如  for(...){  if(delay1(n)!=0) break;  ... }; 或者做個全局標志也行;
         同時,還要留存一些變量防止每次換狀態后,燈從頭跑起。

另外也有一些方法,比方說,燈的更新動作在定時器中斷上(定時器中斷代碼內不寫 delay 了),由按鍵改了 speed 或者燈態的值 → 換算并修訂下次中斷時間或者使能中斷 。這種改法要防止中斷重入、做消息處理以及變量規劃等,細節比較多就不展開了。(反過來,按鍵更新,在定時器中斷上做也行啊,就是燈方向處理)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

地板
ID:452212 發表于 2020-5-20 18:01 | 只看該作者
egypt 發表于 2020-5-19 18:14
從你現在代碼結構來看:

    在 delay(1) 的 for(i=0;i=50ms 兩次。

謝謝回復,我再仔細看看
回復

使用道具 舉報

5#
ID:755472 發表于 2020-5-21 08:30 | 只看該作者
程序有問題
回復

使用道具 舉報

6#
ID:452212 發表于 2020-5-21 10:18 | 只看該作者

請問你指的是程序的某個部分,還是全部?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: www天天操 | 99这里只有精品视频 | 奇米久久 | 91亚洲精品国偷拍自产在线观看 | 欧美高清性xxxxhdvideosex | 91精品国产综合久久久久久首页 | 成人精品一区二区三区中文字幕 | 亚洲欧美日韩高清 | 亚洲一二三区精品 | 超碰日韩 | 久久亚洲天堂 | 日韩国产中文字幕 | 国产免费自拍 | 亚洲成人观看 | 精品一区二区三区免费视频 | 国产精品视频在线免费观看 | 精品日韩在线 | 自拍偷拍亚洲视频 | 一区视频在线免费观看 | 亚洲www啪成人一区二区 | 国产一区二区三区在线 | 日韩av电影在线观看 | 久久久91精品国产一区二区三区 | 国产激情一区二区三区 | 精品九九 | 91精品国产综合久久婷婷香蕉 | 欧美综合一区二区三区 | 四虎成人免费视频 | 日韩久久久久 | 成人精品久久日伦片大全免费 | 欧美性猛交 | 欧日韩在线 | 黄色大片在线免费观看 | 久久免费看| 性高朝久久久久久久3小时 av一区二区三区四区 | 精精国产视频 | 成人午夜av| 日韩欧美国产精品一区二区三区 | 日韩超碰在线 | 亚洲精品成人网 | 国产精品a免费一区久久电影 |