实验内容:
利用所学的单片机知识及电路知识编程实现单片机 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); } }
效果图: