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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

包含長短按組合按鍵的單片機矩陣鍵盤掃描C語言程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:467203 發表于 2024-2-26 16:33 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
分享一個剛開始學51時的一個矩陣鍵盤掃描程序
算法還是比較簡單的,供初學者學習
單片機源程序如下:
  1. <span style="line-height: 1.5;">//此程序可以實現短按鍵、長按鍵、組合鍵三種操作。雙擊按鍵操作還未實現,要進一步研究</span>
  2. //
  3. #include<reg52.h>

  4. #define uchar unsigned char
  5. #define uint unsigned int

  6. uchar flag;

  7. uchar key;
  8. bit key_flag;
  9. bit time_10ms_ok=0;
  10. bit time_2ms_ok=0;
  11. sbit dula=P2^6;                //段選信號的鎖存器控制
  12. sbit wela=P2^7;                //位選信號的鎖存器控

  13. uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
  14.                         0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
  15. uchar code wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
  16.                                                 //數碼管各位的碼表
  17. void delay(unsigned int i)
  18. {
  19. unsigned int m,n;
  20. for(m=i;m>0;m--)
  21. for(n=90;n>0;n--);
  22. }

  23. void display(uchar a,b,c,d,e,f)
  24. {
  25. P0=table[a];
  26. dula=1;
  27. dula=0;
  28. P0=wei[0];
  29. wela=1;
  30. wela=0;
  31. delay(5);

  32. P0=table[b];
  33. dula=1;
  34. dula=0;
  35. P0=wei[1];
  36. wela=1;
  37. wela=0;
  38. delay(5);

  39. P0=table[c];
  40. dula=1;
  41. dula=0;
  42. P0=wei[2];
  43. wela=1;
  44. wela=0;
  45. delay(5);

  46. P0=table[d];
  47. dula=1;
  48. dula=0;
  49. P0=wei[3];
  50. wela=1;
  51. wela=0;
  52. delay(5);

  53. P0=table[e];
  54. dula=1;
  55. dula=0;
  56. P0=wei[4];
  57. wela=1;
  58. wela=0;
  59. delay(5);

  60. P0=table[f];
  61. dula=1;
  62. dula=0;
  63. P0=wei[5];
  64. wela=1;
  65. wela=0;
  66. delay(5);
  67. }


  68. void InitTimer0(void)
  69. {
  70.   TMOD = 0x01;
  71.   TH0 = 0xFC;//延時1ms,請在中斷處理函數中,重新裝入該數值。
  72.   TL0 = 0x6;
  73.   TR0=1;
  74.   EA = 1;
  75.   ET0 = 1;
  76. }

  77. void Timer0Interrupt(void) interrupt 1
  78. {
  79. TH0 = 0xFC;//延時1ms,請在中斷處理函數中,重新裝入該數值。
  80. TL0 = 0x6;
  81. flag++;
  82. if(flag==10)
  83. {flag=0;
  84.   time_10ms_ok=1;}
  85. if(flag%2==0)
  86.   time_2ms_ok=1;
  87. }


  88. uchar KeyRead( void )
  89. {
  90.   uchar ReadData;        // 讀按鍵的實時值
  91.   static uchar i;         //長按鍵按下時間計數
  92.   static uchar trg,cont,cont1;        //按鍵按下時的狀態,trg用來描述短按鍵,cont用來描述長按鍵

  93.   P3=0x0f;
  94.   ReadData=P3;
  95.   P3=0xf0;
  96.   ReadData=(ReadData | P3)^0xff;

  97. //if...else;        語句作用 是當第一次按鍵按下時,退出按鍵掃描程序,
  98. //一來可以實現消抖,二來可以防止第一次按下按鍵時,程序剛好執行到按鍵掃描程序的中間部分,造成結果不準確
  99.   if(ReadData==cont1)                                          
  100.   {
  101.    trg  = ReadData & (ReadData ^ cont);
  102.    cont = ReadData;
  103.   }
  104.    else
  105.   {
  106.    cont1=ReadData;
  107.   return;
  108.    }


  109.   if(cont)                                        //長按鍵計時
  110.   {
  111.    i++;
  112.   }
  113.   else                                           //按鍵釋放時
  114.   {
  115.   i=0;
  116.   return;
  117.   }


  118. switch(trg)
  119. {
  120.   case 0x11:   key=0;key_flag=1;  break;
  121.   case 0x21:   key=1;key_flag=1;  break;
  122.   case 0x41:   key=2;key_flag=1;  break;
  123.   case 0x61:   key=8;key_flag=1;  break;  //1和2同時按下組成的組合鍵
  124.   case 0x81:   key=3;key_flag=1;  break;
  125.   case 0x12:   key=4;key_flag=1;  break;
  126.   case 0x22:   key=5;key_flag=1;  break;
  127.   case 0x42:   key=6;key_flag=1;  break;
  128.   case 0x82:   key=7;key_flag=1;  break;   
  129.   case 0x14:   key=8;key_flag=1;  break;
  130.   case 0x24:   key=9;key_flag=1;  break;
  131.   case 0x44:   key=10;key_flag=1; break;
  132.   case 0x84:   key=11;key_flag=1; break;
  133.   case 0x18:   key=12;key_flag=1;  break;
  134.   case 0x28:   key=13;key_flag=1;  break;
  135.   case 0x48:   key=14;key_flag=1; break;
  136.   case 0x88:   key=15;key_flag=1;  break;
  137. }

  138. if(i==100)
  139. {
  140.   i=90;
  141.   switch(cont)
  142.   {
  143.    case 0x11:   key++;key_flag=1;  break;
  144.   case 0x21:   key++;;key_flag=1;  break;
  145.   case 0x41:   key++;;key_flag=1;  break;
  146.   case 0x81:   key++;;key_flag=1;  break;
  147.   case 0x12:   key++;;key_flag=1;  break;
  148.   case 0x22:   key++;;key_flag=1;  break;
  149.   case 0x42:   key++;;key_flag=1;  break;
  150.   case 0x82:   key++;;key_flag=1;  break;   
  151.   case 0x14:   key++;;key_flag=1;  break;
  152.   case 0x24:   key++;;key_flag=1;  break;
  153.   case 0x44:   key++;;key_flag=1; break;
  154.   case 0x84:   key++;;key_flag=1; break;
  155.   case 0x18:   key++;;key_flag=1;  break;
  156.   case 0x28:   key++;;key_flag=1;  break;
  157.   case 0x48:   key++;;key_flag=1; break;
  158.   case 0x88:   key++;;key_flag=1;  break;     
  159.   }
  160. }
  161. return key;
  162. }

  163. void main(void)
  164. {
  165. uchar a,b,c,d,e,f;
  166. InitTimer0();
  167. while(1)
  168. {
  169. if(key_flag )
  170.   {
  171.     key_flag=0;
  172.     f=e;
  173.     e=d;
  174.     d=c;
  175.     c=b;
  176.     b=a;
  177.     a=key;
  178.   }       
  179.   if(time_10ms_ok)
  180.    {
  181.     time_10ms_ok=0;
  182.     KeyRead();

  183.    }
  184.   display(a,b,c,d,e,f);
  185. }
  186. }
