数码管的动态显示原理
第一个数码管显示0,1s后第二个数码管显示1,直到第六个数码管显示5后又重新开始
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit LE_D = P2^6;
sbit LE_W = P2^7;
uchar code table_D[] = {0xC0,0xF9,0xA4,0XB0,0x99,0x92,0x82,0xF8,0x80,0x98};
uchar code table_W[] = {0x01,0x02,0x04,0x08,0x10,0x20};
uint time = 0;
uint Num_D = 0;
uint Num_W = 0;
void main(){
//中断初始化
TMOD = 0x01; //0000 0001
TH0 = 0xFC; //1ms
TL0 = 0x17;
EA = 1;
ET0 = 1;
TR0 = 1;
//第一个数码管显示0,1mS后第二个数码管显示1...
while(1){
if(time == 1000){
time = 0;
if(Num_D == 6) Num_D = 0;
if(Num_W == 6) Num_W = 0;
//消隐(当你更新显示的“段”的时候,显示的位置,还是在前一时间的“位”上;
//然后你再更新“位”,这就出现移动的效果了。)
LE_W = 1;
P0 = 0x00;
LE_W = 0;
LE_D = 1;
P0 = table_D[Num_D];
LE_D = 0;
LE_W = 1;
P0 = table_W[Num_W];
LE_W = 0;
Num_D++;
Num_W++;
}
}
}
void exter1() interrupt 1{
TH0 = 0xFC; //1ms
TL0 = 0x17;
time++;
}
如果我们把数字依次显示的间隔时间换为5mS,那么数码管就能动态显示出012345
用数码管动态显示1-300
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit LE_D = P2^6;
sbit LE_W = P2^7;
uchar code table_D[] = {0xC0,0xF9,0xA4,0XB0,0x99,0x92,0x82,0xF8,0x80,0x98};
uchar code table_W[] = {0x01,0x02,0x04,0x08,0x10,0x20};
uint time = 0;
uint Num_D = 0;
uint Num_W = 0;
uchar ge,shi,bai;
uint num = 0;
void init();
void delay(uint dtime);
void display(uint num);
void main(){
init();
num = 0;
while(1){
if (time >= 1000){
time = 0;
num++;
if(num == 301){
num = 0;
}
}
display(num);
}
}
//计时器中断函数
void exter1() interrupt 1{
TH0 = 0xFC; //1ms
TL0 = 0x17;
time++;
}
//数码管显示数字的函数
void display(uint num){
bai = num / 100; //百位应显示的数字
shi = num % 100 /10; //十位应显示的数字
ge = num % 10; //个位应显示的数字
//数码管显示个位数字
LE_D = 1;
P0 = table_D[ge]; //段——>位 会在段所指的位置上显示段
LE_D = 0; //位——>段 新的数字会显示到之前的位置上
LE_W = 1;
P0 = 0x20; //0010 0000
LE_W = 0;
delay(1);
LE_W = 1; //消隐
P0 = 0;
LE_W = 0;
//数码管显示十位数字
LE_D = 1;
P0 = table_D[shi];
LE_D = 0;
LE_W = 1;
P0 = 0x10; //0001 0000
LE_W = 0;
delay(1);
LE_W = 1; //消隐
P0 = 0;
LE_W = 0;
//数码管显示百位数字
LE_D = 1;
P0 = table_D[bai];
LE_D = 0;
LE_W = 1;
P0 = 0x08; //0000 1000
LE_W = 0;
delay(1);
LE_W = 1; //消隐
P0 = 0;
LE_W = 0;
}
//延时
void delay(uint dtime) //delay = 1 ms 0.001s
{
uint y;
uint z;
for(z = dtime; z > 0; z--){
for(y = 115; y > 0; y--){}
}
}
//初始化
void init(){
LE_D = 0;
LE_W = 0;
TMOD = 0x01; //0000 0001
TH0 = 0xFC; //1ms
TL0 = 0x17;
EA = 1;
ET0 = 1;
TR0 = 1;
}
Proteus仿真