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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3368|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)IO行列掃描鍵盤數(shù)碼管顯示鍵值和調(diào)整時(shí)間

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:350005 發(fā)表于 2018-7-17 15:49 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
  1. #define         MAIN_Fosc                22118400L        //定義主時(shí)鐘

  2. #include        "STC15Fxxxx.H"


  3. #define        Timer0_Reload        (65536UL -(MAIN_Fosc / 1000))                //Timer 0 中斷頻率, 1000次/秒

  4. #define DIS_DOT                0x20
  5. #define DIS_BLACK        0x10
  6. #define DIS_                0x11




  7. u8 code t_display[]={                                                //標(biāo)準(zhǔn)字庫
  8. //         0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F
  9.         0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
  10. //black         -     H    J         K          L           N        o   P         U     t    G    Q    r   M    y
  11.         0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
  12.         0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46};        //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1

  13. u8 code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};                //位碼


  14. sbit        P_HC595_SER   = P4^0;        //pin 14        SER                data input
  15. sbit        P_HC595_RCLK  = P5^4;        //pin 12        RCLk        store (latch) clock
  16. sbit        P_HC595_SRCLK = P4^3;        //pin 11        SRCLK        Shift data clock


  17. u8         LED8[8];                //顯示緩沖
  18. u8        display_index;        //顯示位索引
  19. bit        B_1ms;                        //1ms標(biāo)志

  20. u8        KeyCode;        //給用戶使用的鍵碼, 1~16有效
  21. u8        cnt10ms;

  22. u8 IO_KeyState, IO_KeyState1, IO_KeyHoldCnt;        //行列鍵盤變量
  23. u8        cnt50ms;

  24. u8        hour,minute,second;        //RTC變量
  25. u16        msecond;

  26. void        IO_KeyScan(void);        //50ms call




  27. /********************** 顯示時(shí)鐘函數(shù) ************************/
  28. void        DisplayRTC(void)
  29. {
  30.         if(hour >= 10)        LED8[0] = hour / 10;
  31.         else                        LED8[0] = DIS_BLACK;
  32.         LED8[1] = hour % 10;
  33.         LED8[2] = minute / 10;
  34.         LED8[3] = minute % 10;
  35.         if(msecond >= 500)                LED8[1] |= DIS_DOT;        //小時(shí)后的小數(shù)點(diǎn)做秒閃
  36. }

  37. /********************** RTC演示函數(shù) ************************/
  38. void        RTC(void)
  39. {
  40.         if(++second >= 60)
  41.         {
  42.                 second = 0;
  43.                 if(++minute >= 60)
  44.                 {
  45.                         minute = 0;
  46.                         if(++hour >= 24)        hour = 0;
  47.                 }
  48.         }
  49. }

  50. /**********************************************/
  51. void main(void)
  52. {
  53.         u8        i;
  54.         
  55.         P0M1 = 0;        P0M0 = 0;        //設(shè)置為準(zhǔn)雙向口
  56.         P1M1 = 0;        P1M0 = 0;        //設(shè)置為準(zhǔn)雙向口
  57.         P2M1 = 0;        P2M0 = 0;        //設(shè)置為準(zhǔn)雙向口
  58.         P3M1 = 0;        P3M0 = 0;        //設(shè)置為準(zhǔn)雙向口
  59.         P4M1 = 0;        P4M0 = 0;        //設(shè)置為準(zhǔn)雙向口
  60.         P5M1 = 0;        P5M0 = 0;        //設(shè)置為準(zhǔn)雙向口
  61.         P6M1 = 0;        P6M0 = 0;        //設(shè)置為準(zhǔn)雙向口
  62.         P7M1 = 0;        P7M0 = 0;        //設(shè)置為準(zhǔn)雙向口


  63.         display_index = 0;
  64.         
  65.         AUXR = 0x80;        //Timer0 set as 1T, 16 bits timer auto-reload,
  66.         TH0 = (u8)(Timer0_Reload / 256);
  67.         TL0 = (u8)(Timer0_Reload % 256);
  68.         ET0 = 1;        //Timer0 interrupt enable
  69.         TR0 = 1;        //Tiner0 run
  70.         EA = 1;                //打開總中斷
  71.         
  72.         for(i=0; i<8; i++)        LED8[i] = 0x10;        //上電消隱

  73.         hour   = 12;        //初始化時(shí)間值
  74.         minute = 0;
  75.         second = 0;
  76.         DisplayRTC();

  77.         KeyCode = 0;        //給用戶使用的鍵碼, 1~16有效
  78.         cnt10ms = 0;

  79.         IO_KeyState = 0;
  80.         IO_KeyState1 = 0;
  81.         IO_KeyHoldCnt = 0;
  82.         cnt50ms = 0;
  83.         
  84.         while(1)
  85.         {
  86.                 if(B_1ms)        //1ms到
  87.                 {
  88.                         B_1ms = 0;
  89.                         if(++msecond >= 1000)        //1秒到
  90.                         {
  91.                                 msecond = 0;
  92.                                 RTC();
  93.                                 DisplayRTC();
  94.                         }
  95.                         if(msecond == 500)        DisplayRTC();        //小時(shí)后的小數(shù)點(diǎn)做秒閃


  96.                         if(++cnt50ms >= 50)                //50ms掃描一次行列鍵盤
  97.                         {
  98.                                 cnt50ms = 0;
  99.                                 IO_KeyScan();
  100.                         }
  101.                         
  102.                         if(KeyCode > 0)                //有鍵按下
  103.                         {
  104.                                 LED8[6] = KeyCode / 10;        //顯示鍵碼
  105.                                 LED8[7] = KeyCode % 10;        //顯示鍵碼

  106.                                 if(KeyCode == 17)        //hour +1
  107.                                 {
  108.                                         if(++hour >= 24)        hour = 0;
  109.                                         DisplayRTC();
  110.                                 }
  111.                                 if(KeyCode == 18)        //hour -1
  112.                                 {
  113.                                         if(--hour >= 24)        hour = 23;
  114.                                         DisplayRTC();
  115.                                 }
  116.                                 if(KeyCode == 19)        //minute +1
  117.                                 {
  118.                                         second = 0;
  119.                                         if(++minute >= 60)        minute = 0;
  120.                                         DisplayRTC();
  121.                                 }
  122.                                 if(KeyCode == 20)        //minute -1
  123.                                 {
  124.                                         second = 0;
  125.                                         if(--minute >= 60)        minute = 59;
  126.                                         DisplayRTC();
  127.                                 }

  128.                                 KeyCode = 0;
  129.                         }

  130.                 }
  131.         }
  132. }
  133. /**********************************************/

  134.         

  135. /*****************************************************
  136.         行列鍵掃描程序
  137.         使用XY查找4x4鍵的方法,只能單鍵,速度快

  138.    Y     P04      P05      P06      P07
  139.           |        |        |        |
  140. X         |        |        |        |
  141. P00 ---- K00 ---- K01 ---- K02 ---- K03 ----
  142.           |        |        |        |
  143. P01 ---- K04 ---- K05 ---- K06 ---- K07 ----
  144.           |        |        |        |
  145. P02 ---- K08 ---- K09 ---- K10 ---- K11 ----
  146.           |        |        |        |
  147. P03 ---- K12 ---- K13 ---- K14 ---- K15 ----
  148.           |        |        |        |
  149. ******************************************************/


  150. u8 code T_KeyTable[16] = {0,1,2,0,3,0,0,0,4,0,0,0,0,0,0,0};

  151. void IO_KeyDelay(void)
  152. {
  153.         u8 i;
  154.         i = 60;
  155.         while(--i)        ;
  156. }

  157. void        IO_KeyScan(void)        //50ms call
  158. {
  159.         u8        j;

  160.         j = IO_KeyState1;        //保存上一次狀態(tài)

  161.         P0 = 0xf0;        //X低,讀Y
  162.         IO_KeyDelay();
  163.         IO_KeyState1 = P0 & 0xf0;

  164.         P0 = 0x0f;        //Y低,讀X
  165.         IO_KeyDelay();
  166.         IO_KeyState1 |= (P0 & 0x0f);
  167.         IO_KeyState1 ^= 0xff;        //取反
  168.         
  169.         if(j == IO_KeyState1)        //連續(xù)兩次讀相等
  170.         {
  171.                 j = IO_KeyState;
  172.                 IO_KeyState = IO_KeyState1;
  173.                 if(IO_KeyState != 0)        //有鍵按下
  174.                 {
  175.                         F0 = 0;
  176.                         if(j == 0)        F0 = 1;        //第一次按下
  177.                         else if(j == IO_KeyState)
  178.                         {
  179.                                 if(++IO_KeyHoldCnt >= 20)        //1秒后重鍵
  180.                                 {
  181.                                         IO_KeyHoldCnt = 18;
  182.                                         F0 = 1;
  183.                                 }
  184.                         }
  185.                         if(F0)
  186.                         {
  187.                                 j = T_KeyTable[IO_KeyState >> 4];
  188.                                 if((j != 0) && (T_KeyTable[IO_KeyState& 0x0f] != 0))
  189.                                         KeyCode = (j - 1) * 4 + T_KeyTable[IO_KeyState & 0x0f] + 16;        //計(jì)算鍵碼,17~32
  190.                         }
  191.                 }
  192.                 else        IO_KeyHoldCnt = 0;
  193.         }
  194.         P0 = 0xff;
  195. }




  196. /**************** 向HC595發(fā)送一個(gè)字節(jié)函數(shù) ******************/
  197. void Send_595(u8 dat)
  198. {               
  199.         u8        i;
  200.         for(i=0; i<8; i++)
  201.         {
  202.                 dat <<= 1;
  203.                 P_HC595_SER   = CY;
  204.                 P_HC595_SRCLK = 1;
  205.                 P_HC595_SRCLK = 0;
  206.         }
  207. }

  208. /********************** 顯示掃描函數(shù) ************************/
  209. void DisplayScan(void)
  210. {        
  211.         Send_595(~T_COM[display_index]);                                //輸出位碼
  212.         Send_595(t_display[LED8[display_index]]);        //輸出段碼

  213.         P_HC595_RCLK = 1;
  214.         P_HC595_RCLK = 0;                                                        //鎖存輸出數(shù)據(jù)
  215.         if(++display_index >= 8)        display_index = 0;        //8位結(jié)束回0
  216. }


  217. /********************** Timer0 1ms中斷函數(shù) ************************/
  218. void timer0 (void) interrupt TIMER0_VECTOR
  219. {
  220.         DisplayScan();        //1ms掃描顯示一位
  221.         B_1ms = 1;                //1ms標(biāo)志
  222. }
