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

1.硬件

2.软件

  • 动态数码管
c 复制代码
#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.实物效果

  • 硬件接线

相关推荐
gantengsheng15 小时前
基于51单片机和8X8点阵屏、矩阵按键的记忆类小游戏
51单片机·小游戏·矩阵按键·普中开发板·stc89c52rc·记忆类·8x8点阵屏
小辉懂编程16 小时前
C语言:51单片机实现数码管依次循环显示【1~F】课堂练习
c语言·开发语言·51单片机
一月千帆1 天前
51单片机课设基于GM65模块的二维码加条形码识别
单片机·嵌入式硬件·51单片机
仰泳之鹅2 天前
【51单片机中断】
单片机·嵌入式硬件·51单片机
一支闲人2 天前
LED点阵屏模块
51单片机·入门教程·适用于新手小白
真的想上岸啊2 天前
学习51单片机02
嵌入式硬件·学习·51单片机
Camellia03113 天前
嵌入式学习--江协51单片机day6
嵌入式硬件·学习·51单片机
Camellia03113 天前
嵌入式学习--江科大51单片机day7
单片机·嵌入式硬件·学习·51单片机
真的想上岸啊4 天前
学习51单片机01(安装开发环境)
嵌入式硬件·学习·51单片机
昊昊昊昊昊明4 天前
十天学会嵌入式技术之51单片机—day-10
单片机·嵌入式硬件·51单片机