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

標(biāo)題: 這單片機代碼為什么沒有定義按鍵端口,為什么可以使用按鍵,求解答 [打印本頁]

作者: qwettyuio    時間: 2021-4-23 15:01
標(biāo)題: 這單片機代碼為什么沒有定義按鍵端口,為什么可以使用按鍵,求解答

  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];                        //按鍵去抖動延時計數(shù)器,分別對應(yīng)KEY1/2/3/4/5
  9. extern uchar KeyLock[5];                                //按鍵觸發(fā)后自鎖的變量標(biāo)志,分別對應(yīng)KEY1/2/3/4/5

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


  17. #include "Key.h"

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

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

  22. //-----------------------------------------------------------------
  23. //函數(shù)名稱:        void KeyScan()
  24. //函數(shù)功能:                按鍵掃描程序,放在定時中斷里,可較快實現(xiàn)按鍵響應(yīng)
  25. //調(diào)用子函數(shù):        無
  26. //輸入?yún)?shù):         無
  27. //返回值:                        無,說明:返回的按鍵編碼值保存在KeyCode變量里
  28. //-----------------------------------------------------------------
  29. void KeyScan()
  30. {
  31. //------KEY1實現(xiàn)-------------------------------------------------
  32.         if(KEY1 == 1)                                                        //IO是高電平,說明按鍵沒有被按下,這時要及時清零一些標(biāo)志位
  33.         {        KeyLock[0] = 0;                                        //按鍵自鎖變量標(biāo)志清零
  34.                 KeyTimeCnt[0] = 0;                  //按鍵去抖動延時計數(shù)器清零
  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;                  //自鎖按鍵置位,避免一直觸發(fā)
  43.                                 KeyCode = 1;
  44.                  }
  45.         }
  46.         
  47. //------KEY2實現(xiàn)-----------------------------------
  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;                                                                 //按鍵去抖動延時計數(shù)器清零
  58.                                 KeyLock[1] = 1;                                                                          //自鎖按鍵置位,避免一直觸發(fā)
  59.                                 KeyCode = 2;                                                                    
  60.                  }
  61.         }

  62. //------KEY3實現(xiàn)-----------------------------------
  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實現(xiàn)-----------------------------------
  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實現(xiàn)-----------------------------------
  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 的共陽數(shù)碼管段碼,最后一個是黑屏
  111. const uchar SEG_CODE[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF};
  112. //輸出勵磁序列的頻率參數(shù){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. //步進(jìn)電機正轉(zhuǎn)的勵磁序列
  116. const uchar FFW[] = {0x1F,0x3F,0x2F,0x6F,0x4F,0xCF,0x8F,0x9F}; //DCBAXXXX
  117. //步進(jìn)電機反轉(zhuǎn)的勵磁序列
  118. const uchar REV[] = {0x9F,0x8F,0xCF,0x4F,0x6F,0x2F,0x3F,0x1F}; //DCBAXXXX
  119. //枚舉變量--正反轉(zhuǎn)標(biāo)志
  120. typedef enum
  121.         {FwdRun, RevRun} RunFlag;                                                               
  122. RunFlag flag1 = FwdRun;
  123. uchar speed = 0;
  124. //函數(shù)聲明
  125. void T0_Init();                                        //定時器0初始化函數(shù)聲明
  126. void T1_Init();                                        //定時器1初始化函數(shù)聲明
  127. void KeyService();                        //按鍵服務(wù)函數(shù)聲明
  128. void delay_ms(uint t);        //毫秒延時函數(shù)聲明
  129.         
  130. //-----------------------------------------------------------------
  131. // 主程序
  132. //-----------------------------------------------------------------
  133. void main()
  134. {        
  135.         T0_Init();                                        //定時器0初始化
  136.         T1_Init();                                        //定時器1初始化
  137.         FWD_LED = 0;                                //正轉(zhuǎn)指示燈亮,默認(rèn)初始化是正轉(zhuǎn)
  138.         
  139.         delay_ms(500);                        //延時500ms,待各個模塊上電穩(wěn)定
  140.         EA = 1;                                                        //開啟中斷
  141.         while(1)
  142.         {        
  143.                 KeyService();                //按鍵服務(wù)程序
  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 用于改變步進(jìn)電機轉(zhuǎn)速
  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,定時用于步進(jìn)電機轉(zhuǎn)速控制
  169.         ET1 = 1;                                                                        //允許T1中斷
  170.         PT1 = 1;                                                                        //定時器1優(yōu)先級高
  171.         TR1 = 0;                                                                        //關(guān)閉定時器1
  172. }
  173. //-----------------------------------------------------------------
  174. // Timer0 中斷服務(wù)程序
  175. //-----------------------------------------------------------------
  176. void InterruptTime0() interrupt 1
  177. {
  178.         TH0 = (65536 - 1000) >> 8;                //1ms
  179.         TL0 = (65536 - 1000) & 0xFF;
  180.         KeyScan();                                                                                //按鍵掃描
  181. }
  182. //-----------------------------------------------------------------
  183. // Timer1 中斷服務(wù)程序
  184. //-----------------------------------------------------------------
  185. void InterruptTime1() interrupt 3
  186. {
  187.         static step1 = 0;                                                        
  188.         static step2 = 0;
  189.         TH1 = Timer[speed - 1][0];                        //根據(jù)不同的轉(zhuǎn)速檔位,給定時器1賦定時器值
  190.         TL1 = Timer[speed - 1][1];                        
  191.         
  192.         //按照定時器1的頻率循環(huán)發(fā)送正轉(zhuǎn)勵磁序列的脈沖給步進(jìn)電機,使其不停地轉(zhuǎn)動
  193.         if(flag1 == FwdRun)//正轉(zhuǎn)
  194.         {
  195.                 MotorDriver = FFW[step1++];               
  196.                 if(step1 == 8) step1 = 0;
  197.         }
  198.         
  199.          //按照定時器1的頻率循環(huán)發(fā)送反轉(zhuǎn)勵磁序列的脈沖給步進(jìn)電機,使其不停地轉(zhuǎn)動
  200.         else if(flag1 == RevRun)      
  201.         {
  202.                 MotorDriver = REV[step2++];
  203.                 if(step2 == 8) step2 = 0;
  204.         }
  205. }

  206. //-----------------------------------------------------------------
  207. // 按鍵服務(wù)程序
  208. //-----------------------------------------------------------------
  209. void KeyService()
  210. {
  211.         switch (KeyCode)
  212.         {
  213.                 case 1:        flag1 = FwdRun;                                                                                //正轉(zhuǎn)
  214.                                                 FWD_LED = 0;        REV_LED = 1;                                //正轉(zhuǎn)指示燈亮
  215.                                                 KeyCode = 0;
  216.                                                 break;
  217.             delay_ms(500);               
  218.                 case 2:        flag1 = RevRun;                                                                                //反轉(zhuǎn)
  219.                                                 FWD_LED = 1;        REV_LED = 0;                                //反轉(zhuǎn)指示燈亮
  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. //函數(shù)名稱:        void delay_ms(uint t)
  247. //函數(shù)功能:                延時ms程序(粗略)
  248. //調(diào)用子函數(shù): 無
  249. //輸入?yún)?shù):         t
  250. //返回值:                        無
  251. //-----------------------------------------------------------------
  252. void delay_ms(uint t)
  253. {
  254.         uchar i; while(t--) for(i = 0; i < 125; i++);
  255. }
復(fù)制代碼

作者: Wongrui    時間: 2021-4-23 16:42
Key.h  這個頭文件里面的內(nèi)容呢?
作者: qwettyuio    時間: 2021-4-23 16:44
Wongrui 發(fā)表于 2021-4-23 16:42
Key.h  這個頭文件里面的內(nèi)容呢?

1-20行
作者: qwettyuio    時間: 2021-4-23 16:46
Wongrui 發(fā)表于 2021-4-23 16:42
Key.h  這個頭文件里面的內(nèi)容呢?

key.h 第1行到20行
key.c 23-119行
main.c 后面的
作者: lxbhcy    時間: 2021-4-23 17:48
你這應(yīng)該是在key.h文件里面定義了吧
作者: qwettyuio    時間: 2021-4-23 17:50
lxbhcy 發(fā)表于 2021-4-23 17:48
你這應(yīng)該是在key.h文件里面定義了吧

全部代碼在這了

作者: Tracker123    時間: 2021-4-23 18:14
這里按鍵在key.h里面已經(jīng)定義好了,相應(yīng)的按鍵都使用KeyCode進(jìn)行編碼,在按鍵服務(wù)程序里面使用了5個按鍵,其他按鍵無效
作者: qwettyuio    時間: 2021-4-23 18:18
Tracker123 發(fā)表于 2021-4-23 18:14
這里按鍵在key.h里面已經(jīng)定義好了,相應(yīng)的按鍵都使用KeyCode進(jìn)行編碼,在按鍵服務(wù)程序里面使用了5個按鍵, ...

不太明白,換其他的io口怎么不可以實現(xiàn)的
作者: paladina    時間: 2021-4-23 22:40
你頭文件里還包含了 #include "Config.h"  ,應(yīng)該是 Config.h里定義了
作者: ANT1987    時間: 2021-4-24 10:57
我看你的程序也沒有定義#define uchar unsigned char;#define uint unsigned int ,為啥也能直接用uchar uint




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