蓝桥杯单片机备战(五)共阳数码管的动态显示

本文介绍数码管动态显示的原理,通过轮流点亮单个数码管实现多位数码管的整体显示效果。利用人的视觉暂留现象和发光二极管的余晖效应,达到稳定显示而无闪烁感的目的。文中还提供了基于51单片机的具体实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  

1.动态显示的实现原理

1.数码管的动态显示实质上就是轮流点亮单个数码管实现多位数码管整体显示的效果

2.在轮流显示的过程中,每位数码管的点亮时间为1到2ms,由于人的视觉暂流现象以及发光二极管的余晖效应,尽管实际上数码管不是同时点亮的,但只要扫描速度够快,给人眼的印象就是一组稳定的显示数据,不会有闪烁感,这样就节省了大量的I/O口,且功耗更低。


2.代码实现

#include <reg52.h>  //头文件

unsigned char code SMG_duanma[18] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,
																		 
                                     0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf,0x7f}; // 数码管的断码表
	
void Delay(unsigned long int t) //延时函数
{
    while(t--);
}

void HC138Init(unsigned char n)
{
    switch(n)
    {
        case 4:
            P2 = (P2 & 0x1f) | 0x80;//让Y4输出低电平,此时Y4C为高电平
        break;
        case 5:
            P2 = (P2 & 0x1f) | 0xa0;//让Y5输出低电平,此时Y5C为高电平
        break;
        case 6:
            P2 = (P2 & 0x1f) | 0xc0;//让Y6输出低电平,此时Y6C为高电平
        break;
        case 7:
            P2 = (P2 & 0x1f) | 0xe0;//让Y7输出低电平,此时Y7C为高电平             
        break;                           
    }
}

void showSMG(unsigned char position,unsigned char number)  //字符显示函数
{
	HC138Init(6); // 选通Y6C
	switch(position)
	{
		case 1://第1个位置
			P0 = 0x01;
		break;
		case 2://第2个位置
			P0 = 0x02;
		break;
		case 3://第3个位置
			P0 = 0x04;
		break;
		case 4://第4个位置
			P0 = 0x08;
		break;
		case 5://第5个位置
			P0 = 0x10;
		break;
		case 6://第6个位置
			P0 = 0x20;
		break;
		case 7://第7个位置
			P0 = 0x40;
		break;
		case 8://第8个位置
			P0 = 0x80;
		break;
	}
	HC138Init(7); // 选通Y7C
	if(number == '0')  //下面是显示各个字符
		P0 = SMG_duanma[0];
	else if(number == '1')
		P0 = SMG_duanma[1];
	else if(number == '2')
		P0 = SMG_duanma[2];
	else if(number == '3')
		P0 = SMG_duanma[3];
	else if(number == '4')
		P0 = SMG_duanma[4];
	else if(number == '5')
		P0 = SMG_duanma[5];
	else if(number == '6')
		P0 = SMG_duanma[6];
	else if(number == '7')
		P0 = SMG_duanma[7];
	else if(number == '8')
		P0 = SMG_duanma[8];
	else if(number == '9')
		P0 = SMG_duanma[9];
	else if(number == 'a')
		P0 = SMG_duanma[10];
	else if(number == 'b')
		P0 = SMG_duanma[11];
	else if(number == 'c')
		P0 = SMG_duanma[12];
	else if(number == 'd')
		P0 = SMG_duanma[13];
	else if(number == 'e')
		P0 = SMG_duanma[14];
	else if(number == 'f')
		P0 = SMG_duanma[15];
	else if(number == '-')
		P0 = SMG_duanma[16];
	else if(number == '.')
		P0 = SMG_duanma[17];
	
}

void main()
{
	while(1)
	{
		showSMG(1,'5');
		Delay(500);
		showSMG(2,'2');
		Delay(500);
		showSMG(3,'0');
		Delay(500);
		showSMG(4,'1');
		Delay(500);
		showSMG(5,'3');
		Delay(500);
		showSMG(6,'1');
		Delay(500);
		showSMG(7,'4');
		Delay(500);
		
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值