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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 608|回復(fù): 0
收起左側(cè)

MCU 6x6的矩陣鍵盤,按鍵按下串口接收數(shù)據(jù)感覺多運(yùn)行了一次,會顯示多一個加6之后的數(shù)據(jù)

[復(fù)制鏈接]
ID:1027027 發(fā)表于 2022-5-16 16:29 | 顯示全部樓層 |閱讀模式
d7dfd79b43eabd24ff641419ec11e72.png

單片機(jī)源程序如下:
  1. #include "XMCE003.h"
  2. #include "Function_define.h"
  3. //*****************  The Following is in define in Fucntion_define.h  ***************************
  4. //****** Always include Function_define.h call the define you want, detail see main(void) *******
  5. //***********************************************************************************************
  6. /*------------------------------------------------
  7. The main C function.  Program execution starts
  8. here after stack initialization.
  9. ------------------------------------------------*/
  10. //P06 P07 串口 P02 P16 燒碼 P20 復(fù)位 P30 晶振
  11. //下面端口定義根據(jù)實(shí)際情況修改
  12. #define P_IN_0        P00        //輸入0號
  13. #define P_IN_1        P10
  14. #define P_IN_2        P11
  15. #define P_IN_3        P12
  16. #define P_IN_4        P13
  17. #define P_IN_5        P14
  18. #define P_OUT_0        P05 //輸出0號
  19. #define P_OUT_1        P20
  20. #define P_OUT_2        P30
  21. #define P_OUT_3        P17
  22. #define P_OUT_4        P03
  23. #define P_OUT_5        P01
  24. #define BR_16M_115200  (0x8a)
  25. #define SCAN_TIMES        (10)        //1個判決周期內(nèi)掃描次數(shù)
  26. #define PUSH_TIMES        (5)                //1個判決周期內(nèi)多少次按下算真正按下
  27. static uint8_t gUartBuf[5]; //串口數(shù)據(jù)緩沖
  28. static uint8_t gScanCnt;        //掃描計數(shù)
  29. static uint8_t gKeyPressCnt[36]; //按鍵數(shù)
  30. static uint8_t gKeyState[36];         //按鍵狀態(tài)
  31. void delay()                           //延時函數(shù)
  32. {
  33.         uint16_t temp_u16 = 4000;
  34.         while(temp_u16--){nop;}
  35. }

  36. void IO_Init()                         //IO初始化
  37. {
  38.         uint8_t i;
  39.         P00_PullUp_Mode;
  40.         P06_PullUp_Mode;         //上拉
  41.         P10_PullUp_Mode;
  42.         P11_PullUp_Mode;
  43.         P12_PullUp_Mode;
  44.         P13_PullUp_Mode;
  45.         P14_PullUp_Mode;

  46.         P05_OpenDrain_Mode;         //開漏
  47.         P20_OpenDrain_Mode;
  48.         P30_OpenDrain_Mode;
  49.         P17_OpenDrain_Mode;
  50.         P03_OpenDrain_Mode;
  51.         P01_OpenDrain_Mode;

  52.         P_OUT_0 = 1;
  53.         P_OUT_1 = 1;
  54.         P_OUT_2 = 1;
  55.         P_OUT_3 = 1;
  56.         P_OUT_4 = 1;
  57.         P_OUT_5 = 1;

  58.         for(i = 0; i < 36; i++)
  59.         {
  60.                 gKeyPressCnt[i] = 0; //按鍵計數(shù)清零
  61.                 gKeyState[i] = 0;         //按鍵狀態(tài)清零
  62.         }
  63.         gScanCnt = 0;                         //掃描計數(shù)清零
  64. }


  65. void Send_Data_To_UART(unsigned char r_data)
  66. {
  67.         TI = 0;
  68.         SBUF = r_data;
  69.         while(TI==0);
  70. }

  71. void Send_Key_State(uint8_t Key, uint8_t UpDown)
  72. {      
  73.         uint8_t i;
  74.         uint8_t Check =0;            //00000000                                                                                               
  75.         gUartBuf[0] = 0xaa;     //10101010                   10101010                       
  76.         gUartBuf[1] = 0x55;          //01010101                          11111111
  77.         gUartBuf[2] = Key;                 //00000000
  78.         gUartBuf[3] = UpDown;        //00000000/00000001               
  79.     for (i = 0; i < 4; i++)
  80.         {
  81.                 Check ^= gUartBuf[i];
  82.         }
  83.         gUartBuf[4] = Check;                                                                                                               
  84.         for (i = 0; i < 5; i++)                                                                                                      
  85.         {
  86.                 Send_Data_To_UART(gUartBuf[i]);
  87.       
  88.         }
  89. }
  90. void KeyBoard_ReadInput(uint8_t Line)  
  91. {      
  92.         Line *= 6;                                                //Line=Line*6         
  93.         if (P_IN_0 == 0)                              
  94.         {
  95.                 gKeyPressCnt[Line]++;                        
  96.         }
  97.         if (P_IN_1 == 0)                              
  98.         {
  99.                 gKeyPressCnt[Line + 1]++;
  100.         }
  101.         if (P_IN_2 == 0)                                 
  102.         {
  103.                 gKeyPressCnt[Line + 2]++;
  104.         }
  105.         if (P_IN_3 == 0)
  106.         {
  107.                 gKeyPressCnt[Line + 3]++;
  108.         }
  109.         if (P_IN_4 == 0)
  110.         {
  111.                 gKeyPressCnt[Line + 4]++;
  112.         }
  113.         if (P_IN_5 == 0)
  114.         {
  115.                 gKeyPressCnt[Line + 5]++;
  116.         }
  117. }
  118. void UART_Init()                //串口初始化
  119. {
  120.         P06 = 1;
  121.         P07 = 1;

  122.         TI = 0;                                //標(biāo)志位清零
  123.         RI = 0;                                
  124.       
  125.         B8EN = 0;                         //關(guān)閉串口第九位
  126.                                                                                                          
  127.         SOVRH = 0x00;                        //波特率高兩位
  128.         SOVRL =        BR_16M_115200;                //波特率低八位         

  129.         REN = 1;                        //串口使能位
  130. }  

  131. void KeyBoard_ScanOnce(void)
  132. {
  133.         uint8_t i;                                         
  134.         P_OUT_0 = 0;                                 
  135.         KeyBoard_ReadInput(0);                 
  136.         P_OUT_0 = 1;                                 

  137.         P_OUT_1 = 0;
  138.         KeyBoard_ReadInput(1);
  139.         P_OUT_1 = 1;

  140.         P_OUT_2 = 0;
  141.         KeyBoard_ReadInput(2);
  142.         P_OUT_2 = 1;

  143.         P_OUT_3 = 0;
  144.         KeyBoard_ReadInput(3);         
  145.         P_OUT_3 = 1;

  146.         P_OUT_4 = 0;
  147.         KeyBoard_ReadInput(4);
  148.         P_OUT_4 = 1;

  149.         P_OUT_5 = 0;
  150.         KeyBoard_ReadInput(5);
  151.         P_OUT_5 = 1;

  152.         gScanCnt++;
  153.         if (gScanCnt >= SCAN_TIMES)                   //掃描次數(shù)大于上線
  154.         {
  155.                 gScanCnt = 0;                                   //掃描次數(shù)清零
  156.                 for(i = 0; i < 36; i++)                  
  157.                 {  
  158.                         if (gKeyPressCnt[i] >= PUSH_TIMES)//判斷按鍵按下
  159.                         {
  160.                                 if (!gKeyState[i])           // 如果按鍵按下
  161.                                 {
  162.                                         gKeyState[i] = 1;  //串口發(fā)送按鍵按下
  163.                                          Send_Key_State(i,1);//發(fā)送按鍵狀態(tài)1
  164.                                 }
  165.                         }
  166.                         else
  167.                         {
  168.                                 if (gKeyState[i])           //按鍵松開
  169.                                 {
  170.                                         gKeyState[i] = 0;  //串口發(fā)送按鍵抬起
  171.                                         Send_Key_State(i,0);//發(fā)送按鍵狀態(tài)0
  172.                                 }
  173.                         }
  174.                 }
  175.                 for(i = 0; i < 36; i++)                     
  176.                 {                                                         
  177.                         gKeyPressCnt[i] = 0;                //按鍵計數(shù)清零
  178.                 }
  179.         }
  180.         else
  181.         {
  182.                 delay();
  183.         }
  184. }

  185. void main (void)
  186. {
  187.         Set_All_GPIO_PushPull_Mode;                                  // Define in Function_define.h
  188.         UART_Init();                                                          //初始化
  189.         IO_Init();                                                                  //初始化
  190.         WDTEN;
  191.           while(1)
  192.         {
  193.                 WDTCLR;
  194.                 KeyBoard_ScanOnce();
  195.         }


  196. }
