一、简介
LED数码管是由多个发光二极管封装在一起组成 “8” 字型的器件,引线已在内部连接完成,只需引出它们的各个笔划、公共电极。LED数码管常用的段数一般为7段,有的另加一个小数点。LED数码管根据LED的接法不同,分为共阳和共阴两类。
二、图解
蓝桥杯CD107单片机为共阳数码管,共阳数码管真值表如下。
字符 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|---|
字符 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
数值 | 0xC0 | 0xF9 | 0xA4 | 0xB0 | 0x99 | 0x92 | 0x82 | 0xF8 |
字符 | 8 | 9 | A | B | C | D | E | F |
数值 | 0x80 | 0x90 | 0x88 | 0x83 | 0xC6 | 0xA1 | 0x86 | 0x8E |
三、数码管动态显示实验
硬件说明:IAP15F2K61S2
实验原理:动态显示实质上就是轮流点亮单个数码管实现多位数码管整体显示的效果。在轮流显示过程中,每位数码管点亮时间为1~2ms, 由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感。
动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。对于一组4位数码管来说,静态显示和动态显示都能实现同样的效果,但需要的I/O端口是不同的。静态显示需要I/O端口: 8个段码*4 + 4个COM端= 36个I/O引脚;动态显示需要I/O端口: 8个段码+ 4个COM端= 12个I/O引脚
实验目标:在CT107D单片机综合训练平台上,实现数码管的动态显示,在8位数码管中,前面4位显示年份“2018”,接着2位是分隔符“-”,最后两位是月份,从面1月份开始,每隔一段时间加1个月, 到12月之后又从1月开始递增,如此往复。
程序代码:
#include "reg52.h"
unsigned char yu = 1;/*用于记录月份*/
unsigned char code SMG_duanma[18]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,
0xbf,0x7f};/*用于数码管段选*/
void SelectHC573(unsigned char channel)/*74HC573锁存器*/
{
switch(channel)
{
case 4:
P2 = (P2 & 0x1f) | 0x80;
break;
case 5:
P2 = (P2 & 0x1f) | 0xa0;
break;
case 6:
P2 = (P2 & 0x1f) | 0xc0;
break;
case 7:
P2 = (P2 & 0x1f) | 0xe0;
break;
}
}
void DisplaySMG_Bit(unsigned char value, unsigned char pos)/*数码管显示*/
{
P0 = 0xff;
/*段选*/
SelectHC573(6);
P0 = 0x01 << pos;
/*位选*/
SelectHC573(7);
P0 = value;
}
void DelaySMG(unsigned int t)/*数码管延时函数*/
{
while(t--);
}
void Display_Dynamic()/*设置数码管显示内容*/
{
DisplaySMG_Bit(SMG_duanma[2],0);
DelaySMG(500);
DisplaySMG_Bit(SMG_duanma[0],1);
DelaySMG(500);
DisplaySMG_Bit(SMG_duanma[1],2);
DelaySMG(500);
DisplaySMG_Bit(SMG_duanma[8],3);
DelaySMG(500);
DisplaySMG_Bit(SMG_duanma[16],4);
DelaySMG(500);
DisplaySMG_Bit(SMG_duanma[16],5);
DelaySMG(500);
DisplaySMG_Bit(SMG_duanma[yu/10],6);
DelaySMG(500);
DisplaySMG_Bit(SMG_duanma[yu%10],7);
DelaySMG(500);
}
void Delay(unsigned char t)/*延时函数*/
{
while(t--)
{
Display_Dynamic();
}
}
void main()
{
while(1)
{
Display_Dynamic();
yu++;
if(yu > 12)
{
yu = 1;
}
Delay(200);
}
}