復(fù)制代碼

評(píng)分

參與人數(shù) 1黑幣 +15 收起 理由
564654654 + 15 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久亚洲国产精品日日av夜夜 | 国产一区二区在线免费 | 欧美乱大交xxxxx另类电影 | av av在线| 黑人巨大精品欧美一区二区免费 | 欧美日韩在线观看视频 | 91xxx在线观看 | 国产精品福利久久久 | 成人h视频在线观看 | 亚洲一区二区在线视频 | 欧美一区二区三区的 | 亚洲嫩草 | 天堂综合网 | 天堂视频一区 | 日韩三级在线 | 国产二区av| 一区视频在线免费观看 | 久久久久国产精品免费免费搜索 | 久久久免费 | 日韩成人在线播放 | 国产精品久久久久久久久久久久 | 99久久精品国产一区二区三区 | 免费看av大片 | 国产美女久久 | 国户精品久久久久久久久久久不卡 | 久久国产精品一区二区三区 | 久久久久国产一区二区三区四区 | 国产综合久久久久久鬼色 | 9191在线播放 | 视频1区2区| 国产高清在线观看 | 国内久久精品 | 亚洲 欧美 日韩在线 | 日韩久久久久久 | 成人福利在线观看 | 成人影| 国产xxxx搡xxxxx搡麻豆 | 先锋资源吧 | 古典武侠第一页久久777 | 国产免费一区二区三区网站免费 | 久久精品国产亚洲一区二区 |