復制代碼


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

使用道具 舉報

沙發
ID:1064915 發表于 2024-2-27 10:42 | 只看該作者
TH0 = 0xFC;//延時1ms,51@11.0592mhz
TL0 = 0x66;
漏寫6
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: www.yw193.com| 色综合欧美 | 精品在线看 | 黄色一级毛片免费看 | 九九爱这里只有精品 | 无码日韩精品一区二区免费 | 久久国产精品久久久久久久久久 | 中文字幕第一页在线 | 人人爱干 | 国产成人精品一区二区三区 | 国产丝袜一区二区三区免费视频 | 91伦理片| av国产在线观看 | 国产在线视频在线观看 | 香蕉视频在线播放 | 日本精品久久久久 | 国产精品国产a级 | 亚洲va欧美va天堂v国产综合 | 天天看天天干 | 99re在线| 欧美成人一区二区 | 天天综合久久 | 中文字幕亚洲欧美 | 亚洲瑟瑟| 免费的av网站 | 久久久久久久久久久久久久国产 | 99精品电影| 免费啪啪| 九九导航 | 91av在线视频观看 | 成人在线视频免费看 | 美女午夜影院 | 男女网站免费 | 999精品在线 | 日韩一区在线播放 | 九九伦理电影 | 免费黄色a视频 | 曰韩一二三区 | 99精品电影 | 国产视频精品区 | a视频在线观看 |