
用AT89S51 的并行口P1 接4&TImes;4 矩陣鍵盤,以P3.0-P3.3
作輸入線,以P3.4-P3.7 作輸出線;在數碼管上顯示數字按鍵的“0-9”序號,其它按鍵顯示0。
原理分析:4X4矩陣鍵盤每個按鍵都有它的行值和列值,當每個按鍵的行值為低電平,列值為高電平時,按鍵為未按下狀態。判斷是否有按鈕按下時,先讓這一行通低電平,再通過掃描每一列來判斷是否被按下(逐列使列值通高電平),如果被按下,那么這一列的電平此時會成為低電平;如果這一列在掃描時為低電平,說明這一列有按鍵被按下,而行值是每次在判斷列值前就確定的,這樣就能知道到底是哪一個按鍵被按下了。
基本流程:設置第一行為低電平——>掃描每一列(設置為高電平),判斷是否為0——>確定是否有按鍵按下——>設置第二行為低電平——>掃描第二列......(如此循環到第四行,再從第一行重新開始)
編譯環境:KEIL C51 V3
仿真軟件:proteus 7.4
單片機類型:AT89C52
數碼管類型:7seg-mpx1-cc (cc——共陰數碼管)
鍵盤類型:keypad-samllcalc
單片機上的程序如下:
#include 《reg52.h》
char code table[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f};
sbit row1=P3^4;
sbit row2=P3^5;
sbit row3=P3^6;
sbit row4=P3^7;
int temp;
int key;
//void delay500ms();
void delay20ms();
void main()
{
P1=table[0];
while(1)
{
P3=0xff;
row1=0;
temp=P3;
temp=temp&0x0f;
if(temp!=0x0f)
{
delay20ms();
temp=P3;
temp=temp&0x0f;
if(temp!=0x0f)
{
switch(temp)
{
case 0x0e:
key=7;
break;
case 0x0d:
key=8;
break;
case 0x0b:
key=9;
case 0x07:
key=0;
}
P1=table[key];
}
}
P3=0xff;
row2=0;
temp=P3;
temp=temp&0x0f;
if(temp!=0x0f)
{
delay20ms();
temp=P3;
temp=temp&0x0f;
if(temp!=0x0f)
{
switch(temp)
{
case 0x0e:
key=4;
break;
case 0x0d:
key=5;
break;
case 0x0b:
key=6;
break;
case 0x07:
key=0;
}
P1=table[key];
}
}
P3=0xff;
row3=0;
temp=P3;
temp=temp&0x0f;
if(temp!=0x0f)
{
delay20ms();
temp=P3;
temp=temp&0x0f;
if(temp!=0x0f)
{
switch(temp)
{
case 0x0e:
key=1;
break;
case 0x0d:
key=2;
break;
case 0x0b:
key=3;
break;
case 0x07:
key=0;
break;
}
}
P1=table[key];
}
P3=0xff;
row4=0;
temp=P3;
temp=temp&0x0f;
if(temp!=0x0f)
{
delay20ms();
temp=P3;
temp=temp&0x0f;
if(temp!=0x0f)
{
switch(temp)
{
case 0x0e:
key=0;
break;
case 0x0d:
key=0;
break;
case 0x0b:
key=0;
break;
case 0x07:
key=0;
break;
}
}
P1=table[key];
}
}
}
/*
void delay500ms()
{
int i,j,k;
for( i=0;i《10/2;i++)
{
for(j=0;j《180;j++)
{
for(k=0;k《200;k++)
{
}
}
}
} */
void delay20ms()
{
int i,j;
for(i=0;i《36;i++)
{
for(j=0;j《200;j++)
{
}
}
}
電路圖核心部分如下:



為了方便大家更好的學習,您還可以關注暢學電子和EDA的公眾號,每天推送相關知識,希望能對你的學習有所幫助!

