动态数码管显示
目的:同时显示多个不同字符串
原理:延时时间设为5ms(利用人眼反映时间差)
注意事项:
1.proteus调试,需设置系统-》设置动画选项
将原来默认的25 50m 50m 20 设置为50 5m 10u 12M 4[没单位的默认设置为1s]
2.实际应用时段选位选都需加锁存器,否则容易跳乱码。
duan=1;
P0=table_d[i];
duan=0;
wei=1;
P1=table_w[j];
wei=0;
3.设计如下代码时,注意将数限定在一定范围内,否则容易发生溢出。
j=(j+1)%3;
if(3==j)
{
j=0;
}
动态数码管显示字符串的代码如下:
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned long
void init();
void delay(uint a);
void display(uint num);
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳
uchar code table_w[]={0x01,0x02,0x04};
uint num=998;
uchar j=0;
sbit LE=P3^5;
uchar tt=0;
void main()
{
init();
while(1)
{
display(num);
delay(5);//5ms
}
}
void delay(uint a)
{
uint i,j;
for(i=a;i>0;i--)
for(j=20;j>0;j--);
}
void display(uint num)
{
uchar i=0;
uchar bai,shi,ge;
P2=table_w[j]; //段选开关,负责给当前led灯加高电平(共阳极)
//i=(i+1)%8;
switch(j)
{
case 0:bai=num/100;i=bai;break;
case 1:shi=num%100/10;i=shi;break;
case 2:ge=num%10;i=ge;break;
default:break;
}
LE=1; //段选加锁存器
P0=table[i];//位选开关,负责给led灯显示数字
LE=0;
j=(j+1)%3;
if(3==j)
{
j=0;
}
}
void init()
{
//设置定时器50ms中断一次,中断后,需将TH0、TL0置0
TH0=(65536-50000)/256; //高8位50ms产生溢出
TL0=(65536-50000)%256; //低8位50ms产生溢出
//设置中断工作方式为模式1(16位自加器)
TMOD=0x01;
EA=1; //开总中断控制开关
ET0=1; //开定时器控制中断开关
TR0=1; //设置定时器0开启
}
void timer0()interrupt 1
{
if(20==tt)
{
tt=0;
num++;
if(1000==num)
{
num=0;
}
}
tt++;
//将TH0、TH1置0
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
}
//备注:实际应用时段选位选都需加锁存器,否则容易跳乱码
/*
duan=1;
P0=table_d[i];
duan=0;
wei=1;
P1=table_w[j];
wei=0;
*/