【51单片机】2-8【I/O口】数码管显示矩阵按键值

发布于:2025-04-06 ⋅ 阅读:(16) ⋅ 点赞:(0)

1.硬件

2.软件

  • 动态数码管
#include "reg52.h"			 //头文件

typedef unsigned int u16;	  //对数据类型进行声明定义
typedef unsigned char u8;

#define GPIO_DIG P0//数码管段选
#define GPIO_KEY P1//按键

u8 KeyValue;	//用来存放读取到的键值

u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
					0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共阴极,显示0~F的值

void delay(u16 i)//延时
{
	while(i--);	
}

void KeyDown(void)//矩阵按键扫描函数
{
	char a=0;
	GPIO_KEY=0x0f;//矩阵按键接P1口,默认高四位为低电平,低四位为高电平
	if(GPIO_KEY!=0x0f)//读取按键是否按下
	{
		delay(1000);//延时10ms进行消抖
		if(GPIO_KEY!=0x0f)//再次检测键盘是否按下
		{	
			//测试列
			GPIO_KEY=0X0F;//0000 1111
			switch(GPIO_KEY)
			{
				case(0X07):	KeyValue=0;break;//P1为0000 0111
				case(0X0b):	KeyValue=1;break;//0000 1011
				case(0X0d): KeyValue=2;break;//0000 1101
				case(0X0e):	KeyValue=3;break;//0000 1110
			}
			//测试行
			GPIO_KEY=0XF0;//1111 0000
			switch(GPIO_KEY)
			{
				case(0X70):	KeyValue=KeyValue;break;//0111 0000
				case(0Xb0):	KeyValue=KeyValue+4;break;//1011 0000
				case(0Xd0): KeyValue=KeyValue+8;break;//1101 0000
				case(0Xe0):	KeyValue=KeyValue+12;break;//1110 0000
			}
			
		}
	}
	while((a<50)&&(GPIO_KEY!=0xf0))	 //检测按键松手检测
	{
		delay(100);
		a++;
	}
}

void main()
{	

	while(1)
	{	
		KeyDown();		   //按键判断函数
		GPIO_DIG=smgduan[KeyValue];	  //检测按键松手检测
	}		
}

3.实物效果

在这里插入图片描述

  • 硬件接线
    在这里插入图片描述
    在这里插入图片描述