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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2853|回復: 2
收起左側

單片機矩陣鍵盤掃描仿真加源代碼

[復制鏈接]
ID:210524 發表于 2017-6-12 17:25 | 顯示全部樓層 |閱讀模式
鍵盤掃描仿真原理圖如下(proteus的仿真工程文件可以到附件中下載):

0.png 0.png


51單片機源代碼如下:
  1. #include <reg51.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int   
  5. #define out P2
  6. #define outk P1
  7. #define N 3

  8. void delayms(uint);
  9. uchar scan(void);

  10. void main(void)
  11. {
  12.         uchar key,i;
  13.         while(1)
  14.         {
  15.                 key=scan();
  16.                 if(key!=0xff) {
  17.                 switch(key) {
  18.                 case 0:
  19.                 for(i=0;i<N;i++) {out=0xfe; delayms(100);
  20.                 out=0xff; delayms(100);
  21.                 } break;
  22.                 case 1: for(i=0;i<N;i++) {out=0xfd; delayms(100);
  23.                 out=0xff; delayms(100);
  24.                 } break;
  25.                 case 2: for(i=0;i<N;i++) {out=0xfb; delayms(100); out=0xff; delayms(100);
  26.                 }break;
  27.                 case 3: for(i=0;i<N;i++) {out=0xf7; delayms(100);out=0xff; delayms(100);
  28.                 } break;
  29.                 case 4: for(i=0;i<N;i++) {out=0xef; delayms(100);out=0xff; delayms(100);
  30.                 } break;
  31.                 case 5: for(i=0;i<N;i++) {out=0xdf; delayms(100); out=0xff; delayms(100);
  32.                 }break;
  33.                 case 6: for(i=0;i<N;i++) {out=0xbf; delayms(100);out=0xff; delayms(100);
  34.                 } break;
  35.                 case 7: for(i=0;i<N;i++) {out=0x7f; delayms(100);out=0xff; delayms(100);
  36.                 } break;
  37.                 case 8: for(i=0;i<N;i++) {out=0xfc; delayms(100);out=0xff; delayms(100);
  38.                 } break;
  39.                 case 9: for(i=0;i<N;i++) {out=0xf3; delayms(100);out=0xff; delayms(100);
  40.                 } break;
  41.                 case 10: for(i=0;i<N;i++) {out=0xcf; delayms(100);out=0xff; delayms(100);
  42.                 } break;
  43.                 case 11: for(i=0;i<N;i++) {out=0x3f; delayms(100); out=0xff; delayms(100);
  44.                 }break;
  45.                 case 12:
  46.                 for(i=0;i<N;i++) {out=0x00; delayms(100);
  47.                 out=0xff; delayms(100);
  48.                 } break;
  49.                 case 13: for(i=0;i<N;i++) {out=0xf8; delayms(100); out=0xff; delayms(100);
  50.                 }break;
  51.                 case 14: for(i=0;i<N;i++) {out=0xf0; delayms(100); out=0xff; delayms(100);
  52.                 }break;
  53.                 case 15: for(i=0;i<N;i++) {out=0x0f; delayms(100);out=0xff; delayms(100);
  54.                 } break;

  55.                 }}
  56.         }
  57. }
  58. // 延遲
  59. void delayms(uint j)
  60. {
  61.         uchar i;
  62.         for(;j>0;j--)
  63.         {
  64.                 i=250;
  65.                 while(--i);
  66.                 i=249;
  67.                 while(--i);
  68.            }
  69. }

  70. //鍵盤掃描函數
  71. //行線為0 掃描列
  72. uchar scan(void)                                          
  73. {

  74.         uchar k=16,m,n,in,a;
  75.         outk=0x0f;                //行線為0 掃描列
  76.         a=outk&0x0f;        //讀入列線值
  77.         if(a!=0x0f)                //檢測有無鍵按下
  78.         {
  79.         delayms(100);        //去抖
  80.         }
  81.         if(a!=0x0f) {        //檢測有無鍵按下
  82.       for(m=0;m<4;m++)      //m為列號
  83.                 {
  84.                         outk=~(0x10<<m); //按位左移

  85.                         for(n=0;n<4;n++)
  86.                         {
  87.                                 in=outk;
  88.                                 in=in>>n; //按位右移
  89.                                 if((in&0x01)==0)
  90.                                 {
  91.                                         delayms(10);
  92.                                         if((in&0x01)==0){k=4*n+m;break;}
  93.                                 }
  94.                         }
  95.                         if(k!=16){break;}
  96.                 }
  97.         }
  98.         return(k);
  99. }

  100.         /*
  101. // 列線為0 掃描行
  102.         uchar k=16,m,n,in,a;
  103.         outk=0xf0;                //列線為0 掃描行
  104.         a=outk&0xf0;        //讀入行線值
  105.         if(a!=0xf0)                //檢測有無鍵按下
  106.         {
  107.         delayms(100);        //去抖
  108.         }
  109.         if(a!=0xf0) {        //檢測有無鍵按下
  110.                 for(m=0;m<4;m++)      //m為行號
  111.                 {
  112.                         outk=~(0x01<<m); //按位左移

  113. ……………………

  114. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
鍵盤掃描.zip (44.67 KB, 下載次數: 20)


評分

參與人數 1黑幣 +5 收起 理由
vktpas + 5

查看全部評分

回復

使用道具 舉報

ID:399872 發表于 2018-9-19 10:37 | 顯示全部樓層
樓主分享的很有用,
回復

使用道具 舉報

ID:400024 發表于 2018-9-19 15:24 | 顯示全部樓層
感謝分享
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日本精品二区 | 国产天堂在线观看 | 欧美一区二区在线播放 | 中国美女乱淫免费看视频 | 91精品在线免费观看 | 欧美九九九 | 伊人av综合| 91色漫| 国产欧美日本 | 精品黄色 | 成年人免费视频网站 | 91精品国产综合久久久蜜臀 | 高清乱码男女免费观看 | 深夜福利网 | 欧美一级免费 | 国产视频三区 | 日韩一区二区免费视频 | 欧美日韩亚洲另类 | 亚洲精品综合 | 欧美片网站yy | 久久成人一区 | 欧美视频免费看 | 国产欧美激情 | 欧美日韩在线一区二区三区 | 成人深夜福利 | 国产精品一级 | 中文字幕一区二区三区四区 | 99精品久久久久久中文字幕 | 亚洲最大黄色网址 | 中文字幕日韩高清 | 久久机热这里只有精品 | 日韩欧美自拍 | 91精品国产日韩91久久久久久 | 成人高清| 91靠逼视频 | 中文字幕在线观看一区二区 | 视频一区二区在线 | 亚洲成人精品在线观看 | 国产美女免费 | 天天操夜夜操 | www.久草.com |