什么是动态数码管?
所谓的动态数码管不过是利用人的视觉残留效果,在多位显示数字。
20ms内在另一位数码管上显示数字,视觉上就像是同时点亮了两个数码管。而间隔时间过短则会造成亮度变暗。一般情况下为几ms间隔时间。
显示数字 16
- 程序现象:选择两位来显示数字
- 程序说明:1、573的D1~D8连接单片机的P0~P7。2、138的ABC引脚连接单片机P2.0,P2.1,P2.2;
#include "reg52.h"
sbit HC_A=P2^0;
sbit HC_B=P2^1;
sbit HC_C=P2^2;
int smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值
void delay(unsigned int i) // 10*i us
{
while(i--);
}
void Select(unsigned int Pos) // 位选,即选通某一个数码管
{
switch(Pos)
{
case(0):
HC_A=0;HC_B=0;HC_C=0; break;
case(1):
HC_A=1;HC_B=0;HC_C=0; break;
case(2):
HC_A=0;HC_B=1;HC_C=0; break;
case(3):
HC_A=1;HC_B=1;HC_C=0; break;
case(4):
HC_A=0;HC_B=0;HC_C=1; break;
case(5):
HC_A=1;HC_B=0;HC_C=1; break;
case(6):
HC_A=0;HC_B=1;HC_C=1; break;
case(7):
HC_A=1;HC_B=1;HC_C=1; break;
}
}
void show_two(int num,int pos_x,int pos_y) // 选择显示两位数字的数码管位置
{
Select(pos_x);
P0=smgduan[num/10];
delay(100);
P0=0x00;
Select(pos_y);
P0=smgduan[num%10];
delay(100);
P0=0x00;
}
void main()
{
while(1)
{
show_two(16,6,7);
}
}
左右滚动显示数字
- 程序现象:左移显示0到F,再右移显示F到0
#include "reg52.h"
sbit HC_A=P2^0;
sbit HC_B=P2^1;
sbit HC_C=P2^2;
int smgduan[33]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00};//显示0~F的值,前面8个0,后面8个0
void delay(unsigned int i) // 10*i us
{
while(i--);
}
void main()
{
int j=0,i=0;
for(j=0;j<33;j++) // 左移,显示0~~F
{
for(i=0;i<50;i++)
{
HC_A=0;HC_B=0;HC_C=0;
P0=smgduan[j]; delay(100);P0=0x00;
HC_A=1;HC_B=0;HC_C=0;
P0=smgduan[j+1];delay(100);P0=0x00;
HC_A=0;HC_B=1;HC_C=0;
P0=smgduan[j+2];delay(100);P0=0x00;
HC_A=1;HC_B=1;HC_C=0;
P0=smgduan[j+3];delay(100);P0=0x00;
HC_A=0;HC_B=0;HC_C=1;
P0=smgduan[j+4];delay(100);P0=0x00;
HC_A=1;HC_B=0;HC_C=1;
P0=smgduan[j+5];delay(100);P0=0x00;
HC_A=0;HC_B=1;HC_C=1;
P0=smgduan[j+6];delay(100);P0=0x00;
HC_A=1;HC_B=1;HC_C=1;
P0=smgduan[j+7];delay(100);P0=0x00;
}
}
for(j=33;j>7;j--) // 右移,显示F~~0
{
for(i=0;i<50;i++)
{
HC_A=1;HC_B=1;HC_C=1;
P0=smgduan[j-1];delay(100);P0=0x00;
HC_A=0;HC_B=1;HC_C=1;
P0=smgduan[j-1];delay(100);P0=0x00;
HC_A=1;HC_B=0;HC_C=1;
P0=smgduan[j-2];delay(100);P0=0x00;
HC_A=0;HC_B=0;HC_C=1;
P0=smgduan[j-3];delay(100);P0=0x00;
HC_A=1;HC_B=1;HC_C=0;
P0=smgduan[j-4];delay(100);P0=0x00;
HC_A=0;HC_B=1;HC_C=0;
P0=smgduan[j-5];delay(100);P0=0x00;
HC_A=1;HC_B=0;HC_C=0;
P0=smgduan[j-6];delay(100);P0=0x00;
HC_A=0;HC_B=0;HC_C=0;
P0=smgduan[j-7];delay(100);P0=0x00;
}
}
while(1);
}