復(fù)制代碼


回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 成人欧美一区二区三区黑人孕妇 | www.se91| 国产精品亚洲片在线播放 | 在线色网| 亚洲天堂一区 | 国产精品日韩在线观看 | 亚洲成色777777在线观看影院 | 国产精品夜夜夜一区二区三区尤 | 久久久久久久久久久91 | 国产在线一区二 | 成人欧美一区二区 | 国产精品久久久久无码av | 国产亚洲成av人片在线观看桃 | 亚洲久草 | 欧美日一区 | 操操操日日日 | 在线观看视频一区二区三区 | 日本精品在线观看 | 国产精品成人一区 | 91精品久久久久久久久中文字幕 | 国产在线成人 | 一区二区三区视频在线 | 天天操,夜夜爽 | 欧美1区 | 在线播放一区 | 性视频网 | 中文字幕 在线观看 | 亚洲国产成人久久综合一区,久久久国产99 | 中文字幕av在线 | 国产精品久久久久一区二区三区 | 日韩毛片| 亚洲精品在线免费播放 | 毛片免费看 | 一区二区三区免费网站 | 欧美精品一级 | 91久久国产| 午夜影晥 | 欧美操操操 | 综合网在线 | 亚洲国产精品久久久久婷婷老年 | 一区二区视频在线 |