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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

這單片機代碼為什么沒有定義按鍵端口,為什么可以使用按鍵,求解答

[復制鏈接]
跳轉到指定樓層
樓主

  1. #ifndef _KEY_H_
  2. #define _KEY_H_

  3. //---包含頭文件---//
  4. #include "Config.h"

  5. #define KEY_TIME_SHORT         20                //短按的按鍵去抖動延時的時間

  6. //---加入全局變量--//
  7. extern uchar KeyCode;
  8. extern uint  KeyTimeCnt[5];                        //按鍵去抖動延時計數器,分別對應KEY1/2/3/4/5
  9. extern uchar KeyLock[5];                                //按鍵觸發后自鎖的變量標志,分別對應KEY1/2/3/4/5

  10. //-----------------------------------------------------------------
  11. // 相關函數聲明
  12. //-----------------------------------------------------------------
  13. void KeyScan();                                //按鍵掃描函數 放在定時中斷里                        
  14. void Delay10ms();                        //延時函數
  15.                                                         
  16. #endif


  17. #include "Key.h"

  18. uchar KeyCode = 0;                                                //按鍵編碼值

  19. //共5個獨立機械按鍵,通過短按實現5種按鍵編碼值
  20. uint KeyTimeCnt[5] = {0,0,0,0,0};                //按鍵去抖動延時計數器,分別對應KEY1/2/3/4/5
  21. uchar KeyLock[5] = {0,0,0,0,0};                        //按鍵觸發后自鎖的變量標志,分別對應KEY1/2/3/4/5

  22. //-----------------------------------------------------------------
  23. //函數名稱:        void KeyScan()
  24. //函數功能:                按鍵掃描程序,放在定時中斷里,可較快實現按鍵響應
  25. //調用子函數:        無
  26. //輸入參數:         無
  27. //返回值:                        無,說明:返回的按鍵編碼值保存在KeyCode變量里
  28. //-----------------------------------------------------------------
  29. void KeyScan()
  30. {
  31. //------KEY1實現-------------------------------------------------
  32.         if(KEY1 == 1)                                                        //IO是高電平,說明按鍵沒有被按下,這時要及時清零一些標志位
  33.         {        KeyLock[0] = 0;                                        //按鍵自鎖變量標志清零
  34.                 KeyTimeCnt[0] = 0;                  //按鍵去抖動延時計數器清零
  35.         }
  36.         else if(KeyLock[0] == 0)
  37.         {
  38.                  KeyTimeCnt[0]++;
  39.                  if(KeyTimeCnt[0] > KEY_TIME_SHORT)  
  40.                  {
  41.                                 KeyTimeCnt[0] = 0;
  42.                                 KeyLock[0] = 1;                  //自鎖按鍵置位,避免一直觸發
  43.                                 KeyCode = 1;
  44.                  }
  45.         }
  46.         
  47. //------KEY2實現-----------------------------------
  48.         if(KEY2 == 1)
  49.         {        KeyLock[1] = 0;
  50.                 KeyTimeCnt[1] = 0;
  51.         }
  52.         else if(KeyLock[1] == 0)
  53.         {
  54.                  KeyTimeCnt[1]++;
  55.                  if(KeyTimeCnt[1] > KEY_TIME_SHORT)         //消抖
  56.                  {        
  57.                                 KeyTimeCnt[1] = 0;                                                                 //按鍵去抖動延時計數器清零
  58.                                 KeyLock[1] = 1;                                                                          //自鎖按鍵置位,避免一直觸發
  59.                                 KeyCode = 2;                                                                    
  60.                  }
  61.         }

  62. //------KEY3實現-----------------------------------
  63.         if(KEY3 == 1)
  64.         {        KeyLock[2] = 0;
  65.                 KeyTimeCnt[2] = 0;               
  66.         }
  67.         else if(KeyLock[2] == 0)
  68.         {
  69.                  KeyTimeCnt[2]++;
  70.                  if(KeyTimeCnt[2] > KEY_TIME_SHORT)
  71.                  {        
  72.                                 KeyTimeCnt[2] = 0;
  73.                                 KeyLock[2] = 1;  
  74.                                 KeyCode = 3;                                                                    
  75.                  }
  76.         }

  77. //------KEY4實現-----------------------------------
  78.         if(KEY4 == 1)
  79.         {        KeyLock[3] = 0;
  80.                 KeyTimeCnt[3] = 0;               
  81.         }
  82.         else if(KeyLock[3] == 0)
  83.         {
  84.                  KeyTimeCnt[3]++;
  85.                  if(KeyTimeCnt[3] > KEY_TIME_SHORT)
  86.                  {        
  87.                                 KeyTimeCnt[3] = 0;
  88.                                 KeyLock[3] = 1;  
  89.                                 KeyCode = 4;                                                                    
  90.                  }
  91.         }
  92.         
  93. //------KEY5實現-----------------------------------
  94.         if(KEY5 == 1)
  95.         {        KeyLock[4] = 0;
  96.                 KeyTimeCnt[4] = 0;               
  97.         }
  98.         else if(KeyLock[4] == 0)
  99.         {
  100.                  KeyTimeCnt[4]++;
  101.                  if(KeyTimeCnt[4] > KEY_TIME_SHORT)
  102.                  {        
  103.                                 KeyTimeCnt[4] = 0;
  104.                                 KeyLock[4] = 1;  
  105.                                 KeyCode = 5;                                                                    
  106.                  }
  107.         }
  108. }



  109. #include "Key.h"
  110. //0~9 的共陽數碼管段碼,最后一個是黑屏
  111. const uchar SEG_CODE[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF};
  112. //輸出勵磁序列的頻率參數{TH1,TL1}
  113. const uchar Timer[9][2]={0xDE,0xE4};//,{0xE1,0xEC},{0xE5,0xD4},{0xE9,0xBC},  //8.476 ~ 1ms
  114.                                                            // {0xEd,0xA4},{0xF1,0x8C},{0xF5,0x74},{0xF9,0x5C},{0xFC,0x18}};
  115. //步進電機正轉的勵磁序列
  116. const uchar FFW[] = {0x1F,0x3F,0x2F,0x6F,0x4F,0xCF,0x8F,0x9F}; //DCBAXXXX
  117. //步進電機反轉的勵磁序列
  118. const uchar REV[] = {0x9F,0x8F,0xCF,0x4F,0x6F,0x2F,0x3F,0x1F}; //DCBAXXXX
  119. //枚舉變量--正反轉標志
  120. typedef enum
  121.         {FwdRun, RevRun} RunFlag;                                                               
  122. RunFlag flag1 = FwdRun;
  123. uchar speed = 0;
  124. //函數聲明
  125. void T0_Init();                                        //定時器0初始化函數聲明
  126. void T1_Init();                                        //定時器1初始化函數聲明
  127. void KeyService();                        //按鍵服務函數聲明
  128. void delay_ms(uint t);        //毫秒延時函數聲明
  129.         
  130. //-----------------------------------------------------------------
  131. // 主程序
  132. //-----------------------------------------------------------------
  133. void main()
  134. {        
  135.         T0_Init();                                        //定時器0初始化
  136.         T1_Init();                                        //定時器1初始化
  137.         FWD_LED = 0;                                //正轉指示燈亮,默認初始化是正轉
  138.         
  139.         delay_ms(500);                        //延時500ms,待各個模塊上電穩定
  140.         EA = 1;                                                        //開啟中斷
  141.         while(1)
  142.         {        
  143.                 KeyService();                //按鍵服務程序
  144.         }
  145. }        
  146. //-----------------------------------------------------------------
  147. // Timer0 初始化,模式1,允許中斷,1ms定時
  148. // Timer0 用于按鍵掃描
  149. //-----------------------------------------------------------------
  150. void T0_Init()
  151. {
  152.         TMOD &= 0xF0;
  153.         TMOD |= 0x01;                                                                                //T0工作于模式1,16位定時器
  154.         TH0 = (0xFA)/2;//(65536 - 1000) >> 8;                        //1ms定時
  155.         TL0 = (0xFA)/2;//(65536 - 1000) & 0xFF;
  156.         ET0 = 1;                                                                                                //允許T0中斷
  157.         TR0 = 1;                                                                                                //啟動T0
  158. }
  159. //-----------------------------------------------------------------
  160. // Timer1 初始化,模式1,允許中斷
  161. // Timer1 用于改變步進電機轉速
  162. //-----------------------------------------------------------------
  163. void T1_Init()
  164. {
  165.         TMOD &= 0x0F;
  166.         TMOD |= 0x10;                                                        //定時器1工作于模式1,16位定時器
  167.         TH1 = Timer[speed][0];
  168.         TL1 = Timer[speed][1];                //定時器1,定時用于步進電機轉速控制
  169.         ET1 = 1;                                                                        //允許T1中斷
  170.         PT1 = 1;                                                                        //定時器1優先級高
  171.         TR1 = 0;                                                                        //關閉定時器1
  172. }
  173. //-----------------------------------------------------------------
  174. // Timer0 中斷服務程序
  175. //-----------------------------------------------------------------
  176. void InterruptTime0() interrupt 1
  177. {
  178.         TH0 = (65536 - 1000) >> 8;                //1ms
  179.         TL0 = (65536 - 1000) & 0xFF;
  180.         KeyScan();                                                                                //按鍵掃描
  181. }
  182. //-----------------------------------------------------------------
  183. // Timer1 中斷服務程序
  184. //-----------------------------------------------------------------
  185. void InterruptTime1() interrupt 3
  186. {
  187.         static step1 = 0;                                                        
  188.         static step2 = 0;
  189.         TH1 = Timer[speed - 1][0];                        //根據不同的轉速檔位,給定時器1賦定時器值
  190.         TL1 = Timer[speed - 1][1];                        
  191.         
  192.         //按照定時器1的頻率循環發送正轉勵磁序列的脈沖給步進電機,使其不停地轉動
  193.         if(flag1 == FwdRun)//正轉
  194.         {
  195.                 MotorDriver = FFW[step1++];               
  196.                 if(step1 == 8) step1 = 0;
  197.         }
  198.         
  199.          //按照定時器1的頻率循環發送反轉勵磁序列的脈沖給步進電機,使其不停地轉動
  200.         else if(flag1 == RevRun)      
  201.         {
  202.                 MotorDriver = REV[step2++];
  203.                 if(step2 == 8) step2 = 0;
  204.         }
  205. }

  206. //-----------------------------------------------------------------
  207. // 按鍵服務程序
  208. //-----------------------------------------------------------------
  209. void KeyService()
  210. {
  211.         switch (KeyCode)
  212.         {
  213.                 case 1:        flag1 = FwdRun;                                                                                //正轉
  214.                                                 FWD_LED = 0;        REV_LED = 1;                                //正轉指示燈亮
  215.                                                 KeyCode = 0;
  216.                                                 break;
  217.             delay_ms(500);               
  218.                 case 2:        flag1 = RevRun;                                                                                //反轉
  219.                                                 FWD_LED = 1;        REV_LED = 0;                                //反轉指示燈亮
  220.                                                 KeyCode = 0;
  221.                                                 break;
  222.                         delay_ms(500);        
  223.                 case 3:        speed++;                                                                                                        //速度加
  224.                                                 if(speed == 3) speed = 1;                                
  225.                                                 SpeedShow = SEG_CODE[speed];
  226.                                                 if(TR1 == 0) TR1 = 1;
  227.                                                 KeyCode = 0;
  228.                                                 break;
  229.                         delay_ms(500);        
  230. //                case 4:        speed--;                                                                                                        //速度減
  231. //                                                if(speed == 0 || speed == -1 ) speed = 2;
  232. //                                                SpeedShow = SEG_CODE[speed];        
  233. //                                                if(TR1 == 0) TR1 = 1;        
  234. //                                                KeyCode = 0;
  235. //                                                break;
  236.                 case 5:        TR1 = 0;                                                                                                        //停止
  237.                                                 SpeedShow = 0xFF;
  238.                                                 MotorDriver = 0x00;
  239.                                                 KeyCode = 0;
  240.                                                 break;
  241.             delay_ms(500);                                                        
  242.                 default: ;
  243.         }
  244. }

  245. //-----------------------------------------------------------------
  246. //函數名稱:        void delay_ms(uint t)
  247. //函數功能:                延時ms程序(粗略)
  248. //調用子函數: 無
  249. //輸入參數:         t
  250. //返回值:                        無
  251. //-----------------------------------------------------------------
  252. void delay_ms(uint t)
  253. {
  254.         uchar i; while(t--) for(i = 0; i < 125; i++);
  255. }
