补发上节课原理图,如果是多个数码管,只需要把所有数码管的a连在一起,所有的b连在一起,所有的c连在一起,所有的d连在一起,所有的e连在一起,所有的f连在一起,所有的g连在一起,所有的h连在一起, 把控制位分别接P1.0,P1.1,P1.2,P1.3,只有控制位为0时被控制的那个数码管才会显示。
上节课只能显示1位数码管而且还是在主循环内一直等待,那我们的程序就只能显示时间了,不符合我们的使用要求,我们可以让时间在定时器中变化。
我们先声明一个最大9999秒的变量,一个int型变量miaoshu。
再定义一个标志位,什么时候刷新,比如到1秒我们再去刷新,不够1秒不去刷新。
定义几个数码管的控制位,让哪个数码管显示。
再定义一个数组 显示的数 的缩写,用来显示数字。
#include<reg52.h>
sbit kongzhi0=P1^0;
sbit kongzhi1=P1^1;
sbit kongzhi2=P1^2;
sbit kongzhi3=P1^3;
unsigned char code shuzi[ ]={ 0xC0,0xF9, 0xA4,0xb0, 0x99,0x92,0x82,0xF8,0x80,0x90};
unsigned int miaoshu=0;
bit shuaxin=0;
unsigned char i=0;
unsigned char xsds[]={0xff, 0xff,0xff,0xff};
void main()
{
EA=1;
TMOD=0x01;
TH0=0xD8;
TL0=0xEF;
ET0=1;
TR0=1;
while(1)
{
if(shuxin==1)
{
shuxin=0;
xsds[0]= shuzi [ miaoshu%10]; 百分比号是取余数的意思,例如85对10取余数 就是85/10=8余5,我们只要余数5.前面的结果8我们不要。
xsds[1]= shuzi [miaoshu/10%10];
xsds[2]= shuzi [miaoshu/100%10];
xsds[3]= shuzi [miaoshu/1000%10];
}
if(i==0)
{kongzhi3=1 ; kongzhi0 = 0 ; i++; P2=xsds[0] ;}
if(i==1)
{kongzhi0=1 ; kongzhi1= 0 ; i++; P2=xsds[1] ;}
if(i==2)
{kongzhi1=1 ; kongzhi2= 0 ; i++; P2=xsds[2] ;}
if(i==3)
{kongzhi2=1 ; kongzhi3= 0 ; i=0; P2=xsds[3] ;} 这里注意一下,让i=0,重新刷新第一 个数码管。
}
}
void dingshiqi0() interrupt 1
{
static unsingned char i=0;
TH0=0xD8;
TL0=0xEF;
i++;
if(i>=100)
{
i=0;
miaoshu++;
shaxin=1;
if(miaoshu>=10000)
{miaoshu=0;}
}
}