【51单片机】开发板上矩阵键盘键码在数码管上的显示,按下键盘在数码管上显示对应段码

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

 效果图:

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值