這才是單片機4*4矩陣鍵盤控制數碼管最簡單的寫法
///插播一條:我自己在今年年初錄製了一套還比較系統的入門單片機教程,想要的同學找我拿就行了免費的,私信我就可以哦~點我頭像黑色字體加我地球呺也能領取哦。最近比較閒,帶做畢設,帶學生參加省級或以上比賽///
第一次寫,也算是對我研究了幾天的代碼做一個總結
程序基於AT89S51晶片,兩個573鎖存器(控制段選位選)
P3口接矩陣鍵盤,其中P3.0~P3.3接行線,P3.4~P3.7接列線,P0口接共陰極7段數碼管。
反轉法的原理:
反轉法就是通過給單片機的埠賦值兩次,最後得出所按鍵的值的一種算法。
給P3口賦值0x0f,即00001111,假設0鍵按下了,則這時P3口的實際值為00001110;
給P3口再賦值0xf0,即11110000,如果0鍵按下了,則這時P3口的實際值為11100000;
通過這兩次P3口的實際值相加得11101110,即0xee。
由此我們便得到了按下0鍵時所對應的數值0xee,以此類推可得出其他15個按鍵對應的數值,有了這種對應關係,矩陣鍵盤編程問題也就解決了,也就是程序的算法已經有了。
(上述方法來源於網絡)
好了下面直接進入程序
#include //頭文件
#define uchar unsigned char //宏定義
#define uint unsigned int
uchar key,n,i; //定義變量
uchar code table[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77}; //反轉法矩陣鍵盤的各個按鍵的計算值
uchar code yin[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //共陰極數碼管顯示0~F
void delay(uint i) //延時函數
{
while(i--);
}
void keyscan()
{
uchar l,h,i; //定義局部變量,用l得出低4位的值,用h得出高4位的值
P3=0x0f; //給P3賦值00001111
l=P3&0x0f;
if(l!=0x0f)
{
delay(100); //延遲後再檢測
P3=0x0f;
l=P3&0x0f;
if(l!=0x0f)
{
h=P3&0xf0; //若有鍵按下,得出高四位的值
P3=0xf0; //給P3賦值11110000
h=P3&0xf0; //若有鍵按下,得出低四位的值
key=l+h; //高4位的值與低4位的值相加
for(i=0;i
{
if(key==table[i]) //通過查表得出n的值
n=i;
}
}
}
}
void main()
{
while(1)
{
keyscan();
for(i=0;i //送入位選信號控制數碼管
{
P2_6=1;P2_7=0;
P0=yin[n];
P2_6=0;P2_7=1;
switch(i)
{
case 0:P0=0xfe;break;
case 1:P0=0xfd;break;
case 2:P0=0xfb;break;
case 3:P0=0xf7;break;
case 4:P0=0xef;break;
case 5:P0=0xdf;break;
default:break;
}
P2_6=0;P2_7=0;
delay(100);
}
}
}