找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5363|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

51單片機(jī)矩陣式鍵盤輸入實驗

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:780424 發(fā)表于 2020-6-15 21:46 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
一、實驗?zāi)康?/font>
1.學(xué)習(xí)矩陣式鍵盤工作原理
2.學(xué)習(xí)矩陣式接口的電路設(shè)計和程序設(shè)計
二、實驗內(nèi)容與結(jié)果
1.USB
2.單片機(jī)最小系統(tǒng)實驗教學(xué)模塊
3.矩陣式鍵盤實驗?zāi)K
4.動態(tài)掃描數(shù)碼管顯示模塊
題目: 在矩陣式鍵盤中的某個鍵被按下時,8 LED 動態(tài)顯示器上最低位顯示該鍵對應(yīng)的字符,以前的字符向高位推進(jìn) 1 位(即類似于計算器)。
程序:
(1)源代碼
//頭文件包含
#include <reg51.h>
#include <intrins.h>
//宏定義
#define uchar unsigned char
#define uint unsigned int
//共陰極數(shù)碼管0-F的段碼列表,表中最后一個0x00是顯示為暗的斷碼表
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x53,0x79,0x71,0x00};
uchar Display_Buffer[]={16,16,16,16,16,16,16,16};
void DelayM(uint x)
{
       uchar t;
       while(x--)
       {
              for(t=0;t<120;t++);
       }
}
uchar kscan()
{
       uchari,temp,num=16;           
       for(i=0;i<4;i++)
       {
              //逐行掃描
              P1=_cror_(0x7f,i);
              //讀取鍵值
              temp=P1;
              //讀取鍵值,屏蔽高四位行值                          
              temp=temp&0x0f;
              //低四位列值
              if(temp!=0x0f)
              {
                     DelayM(5);
                     temp=P1;
                     temp=temp&0x0f;
                     if(temp!=0x0f)
                     {
                            temp=P1;
                            switch(temp)
                            {
                                   case0x77:num=0;break;
                                   case0x7b:num=1;break;
                                   case0x7d:num=2;break;
                                   case0x7e:num=3;break;
                                   case0xb7:num=4;break;
                                   case0xbb:num=5;break;
                                   case0xbd:num=6;break;
                                   case0xbe:num=7;break;
                                   case0xd7:num=8;break;
                                   case0xdb:num=9;break;
                                   case0xdd:num=10;break;
                                   case0xde:num=11;break;
                                   case0xe7:num=12;break;
                                   case0xeb:num=13;break;
                                   case0xed:num=14;break;
                                   case0xee:num=15;break;
                                   default:break;
                            }
                     }
                     
                     //等待按鍵釋放
                     while((temp&0x0f)!=0x0f)
                     {
                             temp=P1;
                             temp=temp&0x0f;
                     }
                     
              }
              DelayM(5);
       }
       returnnum;
}
void main()
{
       uchark,m=0x7f,num;
       //關(guān)閉數(shù)碼管的段選
       P0=0x00;
       //關(guān)閉數(shù)碼管的位選
       P2=0xff;        
       while(1)
       {
              num=kscan();
              if(num!=16)
              {            
                    for(k=1;k<8;k++)
                     {
                            //顯示向前移動一位
                           Display_Buffer[k-1]=Display_Buffer[k];
                     }
                     //最低位顯示當(dāng)前按鍵值
                     Display_Buffer[7]=num;
                     num=16;
              }
              //循環(huán)顯示8
              for(k=0;k<8;k++)
              {
                     m=_crol_(m,1);
                     P2=m;
                     P0=table[Display_Buffer[k]];
                     DelayM(2);
              }
       }

}
附件包含protues原理圖和代碼

實驗6.zip

42.72 KB, 下載次數(shù): 20, 下載積分: 黑幣 -5

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

使用道具 舉報

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

本版積分規(guī)則

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

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

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