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

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

QQ登錄

只需一步,快速開(kāi)始

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

單片機(jī)任意IO組合實(shí)現(xiàn)矩陣按鍵的程序

[復(fù)制鏈接]
ID:734940 發(fā)表于 2022-11-13 22:51 | 顯示全部樓層 |閱讀模式
單片機(jī)源程序如下:
  1. #include "STC32G.h"
  2. sbit C4 = P2^7;
  3. sbit C3 = P2^6;
  4. sbit C2 = P2^5;
  5. sbit C1 = P2^4;
  6. sbit R1 = P2^3;
  7. sbit R2 = P2^2;
  8. sbit R3 = P2^1;
  9. sbit R4 = P4^1;
  10. //理論可以使用任意io,不僅限P0、P1 ……
  11. unsigned char S16 = 0;
  12. bit        _1msPast = 0;
  13. bit busy;//串口忙
  14. bit keypressed = 0;//有鍵按下位
  15. //僅支持單按鍵,鍵在松開(kāi)后執(zhí)行操作。

  16. void KeyScan()
  17. {        //每個(gè)毫秒掃描一次,
  18.         unsigned char keys;//檢測(cè)到按下的鍵值
  19.         static unsigned char pressMscount,looseMscount,pressednum;//按下毫秒計(jì)數(shù),松開(kāi)毫秒計(jì)數(shù),按下的鍵值
  20.         C1 = C2 = C3 = C4 = 1;
  21.         R1 = R2 = R3 = R4 = 0;
  22.         keys = !C1 * 1 + !C2 * 2 + !C3 * 3 + !C4 * 4;
  23.         C1 = C2 = C3 = C4 = 0;
  24.         R1 = R2 = R3 = R4 = 1;
  25.         keys += !R1 * 0 + !R2 * 4 + !R3 * 8 + !R4 * 12;
  26.         C1 = C2 = C3 = C4 = R1 = R2 = R3 = R4 = 0;
  27.         if(keys != 0)
  28.         {
  29.                 //當(dāng)有鍵按下時(shí),
  30.                 if(keypressed == 0)
  31.                 //如果鍵按下標(biāo)志位為0,則說(shuō)明突然有鍵按下,開(kāi)始按下消抖計(jì)時(shí)
  32.                 {
  33.                         pressMscount += 1;
  34.                         while(pressMscount == 25)
  35.                         {
  36.                                 //計(jì)數(shù)達(dá)到25時(shí)確定有鍵按下,置keypressed位為1
  37.                                 keypressed = 1;
  38.                                 pressMscount = 0;
  39.                                 pressednum = keys;
  40.                         }
  41.                 }
  42.         }
  43.         else
  44.         {//如果無(wú)鍵按下,或者處于抖動(dòng)狀態(tài),則清除計(jì)數(shù)
  45.                 //如果剛剛處于有鍵按下?tīng)顟B(tài),則說(shuō)明到達(dá)按鍵松開(kāi)階段,鍵按下標(biāo)志取消
  46.                 if(keypressed == 1)
  47.                 {
  48.                         looseMscount +=1;
  49.                         while(looseMscount == 25)
  50.                         {
  51.                                 //計(jì)數(shù)達(dá)到25時(shí)確定按鍵已松開(kāi),置keypressed位為0,發(fā)送剛剛按下的按鍵
  52.                                 keypressed = 0;
  53.                                 looseMscount = 0;
  54.                                 S16 = pressednum;
  55.                                 //松開(kāi)抖動(dòng)
  56.                         }
  57.                 }else if(keypressed == 0){
  58.                         //如果按下標(biāo)志位為0,可能是處于無(wú)鍵按下?tīng)顟B(tài),或者處于按下抖動(dòng)狀態(tài)
  59.                         pressMscount = 0;
  60.                 }
  61.         }
  62. }

  63. //定時(shí)器0設(shè)置
  64. void T0Set()
  65. {        
  66.         AUXR &= 0x7F;                //定時(shí)器時(shí)鐘12T模式
  67.         TMOD &= 0xF0;                //設(shè)置定時(shí)器模式
  68.         TL0 = 0x33;                //設(shè)置定時(shí)初始值
  69.         TH0 = 0xF5;                //設(shè)置定時(shí)初始值        //1毫秒@33.1776MHz
  70.         TF0 = 0;                //清除TF0標(biāo)志
  71.         TR0 = 1;                        //啟動(dòng)定時(shí)器
  72. }
  73. //在定時(shí)器0里進(jìn)行毫秒累加
  74. void T0Action() interrupt 1
  75. {
  76.         _1msPast = 1;
  77. }
  78. //在main里監(jiān)測(cè)到毫秒累加為1時(shí)執(zhí)行動(dòng)作,并歸零毫秒累加。
  79. void DealTimeInMain()
  80. {
  81.         while(_1msPast == 1)
  82.         {
  83.                 KeyScan();
  84.         _1msPast = 0;
  85.         }
  86. }
  87. //================================
  88. //發(fā)送字節(jié)
  89. void SendData(char dat)
  90. {
  91.     while (busy);           //Wait for the completion of the previous data is sent
  92.     ACC = dat;
  93.           if (P)                  //Set the parity bit according to P
  94.     {
  95.         TB8 = 1;            //Set parity bit to 1
  96.     }
  97.     else
  98.     {
  99.         TB8 = 0;            //Set parity bit to 0
  100.     }
  101.     busy = 1;
  102.     SBUF = ACC;             //Send data to UART buffer
  103. }

  104. char putchar(char c)
  105. {
  106.         SendData(c);
  107.         return c;
  108. }
  109. //串口1配置
  110. void UartInit()
  111. {
  112.         SCON = 0x50;        //8位數(shù)據(jù),可變波特率
  113.         AUXR &= 0xBF;        //定時(shí)器時(shí)鐘12T模式
  114.         AUXR &= 0xFE;        //串口1選擇定時(shí)器1為波特率發(fā)生器
  115.         TMOD &= 0x0F;        //設(shè)置定時(shí)器模式
  116.         TL1 = 0xFA;                //設(shè)置定時(shí)初始值
  117.         TH1 = 0xFF;                //設(shè)置定時(shí)初始值
  118.         ET1 = 0;                //禁止定時(shí)器%d中斷
  119.         TR1 = 1;                //定時(shí)器1開(kāi)始計(jì)時(shí)
  120.     busy = 0;
  121. }
  122. //串口通信
  123. void UartIsr() interrupt 4
  124. {
  125.         if (RI)
  126.         {
  127.                 RI = 0;             //Clear receive interrupt flag
  128.         }
  129.         if (TI)
  130.         {
  131.                 TI = 0;             //Clear transmit interrupt flag
  132.                 busy = 0;           //Clear transmit busy flag
  133.         }
  134. }
  135. void main()
  136. {
  137.         
  138.         EAXFR = 1;
  139.     P0M0 = 0x00;
  140.     P0M1 = 0x00;
  141.     P1M0 = 0x00;
  142.         P1M1 = 0x00;
  143.     P2M0 = 0x00;
  144.     P2M1 = 0x00;
  145.     P3M0 = 0x00;
  146.     P3M1 = 0x00;
  147.     P4M0 = 0x00;
  148.     P4M1 = 0x00;
  149.     P5M0 = 0x00;
  150.     P5M1 = 0x00;
  151.     P6M0 = 0x00;
  152.     P6M1 = 0x00;
  153.     P7M0 = 0x00;
  154.     P7M1 = 0x00;

  155.     UartInit();

  156.         T0Set();
  157. //        IT0 = 1;
  158.         ET0 = 1;                           //使能定時(shí)器0中斷
  159.     ES = 1;                                //使能串口1中斷
  160.     EA = 1;                                //使能總中斷
  161.         
  162.     while (1)
  163.     {
  164.                 DealTimeInMain();
  165.                 while(S16!=0)
  166.                 {//檢測(cè)到按鍵,執(zhí)行動(dòng)作
  167.                         printf("S%d被按下\r\n",S16);
  168.                         S16=0;
  169.                 }
  170.         }
  171. }
復(fù)制代碼

STC32G開(kāi)發(fā)板和矩陣按鍵模塊.jpg

此代碼可以直接用于STC32G屠龍刀系列,波特率33.1776,C1234 R4321分別接:
C4 → P2^7;
C3 → P2^6;
C2 → P2^5;
C1 → P2^4;
R1 → P2^3;
R2 → P2^2;
R3 → P2^1;
R4 → P4^1;

按下S1-S16,然后松開(kāi)會(huì)向串口返回按下的值,僅支持單鍵按下,多鍵會(huì)返回錯(cuò)誤的值。不支持長(zhǎng)按。
2.png

評(píng)分

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

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:1042619 發(fā)表于 2022-11-14 11:42 | 顯示全部樓層
            感謝樓主精彩分享!另外從 STC-ISP V6.90T 以上版本的 ISP燒錄/輔助開(kāi)發(fā)工具包一體化軟件的增加了I/O口配置小工具、增加將程序最小化到系統(tǒng)托盤(pán)區(qū),提升幸福感小工具越來(lái)越多了.
JPG.3.png
jpg.4.jpg
JPG.1.png
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表