【蓝桥杯】CT107D单片机之数码管

一、简介

LED数码管是由多个发光二极管封装在一起组成 “8” 字型的器件,引线已在内部连接完成,只需引出它们的各个笔划、公共电极。LED数码管常用的段数一般为7段,有的另加一个小数点。LED数码管根据LED的接法不同,分为共阳和共阴两类。

二、图解

在这里插入图片描述
在这里插入图片描述
蓝桥杯CD107单片机为共阳数码管,共阳数码管真值表如下。

字符01234567
字符01234567
数值0xC00xF90xA40xB00x990x920x820xF8
字符89ABCDEF
数值0x800x900x880x830xC60xA10x860x8E

三、数码管动态显示实验

硬件说明: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);
	}
}
  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值