动态显示实质上就是轮流点亮单个数码管实现多位数码管整体显示的效果,在轮流显示过程中,每位数码管点亮时间位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();
}
}