復制代碼
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:495628 發表于 2021-4-23 16:42 | 只看該作者
Key.h  這個頭文件里面的內容呢?
回復

使用道具 舉報

板凳
ID:858009 發表于 2021-4-23 16:44 | 只看該作者
Wongrui 發表于 2021-4-23 16:42
Key.h  這個頭文件里面的內容呢?

1-20行
回復

使用道具 舉報

地板
ID:858009 發表于 2021-4-23 16:46 | 只看該作者
Wongrui 發表于 2021-4-23 16:42
Key.h  這個頭文件里面的內容呢?

key.h 第1行到20行
key.c 23-119行
main.c 后面的
回復

使用道具 舉報

5#
ID:808700 發表于 2021-4-23 17:48 | 只看該作者
你這應該是在key.h文件里面定義了吧
回復

使用道具 舉報

6#
ID:858009 發表于 2021-4-23 17:50 | 只看該作者
lxbhcy 發表于 2021-4-23 17:48
你這應該是在key.h文件里面定義了吧

全部代碼在這了
回復

使用道具 舉報

7#
ID:910953 發表于 2021-4-23 18:14 | 只看該作者
這里按鍵在key.h里面已經定義好了,相應的按鍵都使用KeyCode進行編碼,在按鍵服務程序里面使用了5個按鍵,其他按鍵無效
回復

