蓝桥杯基础教程之数码管操作(上)学习蓝桥杯必看基础!

前言

在学习了基本锁存器原理后,剩下就是对各个外设以及对单片机寄存器的相关学习,如果没有看过之前对锁存器原理的讲解的同学,可以回看一下。
蓝桥杯基础教程之锁存器操作(非常重要!)学习蓝桥杯必看基础!

数码管原理图分析

在这里插入图片描述
打开CT107D单片机竞赛板原理图右上部分,可以看到数码管部分的原理图,在这里我们可以看到锁存器控制端Y6C以及锁存器控制端Y7C,还有名字叫做DS1(缩写分别是DIG表示数字、SEG表示管,因此叫做数码管)以及数码管2 DS2,下面电阻部分是用作限流,其右方的点阵模块本章不做讲解.
在这里我们可以看到Y7C的控制端控制的a b c d e f g dp的电平,而Y6C控制端控制的是com1 com2 com3 com4 com5 com6 com7 com8的电平,我们叫Y7C控制的a b c d e f g dp叫做数码管的段选,对Y7C控制的com1…com8的电平叫做数码管的位选。下面就先分别解释数码管的段选和位选分别是什么意思

共阴和共阳

为了讲清楚段选和位选,首先我要讲一下数码管的第一特性,那么就是共阴和共阳的问题。
在这里插入图片描述
我们在挑选数码管的时候,会遇到信号后面跟着CC或者CA这个就是说明数码管是共阳还是共阴的问题,其中CC标识共阴数码管,CA表示共阳数码管。
下面用仿真解释一下共阴数码管和共阳数码管

共阳数码管

在这里插入图片描述
其实数码管的每一个可以亮的地方就是一个led灯,就如同右边一样,我做了一个类比,共阳数码管由其名字就知道它的阳极是连接在一起的,也就是我们常说的正极连在一起,而负极是分开的。

共阴数码管

在这里插入图片描述
同理,共阴数码管由其名字就知道它的阴极是连接在一起的,也就是我们常说的负极连在一起,而正极是分开的。

总结

在共阴和共阳的基础上,我们把分开的那部分,也就是可以控制哪个led亮的部分叫数码管的管选部分,把连接在一起的部分叫做数码管的位选,当然我们示例用的是一位的数码管,不存在位选的说法
在这里插入图片描述

数码管程序部分

讲完了数码管的共阴共阳以及管选和位选问题,下面就来针对蓝桥杯数码管部分作出讲解。
由原理图,我们可以知道4位1体数码管就是4个单独的数码管,让它们的管选连接在一起,然后位选端口单独拿出,我们根据原理图可以看到CT107D数码管部分是用了两个4位1体数码管,它把2个4位一体数码管的管选也接在一起了,然后单独把位选控制端口单独拿出
在这里插入图片描述
然后其管选部分,由Y7C以及P0端口控制
在这里插入图片描述

在这里插入图片描述
然后其位选部分,由Y6C以及P0端口控制
在这里插入图片描述

静态数码管显示

这里我们用程序控制数码管静态的显示一下,让大家先体验一下数码管的点亮。
首先我们要确定我们用的数码管是共阴还是共阳的我们才能知道如何去点亮数码管。
在赛点资源包-竞赛板资料-CT107D单片机竞赛板使用说明书里面有
在这里插入图片描述
因此我们使用的数码管是共阳的数码管,也就是阳极是连接在一起的。因此位选部分高电平、管选部分为低电平才能够点亮.。
看下面一段程序

#include "stc15f2k61s2.h"
enum{
    
     LED = 4 , EXT , DIGSEL , DIGCODE };
#define Select( x ) P2 = ( P2 & 0x1f ) | ( x << 5 ); P2 = (  P2 & 0x1f  )
sbit BEEP = P0^6; sbit RELAY = P0^4;
//外设初始化(关闭蜂鸣器和继电器以及led)
void extInit()
{
    
    
	//外设初始化
	BEEP = 0;
	RELAY = 0;
	Select( EXT );   
	P0 = 0xff;           
	Select( LED );
}

//数码管显示(点亮所有的数码管led)
void segDis()
{
    
    
	//外设初始化
	P0 = 0x00;        //送入数据,管选全部低电平
	Select( DIGCODE );
	P0 = 0xff;        //送入数据,位选全部高电平
	Select( DIGSEL );
}
void main()
{
    
    
	extInit();
	segDis();
}

上面的程序根据分析将管选全部为低,位选全部为高电平,实现的效果是将数码管全部点亮!,可以下载测试一下。

自定义显示的内容

比如说,为了让数码管显示1这个数字我们需要如何写这个程序呢?根据共阳数码管的原理,首先我们让要显示的数码管位选端为阳极才能够点亮数码管撒,所以我们需要控制的部分就是管选部分,下面看一下这个程序的输出

//数码管显示
void segDis()
{
    
    
	//外设初始化
	P0 = 0xf9;
	Select( DIGCODE );
	P0 = 0xff;            
	Select( DIGSEL );
}

上述程序会将数码管的显示全部显示为1,为什么是1呢?
在这里插入图片描述
上图标注的a-h分别是数码管对应的位置,它和P0的输入关系为
在这里插入图片描述
即是
1111 1001
hgfe dcba
这样对应的,那么当位选为高电平的时候,管选1就表示不亮,0就表示亮,就是下面这幅图
在这里插入图片描述
因此显示的是一个’1’字,那么0-9都是如何显示的呢?

0	--	0xc0
1	--	0xf9
2	--	0xa4
3	--	0xb0
4	--	0x99
5	--	0x92
6	--	0x82
7	--	0xf8
8	--	0x80
9	--	0x90

好消息是这部分并不需要我们去记忆,这部分在比赛的时候在赛点资源包里面会含有。
在CT107D蓝桥杯相关\赛点资源数据包\共阳极数码管段码表.txt中

只让前四个数码管显示1后四个数码管不显示程序如何写?(请思考一下,先试着自己解答)




解答:

//数码管显示
void segDis()
{
    
    
	//外设初始化
	P0 = 0xf9;
	Select( DIGCODE );
	P0 = 0x0f;            
	Select( DIGSEL );
}

那么让前四个数码管显示1后四个数码管显示2又如何实现呢?

解答见下一篇文章,请仔细分析
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_37429313/article/details/113806865