蓝桥杯单片机基础学习部分(3)——数码管

文章介绍了在蓝桥比赛中的数码管显示技术,包括共阳数码管的原理、数码管的段选与位选、静态显示和动态扫描的区别,以及相应的代码实现,强调了数码管在单片机学习中的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、前言

在蓝桥的比赛里,大部分的输出显示是通过数码管显示出来的,每一次的比赛,数码管的显示功能是必考的!本文通过数码管的静态显示和动态扫描两部分分析数码管的功能实现。

注意:在比赛使用的开发板是共阳数码管,所以本文是以共阳数码管为基础的。

第十二届题目(部分)
第十四届题目(部分)

因此数码管在单片机的基础学习里是非常重要的一个部分。

二、原理图

在进行数码管学习前,我们先看看数码管的类型

数码管的类型:共阳数码管和共阴数码管

       数码管

共阳数码管:数码管的一段直接与电源相连接,需要数码管点亮时,只需要在数码管的另一端接低电平。

共阴数码管:数码管的一段直接与GND相连接,需要数码管点亮时,只需要在数码管的另一端接高电平。

在开发板上,数码管是这样的,四个数码管组成一组,一共两组,八个数码管。

数码管

在原理图上,每一组数码管连接了8+4个引脚,8个是数码管的段选(A1~G1+PD1),4个是数码管的位选(COM1~COM4 / COM5~COM8)

数码管引脚分布

位选引脚连接图

位选

段选引脚连接图

段选

位选就是我们需要点亮哪一个数码管,就控制哪一个数码管COM。

段选就是我们需要数码管显示什么内容,就控制数码管显示的段位。

1、数码管位选

在数码管位选里输出端为COM1~COM8,对应8个数码管的位置,当选择COM1时,被确实点亮的位置就是第一个数码管,当选择COM2时,被确实点亮的位置就是第二个数码管,以此类推。

在原理图上面,数码管位选的输入端是74HC573译码器,并且需要控制Y6C口,所以我们只需要控制P25=1,P26=1,P27=0,就可以控制锁存器通道指向数码管位选。

三路输入

所以这里直接配置成P2 = (P2 & 0x1f) | 0xc0;让锁存器通道指向数码管位选,再控制P0选择点亮哪一个数码管即可。

关于锁存器和译码器笔者在上一篇笔记提到,感兴趣的读者可以去看看蓝桥杯单片机基础学习部分(1)——LED灯(点亮一盏LED灯及流水灯)-CSDN博客

2、数码管段选

在数码管段选里,我们控制的是数码管显示的内容

单个数码管

从图里看出来,数码管有a~g+dp 8个引脚,两个com引脚对应接GND或者VCC,我们使用的数码管是接VCC的,及段选给低电平,数码管的段就亮。

举个例子

当我们要显示数字“1”时,我们只需要数码管上面“b”“c”两个段亮起来,其他数段熄灭,就可以显示了,此时,数码管的赋值就是 1111 1001(dp+g~a)控制“b”“c”为0,其他都为1。

同样在原理图上面,数码管段选的输入端是74HC573译码器,并且需要控制Y7C口,所以我们只需要控制P25=1,P26=1,P27=1,就可以控制锁存器通道指向数码管段选。

所以这里直接配置成P2 = (P2 & 0x1f) | 0xe0;让锁存器通道指向数码管段选,再控制P0选择点亮数码管哪一个数段即可。

3、数码管静态显示和动态扫描显示的区别

数码管静态显示,顾名思义就是数码管亮度是固定在那里的,在显示过程不会发生变化。比如我们需要显示一个数字“1”,我们只需要让数码管的段码为1111 1001,不需要改变,一直让单片机执行这个码段即可。静态显示是局限在我们显示的内容是固定的,不能发生改变的。

但是,我们比赛时,数字都不是固定的,比如需要我们通过NE555测频率,通过旋转RB3进行数码管数值变化,比如iic中通过PCF8591读取电压显示等等。所以我们需要控制数码管进行动态扫描显示。

数码管动态扫描显示,顾名思义就是让数码管的数字发生改变,让显示的数字不固定。在数码管动态扫描里,我们需要定义数组进行存储数码管动态显示的内容,在比赛的时候,比赛的资料上面有官方提供的数码管段码表,我们可以看着敲。然后我们每隔一段时间就让单片机去读取数组中我们要显示的数据,通过数码管显示出来。

比如,我们要显示“12345678”,在8个数码管上面显示,我们就可以在第一个数码管上面先显示“1”,然后延时很小一段时间,在第二个数码管上面显示“2”,再延时很小一段时间,在数码管上面显示“3”......依次循环,这样就可以实现数码管的扫描了。(就是只有我扫描的够快,点亮,熄灭两者交替的够快,就看不出来我是一直亮,还是闪着亮,跟PWM波形差不多,只是原理不同哈)

共阳数码管段码表

三、代码实现功能

1、数码管静态显示

点亮第一个数码管,数码管显示数字“1”

#include <STC15F2K60S2.H>
void main()
{
	P2 = (P2 & 0x1f) | 0xc0;           //选择锁存器通道指向数码管位选
	P0 = 0x01;
	P2 = (P2 & 0x1f) | 0x00;           //关闭所有锁存器通道
	while(1)
	{		
        P2 = (P2 & 0x1f) | 0xe0;	   //选择锁存器通道指向数码管段选
        P0 = 0xf9;                     //数码管显示数字“1”
	}
}

数码管的静态显示比较简单,这里就不过多阐述

2、数码管动态扫描

点亮所有数码管,数码管显示数字“12345678”

#include <STC15F2K60S2.H>

//数码管显示数字段选
code unsigned char Seg_Table[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x8c};

//数码管延时函数
void Nixie_Delay(unsigned int i)
{
	while(i--);
}

//数码管显示函数
void Nixie(unsigned char pos,num)
{
	P2 = (P2 & 0x1f) | 0xc0;        //选择锁存器通道指向数码管位选
	P0 = 0x01 << (pos-1);
	P2 = (P2 & 0x1f) | 0xe0;        //选择锁存器通道指向数码管位选
	P0 = Seg_Table[num];
	Nixie_Delay(500);               //数码管扫描延时函数
	P0 = 0xff;                      //数码管消隐
}

void main()
{
	while(1)
	{
		Nixie(1,1);
		Nixie(2,2);
		Nixie(3,3);
		Nixie(4,4);
		Nixie(5,5);
		Nixie(6,6);
		Nixie(7,7);
		Nixie(8,8);
	}
}

四、补充

数码管消隐

细心的读者会发现,上面的数码管动态扫描代码,Nixie()函数里面,出现P0 = 0xff;

这里就是关于数码管的消隐了。如果没有P0 = 0xff;在main函数进行部分数码管显示,会有数码管出现影像。比如我们直接在main函数只显示前面四个数码管,会发现后面的数码管会有一点点发亮,在暗处特别明显。因为数码管是动态扫描的,没有用到的数码管会受到使用了的数码管影响,形成影像。

所以为了避免数码管的影像影响,我们要在数码管扫描完成一遍后,把数码管的段选全部置1,让它的段码一个都不亮,P0 = 0xff。

void Nixie(unsigned char pos,num)
{
	P2 = (P2 & 0x1f) | 0xc0;
	P0 = 0x01 << (pos-1);
	P2 = (P2 & 0x1f) | 0xe0;
	P0 = Seg_Table[num];
	Nixie_Delay(500);
}

void main()
{
	while(1)
	{
		Nixie(1,1);
		Nixie(2,2);
		Nixie(3,3);
		Nixie(4,4);
	}
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值