使用道具 舉報

8#
ID:858009 發表于 2021-4-23 18:18 | 只看該作者
Tracker123 發表于 2021-4-23 18:14
這里按鍵在key.h里面已經定義好了,相應的按鍵都使用KeyCode進行編碼,在按鍵服務程序里面使用了5個按鍵, ...

不太明白,換其他的io口怎么不可以實現的
回復

使用道具 舉報

9#
ID:796531 發表于 2021-4-23 22:40 | 只看該作者
你頭文件里還包含了 #include "Config.h"  ,應該是 Config.h里定義了

評分

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

查看全部評分

回復

使用道具 舉報

10#
ID:894154 發表于 2021-4-24 10:57 | 只看該作者
我看你的程序也沒有定義#define uchar unsigned char;#define uint unsigned int ,為啥也能直接用uchar uint
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产麻豆一区二区三区 | 色狠狠一区 | 亚洲区视频| 亚洲一区视频 | 久久久久久天堂 | 亚洲精品电影网在线观看 | 视频一区二区在线观看 | 欧美一区| 请别相信他免费喜剧电影在线观看 | 日韩精品久久久久久 | 成人免费精品 | 一区二区三区四区在线免费观看 | 中文字幕第一页在线 | 中文字幕 在线观看 | 久久久久久久综合 | 在线婷婷 | 日韩人体在线 | 国产欧美日韩综合精品一 | 一二三区av | 成人日韩 | 亚洲一区在线日韩在线深爱 | 久久国产精品免费一区二区三区 | 亚洲一区二区视频 | 国产在线看片 | 欧美色专区| 国产精品区一区二区三区 | 亚洲综合字幕 | 在线观看成人av | 牛牛热在线视频 | 欧美久久久 | 久久久久九九九女人毛片 | 国产高清av免费观看 | 最新日韩在线 | 男人阁久久 | 成人精品鲁一区一区二区 | 亚洲视频中文字幕 | 色精品视频 | 国产精品久久久久免费 | 亚洲国产一区二区视频 | 超碰导航| 毛片入口|