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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機矩陣鍵盤檢測程序-詳細注釋

[復制鏈接]
跳轉到指定樓層
樓主
ID:75005 發表于 2015-3-21 16:47 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#include <reg51.h>
#define uchar unsigned char
#define uint  unsigned int
uchar table[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,
0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xBF};
       //0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,-的顯示碼
sbit BEEP = P3^7;         //蜂鳴器驅動線
uchar disp_buf;            //顯示緩存
uchar  temp;   //暫存器
uchar  key;               //鍵順序嗎
/********以下是延時函數********/
void Delay_ms(uint xms)   
{
uint i,j;
for(i=xms;i>0;i--)        //i=xms即延時約xms毫秒
  for(j=110;j>0;j--);
}
/*********以下是蜂鳴器響一聲函數********/
void  beep()
{
  BEEP=0;       //蜂鳴器響
  Delay_ms(100);
  BEEP=1;           //關閉蜂鳴器
  Delay_ms(100);   
}
/********以下是矩陣按鍵掃描函數********/
void  MatrixKey()
{
P1=0xff;   
P1=0xef;    //置第1行P1.4為低電平,開始掃描第1行
temp=P1;    //讀P1口按鍵
temp=temp & 0x0f;   //判斷低4位是否有0,即判斷列線(P1.0~P1.3)是否有0
if (temp!=0x0f)   //若temp不等于0x0f,說明有鍵按下
{
  Delay_ms(10);  //延時10ms去抖  
  temp=P1;   //再讀取P1口按鍵
  temp=temp & 0x0f;  //再判斷列線(P1.0~P1.3)是否有0
  if (temp!=0x0f)  //若temp不等于0x0f,說明確實有鍵按下
  {
   temp=P1;   //讀取P1口按鍵,開始判斷鍵值
   switch(temp)
   {
    case 0xee:key=0;break;
    case 0xed:key=1;break;
    case 0xeb:key=2;break;
    case 0xe7:key=3;break;
   }
   temp=P1;   //將讀取的鍵值送temp
   beep();   //蜂鳴器響一聲
   disp_buf =table[key]; //查表求出鍵值對應的數碼管顯示碼,送顯示緩沖區disp_buf
   temp=temp & 0x0f;  //取出列線值(P1.0~P1.3)
   while(temp!=0x0f)  //若temp不等于0x0f,說明按鍵還沒有釋放,繼續等待
   {
    temp=P1;  //若按鍵釋放,再讀取P1口
    temp=temp & 0x0f;// 判斷列線(P1.0~P1.3)是否有0
   }
  }
}
P1=0xff;
P1=0xdf;     //置第2行P1.5為低電平,開始掃描第2行
temp=P1;
temp=temp & 0x0f;
if (temp!=0x0f)
{
  Delay_ms(10);
  temp=P1;
  temp=temp & 0x0f;
  if (temp!=0x0f)
  {
   temp=P1;
   switch(temp)
   {
    case 0xde:key=4;break;
    case 0xdd:key=5;break;
    case 0xdb:key=6;break;
    case 0xd7:key=7;break;
   }
   temp=P1;
   beep();
   disp_buf =table[key];
   temp=temp & 0x0f;
   while(temp!=0x0f)
   {
    temp=P1;
    temp=temp & 0x0f;
   }
  }
}
P1=0xff;
P1=0xbf;      //置第3行P1.6為低電平,開始掃描第3行
temp=P1;
temp=temp & 0x0f;
if (temp!=0x0f)
{
  Delay_ms(10);
  temp=P1;
  temp=temp & 0x0f;
  if (temp!=0x0f)
  {
   temp=P1;
   switch(temp)
   {
    case 0xbe:key=8;break;
    case 0xbd:key=9;break;
    case 0xbb:key=10;break;
    case 0xb7:key=11;break;
   }
   temp=P1;
   beep();
   disp_buf=table[key];
   temp=temp & 0x0f;
   while(temp!=0x0f)
   {
    temp=P1;
    temp=temp & 0x0f;
   }
  }
}
P1=0xff;
P1=0x7f;     //置第4行P1.7為低電平,開始掃描第4行
temp=P1;
temp=temp & 0x0f;
if (temp!=0x0f)
{
  Delay_ms(10);
  temp=P1;
  temp=temp & 0x0f;
  if (temp!=0x0f)
  {
   temp=P1;
   switch(temp)
   {
    case 0x7e:key=12;break;
    case 0x7d:key=13;break;
    case 0x7b:key=14;break;
    case 0x77:key=15;break;
   }
   temp=P1;
   beep();
   disp_buf =table[key];
   temp=temp & 0x0f;
   while(temp!=0x0f)
   {
    temp=P1;
    temp=temp & 0x0f;
   }
  }
}
}
/********以下是主函數********/
main()
{
P0=0xff;           //置P0口
P2=0xff;           //置P2口  
   disp_buf=0xBF;  //開機顯示"-"符號
   while(1)
   {
    MatrixKey();  //調矩陣按鍵掃描函數
  P0 = disp_buf;    //鍵值送P0口顯示
     Delay_ms(2);  //延時2ms
     P2 = 0x7f;  //打開第8只數碼管
  }
}  



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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91在线免费视频观看 | 欧美专区在线观看 | 欧美日韩成人一区二区三区 | 天堂久久久久 | 一区二区三区国产视频 | 国产一区二区三区视频在线 | 国产激情一区二区三区 | 日本中文字幕一区 | 四虎影院最新地址 | 国产欧美日韩在线视频 | 亚洲一二区 | 免费在线观看黄色片 | 国产成人精品在线观看 | 天天躁日日躁狠狠躁 | 午夜网站在线观看 | 人体free性hd| 国产欧美精品一区二区 | 亚洲午夜久久 | 美日韩丰满少妇在线观看 | 欧美综合激情 | 一级特黄妇女高潮 | 久久av红桃一区二区小说 | 国产欧美日韩一区 | 狠狠干综合| 激情网站在线观看 | 日本三级韩国三级美三级91 | 欧美日韩在线免费 | www.狠狠操 | 91免费网 | 欧美成人精品欧美一级私黄 | 日韩精品三级 | 五月婷婷亚洲 | 天天综合久久 | 4438成人网 | 久久夜色精品国产欧美乱极品 | 日韩毛片免费 | 一级免费黄色片 | 亚洲免费福利视频 | 日韩a视频 | 伊人久久中文字幕 | 国产a久久麻豆入口 |