蓝桥杯单片机学习计划之点亮数码管
前言
上一节我们学习了点亮LED灯,成功编写程序将竞赛板上的八个LED灯点亮了,那么今天我们一起来学习点亮数码管。
一、数码管介绍
数码管是一种显示器件,在平时生活中应该是比较常见的,比如有些热水器就是使用数码管来显示水温的。每个数码管的内部其实都是由8个LED灯组成的,只是对其进行了排列然后进行了封装。根据数码管内部连接方式的不同,分为共阳数码管和共阴数码管。竞赛板上使用了两个四位的共阳数码管,原理图如下:
从上图可以看到,每个四位的数码管都有12个管脚,其中com1——com4分别是每一位数码管的公共级,板子上的数码管是共阳的,所以它们的公共级就是阳极;剩下八个管脚分别对应数码管的a——dp段,dp是小数点。如果想要使数码管显示数字1,则只需要让对应的d段和c段点亮,其他熄灭即可,对应十六进的0xF9。0-9数码管段码表如下:
二、原理图
那么板子上数码管和单片机是如何连接的呢?和上一节一样,我们一起顺藤摸瓜寻找一下:
首先从上图可以看到,板子上分别使用两个74H573锁存器控制两个数码管,关于锁存器上一节点亮LED灯的时候已经使用过了,这边就不再介绍了。上面那个锁存器(U7)控制的是数码管的八个段,下面那个锁存器(U8)控制的是八个数码管的位,而两个锁存器的八个输入端都是由P0控制的,另外两个锁存使能端Y7C和Y6C连接如下:
分别连接到了译码器的Y6和Y7,对应真值表:
那么到此为止引脚的连接关系就都找完了。下面开始写程序将数码管点亮。
三、数码管静态显示
那么我们想要将数码管点亮,思路就是:首先选通控制控制位的锁存器,使P0端口输出0xFF(共阳),然后关闭位锁存器,再选通控制端的锁存器,使P0端口输出0x00,那么八个数码管就都点亮了,程序如下:
#include <STC15F2K60S2.H>
void main()
{
P2 = (P2&0x1f) | 0xC0;//位选
P0=0xFF;//打开所有位
P2 &= 0x1f;//锁存
P2 = (P2&0x1f) | 0xE0;//段选
P0=0x00;//八段全部点亮
P2 &= 0x1f;//锁存
while(1);
}
效果图如下:
可以看到数码管全部点亮了,现在我们来修改程序,使八个数码管循环显示0-9.
#include <STC15F2K60S2.H>
#include "intrins.h"
unsigned char SEG_Code[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//0-9段码
void main()
{
unsigned char i;
unsigned char x;
while(1)
{
for(i=0x01;i!=0;i<<=1)
{
P2 = (P2&0x1f) | 0xC0;//位选
P0=0xFF;
P2 &= 0x1f;//锁存
P2 = (P2&0x1f) | 0xE0;//段选
P0=SEG_Code[x++];
P2 &= 0x1f;//锁存
Delay500ms();
}
x=0;
}
程序下载后运行可以看到八个数码管循环显示0-9。
四、数码管动态显示
上面我们实现了八个数码管循环显示0-9,那我们想要让八个数码管每个都显示不同的数字应该怎么办呢?这时候就需要使用数码管的动态显示了,我们可以让第一个数码管显示0,过一会让第二个数码管显示1,再过一会让第三个数码管显示2…那么这个一会是多久呢,我们知道人眼的视觉暂留一般是0.05~0.2秒,所以我们只需要让刷新时间比0.2快就行了,一般数码管扫描时间为1ms左右,下面我们来编写程序实现数码管的动态显示:
#include <STC15F2K60S2.H>
#include "intrins.h"
unsigned char SEG_Code[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//0-9段码
unsigned char SEG_Buf[8];//显示数据缓冲区
void Delay1ms() //@12.000MHz
{
unsigned char i, j;
i = 12;
j = 169;
do
{
while (--j);
} while (--i);
}
void main()
{
unsigned char i;
unsigned char x;
for(i=0;i<8;i++)//将0-7放入数据缓冲区
{
SEG_Buf[i]=i;
}
while(1)
{
for(i=0x01;i!=0;i<<=1)
{
P2 = ((P2 & 0x1f) | 0xe0);
P0 = 0xff;//消隐
P2 &= 0x1f;
P2 = (P2&0x1f) | 0xC0;//位选
P0=i;
P2 &= 0x1f;//锁存
P2 = (P2&0x1f) | 0xE0;//段选
P0=SEG_Code[SEG_Buf[x++]];//送入显示缓冲区的值
P2 &= 0x1f;//锁存
Delay1ms();
}
x=0;
}
}
程序下载进开发板运行后,可以看到数码管成功显示0-7了。