实验内容:
利用所学的单片机知识及电路知识编程实现单片机 I/O 口检测矩阵键盘的输入电平。选中 8 位数码管的其中一位数码管,当逐个按下 4*4 矩阵键盘的按键,数码管依次显示 0—F。
开发板中数码管采用的是共阴极数码管。原理图如下:
138译码器连接数码管的位选端,由P22\P23\P24进行位选;由8个P0口进行段选。
矩阵键盘连接在单片机的八个P1引脚 ,P10\P11\P12\P13连接键盘的列;P14\P15\P16\P17连接键盘的行,采用扫描法进行矩阵键盘的扫描,再将扫描到的按键生成对应的键码返回给单片机,由单片机对不同的键码进行处理,在数码管上显示相应的数码(0—f)。
代码如下:
#include <REGX51.H>
#define SEG1 P2_4 = 1;P2_3 = 1;P2_2 = 1//选中数码管第1位 显示
#define SEG2 P2_4 = 1;P2_3 = 1;P2_2 = 0//选中数码管第2位 显示
#define SEG3 P2_4 = 1;P2_3 = 0;P2_2 = 1//选中数码管第3位 显示
#define SEG4 P2_4 = 1;P2_3 = 0;P2_2 = 0//选中数码管第4位 显示
#define SEG5 P2_4 = 0;P2_3 = 1;P2_2 = 1//选中数码管第5位 显示
#define SEG6 P2_4 = 0;P2_3 = 1;P2_2 = 0//选中数码管第6位 显示
#define SEG7 P2_4 = 0;P2_3 = 0;P2_2 = 1//选中数码管第7位 显示
#define SEG8 P2_4 = 0;P2_3 = 0;P2_2 = 0//选中数码管第8位 显示
char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; //共阴数码管编码
void Delay(unsigned int xms){
unsigned char i, j;
while(xms--){
i = 2;
j = 239;
do{
while (--j);
} while (--i);
}
}
void MatrixKey(unsigned char *x)//如果不想用指针 那就用全局变量
{//矩阵键盘逐行扫描,形参为指针变量
P1=0xFF;
P1_3=0;//选中第一列,然后扫描行
if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);*x = 1;}
if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);*x = 5;}
if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);*x = 9;}
if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);*x = 13;}
P1=0xFF;
P1_2=0;//选中第二列,然后扫描行
if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);*x = 2;}
if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);*x = 6;}
if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);*x = 10;}
if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);*x = 14;}
P1=0xFF;
P1_1=0;//选中第三列,然后扫描行
if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);*x = 3;}
if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);*x = 7;}
if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);*x = 11;}
if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);*x = 15;}
P1=0xFF;
P1_0=0;//选中第四列,然后扫描行
if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);*x = 4;}
if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);*x = 8;}
if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);*x = 12;}
if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);*x = 16;}
}
void LED_Display(char Number){
SEG1; //选中数码管第一位 显示
P0 = table[Number-1];
}
void main(){
unsigned char num=17;
while(1){
MatrixKey(&num);//将地址传给形参的指针变量,复习指针
LED_Display(num);
}
}
效果图: