赞
踩
蓝桥杯单片机学习计划之点亮数码管
上一节我们学习了点亮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了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。