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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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

[復制鏈接]
跳轉到指定樓層
樓主
鍵盤掃描仿真原理圖如下(proteus的仿真工程文件可以到附件中下載):




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

查看全部評分

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

使用道具 舉報

無效樓層,該帖已經被刪除
板凳
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精品国模一区二区三区 | 久久99精品久久久 | 色综合久久88色综合天天 | 久久午夜国产精品www忘忧草 | 免费看爱爱视频 | 精品国产一级 | 亚洲高清在线 | 亚洲精品国产第一综合99久久 | 国产一级一级国产 | 久久中文字幕一区 | 亚洲精品乱码久久久久久黑人 | 一区二区视频在线 | 亚洲精品99 | 青草青草久热精品视频在线观看 | 中文字幕在线三区 | 日本视频中文字幕 | 欧美色综合网 | a久久 | 国产精品国产三级国产aⅴ中文 | 超碰成人在线观看 | 国产日韩欧美二区 | 中文字幕第一页在线 | 视频一区二区在线观看 | 亚洲精品久久久一区二区三区 | 亚洲成人久久久 | 国产黄色大片 | 夜久久 | av 一区二区三区 | 欧美成人激情视频 |