蓝桥杯综合实训平台 使用AIP15F2K61S2/STC89C52 动态控制数码管

动态显示实质上就是轮流点亮单个数码管实现多位数码管整体显示的效果,在轮流显示过程中,每位数码管点亮时间位1~2ms即delay (unsgnied int t )   {while (t--); },由于人的视觉暂留现象和发光二极管的余辉效应,给人的印象就是一组稳定的数据,不会有闪烁感并且功耗更低。

 

先通过74HC138选Y6,选取控制第X个数码管(com数)    P27,P26,P25依次为 1 1 0,

再通过选Y7,      控制数码管的段亮灭(a1,b1,c1等等)  P27,P26,P25依次为 1 1 1 ,

 

左边控制相应的管的亮灭,右边四个com1~com4引脚,就是选择对应的数码管,com引脚高电平有效,比如给com1一个高电平的时候,第一个数码管就会被选中,然后根据控制a1,b1.......来控制相应的段位让对应的数码管显示对应的数字

以下为控制数码管引脚P1的显示状态和对应的代码

unsigned char io[18] = 
{ 0x00,0xf9,0xa4,0xb0,0x99,0x82,
  0xf8,0x80,0x90,0x88,0x80,0xc6,
  0x86,0x8e,0xbf,0x7f}

分别显示:全亮, 1, 2, 3, 4, 5, 6, 7, 8, 9, A  ,B  ,C  ,D  ,E  ,F  ,  -,  .

如下代码效果为在第一个数码管依次显示1~9数字

#inclde "reg52.h"
sbit P25 = P2^5;
sbit P26 = P2^6;
sbit P27 = P2^7;

unsigned char code  io[9] = {0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}

void delay(unsigned int t)
{
    while(t--);
}

void smg(unsignde int i)
{
    for(i = 0;I<= 9;i++)
    {
        P27 = 1;
        P27 = 0;
        P27 = 0;
        P0 = 0x01;
        P27 = 1;
        P27 = 1;
        P27 = 1;
        P0 = io[i];

    }
}

void main ()
{
    while(1)
        {
        smg();
        }
}

补充:HC573译码器的选择Y通道函数如下

void HC573(unsigned char channel)
{
	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;
	}
}

如下代码可以显示2022--01逐渐递增的年月

#include "reg52.h"
 unsigned char code io[10] = 
 {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
	0x80,0x90};
  unsigned int nian =  2022;
	unsigned int yue =  1;
	unsigned int op = 0;
 void delay(unsigned int t)
 {
	 while(t--); 
 }
void HC573(unsigned char channel)
{
	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(unsigned char value,unsigned char pos)
{
	HC573(6);
	P0 = 0x01 << pos ;
	HC573(7);
	P0 = value;
}

void smg()
{
		displaysmg(io[nian/1000],0);
		delay(500);
		displaysmg(io[(nian-nian/1000*1000)/100],1);
		delay(500);
		displaysmg(io[(nian-nian/100*100)/10],2);
		delay(500);
		displaysmg(io[nian%10],3);
		delay(500);
	  displaysmg(0xbf,4);
		delay(500);
	  displaysmg(0xbf,5);
		delay(500);
		displaysmg(io[yue/10],6);
		delay(500);
		displaysmg(io[yue%10],7);
		delay(500);
	  op++;
	if (op == 200)
	{
		op = 0;
		yue++;
			if(yue > 12)
		{
			nian++;
			yue = 1;
		}
	}
}


void main()
{
	while(1)
	{
		smg();
	}
}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值