//利用定时器1和动态扫描实现定时器1在数码管上显示从765432
//以十分之一秒往下下降,降到765398并且保持此数,与此同时定时器0
//以500ms的速度从上到下进行流水灯从上到下流动。当数码管减到停止时
//流水灯也停止,然后开始全部闪烁,3s后流水灯全部停止,数码管显示HELLO
//实验结果,流水灯和数码管跑动的时间太快,不是我定时器设定的时间。
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit wela=P2^7;
sbit dula=P2^6;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,
0x76,0x79,0x38,0x3f,0};
uchar temp,t0,t1,aa,bb,cc,bai,shi,ge,flag,flag1;
uint shu;
void delayms(uint z);
void init();
void display(uchar aa,uchar bb,uchar cc,uchar bai,uchar shi,uchar ge);
void main()
{
init();
while(1)
{
if(flag1!=1)//如果此处成立,运行下面语句。
display(7,6,5,bai,shi,ge);
else//不然,运行此语句
display(16,17,18,18,19,20);
}
}
void init()//总的概括
{
shu=432;
temp=0xfe;
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
TH1=(65536-45872)/256;
TL1=(65536-45872)%256;
EA=1;
ET0=1;
ET1=1;
TR0=1;
TR1=1;
}
void delayms(uint z)//延时函数体
{
uint i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
void time0() interrupt 1//中断0函数
{
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
t0++;
if(flag!=1)//标志位flag,承下面106语句附近,灯灭了,数码管停了,需要重新打开0定时器,让灯全部亮起来
{
if(t0==10)
{
t0=0;
temp=_crol_(temp,1);
P1=temp;//流水灯流动
}
}
else//接上面if语句。因为等全部亮起来,需要三秒停下来。然后数码管显示HELLO,用的是标志位flag2
{
if(t0%4==0)
P1=~P1;//亮间隔大概200ms.(此处对4求模不是很理解,求解释)
if(t0==60)
{
TR0=0;
P1=0xff;
flag1=1;//如果总的3秒时间到了,开启标志位1,准备显示HELLO.
}
}
}
void time1() interrupt 3 //定时器1
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
t1++;
if(t1==2)
{
t1=0;
shu--;
bai=shu/100;
shi=shu%100/10;
ge=shu%10;//因为数的前几个数字都一样,数我就直接定义变化的后三位398
if(shu==398)
{
TR0=0;
TH0=(65536-50000)/256;//关闭了一次,内部有数字,所以需要重新装一次
TL0=(65536-50000)%256;//接上面数停,流水灯停,需要重新再打开定时器0,后面要全部在闪起来。
TR0=1;
flag=1;//第一个标志位
t0=0;//t0必须清0 ,之前里面有数字再跑。
TR1=0;
P1=0xff;
}
}
}
void display(uchar aa,uchar bb,uchar cc,uchar bai,uchar shi,uchar ge)
{
wela=1;//显示函数没什么好说的
P0=0xfe;
wela=0;
dula=1;
P0=table[aa];
dula=0;
P0=0xff;
delayms(1);
wela=1;
P0=0xfd;
wela=0;
dula=1;
P0=table[bb];
dula=0;
P0=0xff;
delayms(1);
wela=1;
P0=0xfb;
wela=0;
dula=1;
P0=table[cc];
dula=0;
P0=0xff;
delayms(1);
wela=1;
P0=0xf7;
wela=0;
dula=1;
P0=table[bai];
dula=0;
P0=0xff;
delayms(1);
wela=1;
P0=0xef;
wela=0;
dula=1;
P0=table[shi];
dula=0;
P0=0xff;
delayms(1);
wela=1;
P0=0xdf;
wela=0;
dula=1;
P0=table[ge];
dula=0;
P0=0xff;
delayms(1);
} |