发光二极管依次点亮:
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar temp;
void delay(uint z);
void main()
{
temp=0xfe;//第一个发光二极管点亮
P1=temp;
while(1)
{
delay(1000);
temp=_crol_(temp,1);//_crol_是左移函数
P1=temp;
}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
发光二极管依次点亮的同时数码管显示:
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar temp,aa,num;
sbit dula=P2^6;
sbit wela=P2^7;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(uint z);
void main()
{
num=0;
aa=0;
TMOD=0x01;//步骤1,对TMOD赋值,以确定T0和T1的工作方式
TH0=(65536-50000)/256;//步骤2,计算初值,并将其写入TH0、TL0或TH1、TL1
TL0=(65536-50000)%256;
EA=1;//开总中断
ET0=1;//开定时器0中断
TR0=1;//启动定时器0
temp=0xfe;//第一个发光二极管点亮
P1=temp;
dula=1;
P0=table[0];
dula=0;
wela=1;
P0=0xea;//所有数码管全亮
wela=0;
while(1)
{
delay(1000);
temp=_crol_(temp,1);//_crol_是左移函数
P1=temp;
/*if(aa==40)//之所以把数码管显示的这段程序放到中断程序中是因为在上面的//delay(1000)的延时1s的时间内,很可能由定时器控制的计数器加到aa==40,导致下面的程//序不能执行,造成错误
{
aa=0;
num++;
if(num==16)
num=0;
dula=1;
P0=table[num];
dula=0;
}*/
}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void timer0() interrupt 1//有时后面加"using 0(1,2,3)",表示第几组工作寄存器,共四组,见书//P12和P16
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
aa++;
if(aa==40)
{
aa=0;
num++;
if(num==16)
num=0;
dula=1;
P0=table[num];
dula=0;
}
}
位选编码依次选中第一数码管,第二个数码管一直到第六个数码管:fe,fd,fb,f7,ef,df
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar temp,aa,numdu,numwe;
sbit dula=P2^6;
sbit wela=P2^7;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uchar code tablewe[]={
0xfe,0xfd,0xfb,0xf7,0xef,0xdf};//数码管的位选编码,依次从第一个数码管到第六个数码管
void main()
{
numdu=0;
numwe=0;
aa=0;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
while(1)
{
if(aa==20)
{
aa=0;
numdu++;
if(numdu==7)
numdu=1;
dula=1;
P0=table[numdu];
dula=0;
wela=1;
P0=tablewe[numwe];
wela=0;
numwe++;
if(numwe==6)
numwe=0;
}
}
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
aa++;
}
数码管动态显示:当定时器的中断时间很短时,数码管扫描很快,数码管交替更换很快,人的肉眼就会看见几个数码管同时显示
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar temp,aa,numdu,numwe;
sbit dula=P2^6;
sbit wela=P2^7;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uchar code tablewe[]={
0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
void main()
{
numdu=0;
numwe=0;
aa=0;
TMOD=0x01;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
EA=1;
ET0=1;
TR0=1;
while(1)
{
if(aa==1)
{
aa=0;
numdu++;
if(numdu==7)
numdu=1;
dula=1;
P0=table[numdu];
dula=0;
wela=1;
P0=tablewe[numwe];
wela=0;
numwe++;
if(numwe==6)
numwe=0;
}
}
}
void timer0() interrupt 1
{
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
aa++;
}
显示一个十位十进制数,通过设置temp,如果显示百位十进制数就要定义一个bai(在256范围内,因为temp是uchar型,是0到256)
Bai= temp/100;
shi=temp%100/10;
ge=temp%10;
:
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar temp,numdu,shi,ge;//当显示大于255的数字时,要将temp定义成uint型,因为uchar 型//即unsigned char型,范围在0~255之间
sbit dula=P2^6;
sbit wela=P2^7;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(uint z);
void main()
{
temp=12;
numdu=0;
while(1)
{
shi=temp/10;
ge=temp%10;
dula=1;
P0=table[shi];
dula=0;
wela=1;
P0=0xfe;
wela=0;
delay(5);
dula=1;
P0=table[ge];
dula=0;
wela=1;
P0=0xfd;
wela=0;
delay(5);
}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
利用子函数显示一个百位数:
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar bai,shi,ge;
uint temp;
sbit dula=P2^6;
sbit wela=P2^7;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(uint z);
void display(uchar,uchar,uchar);
void main()
{
temp=456;
bai=temp/100;
shi=temp%100/10;
ge=temp%10;
while(1)
{
display(bai,shi,ge);
}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void display(uchar bai,uchar shi,uchar ge)
{
dula=1;
P0=table[bai];
dula=0;
wela=1;
P0=0xfe;
wela=0;
delay(5);
dula=1;
P0=table[shi];
dula=0;
wela=1;
P0=0xfd;
wela=0;
delay(5);
dula=1;
P0=table[ge];
dula=0;
wela=1;
P0=0xfb;
wela=0;
delay(5);
}
从0显示到99,隔一秒加一次:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar temp,aa,bai,shi,ge;
sbit dula=P2^6;
sbit wela=P2^7;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void display(uchar bai,uchar shi,uchar ge);
void delay(uint z);
void init();
void main()
{
init();//初始化子程序
while(1)
{
if(aa==20)//一次中断是50(50000)ms,(a=20)20次就是1s
{
aa=0;
temp++;
if(temp==100)
{
temp=0;
}
bai=temp/100;
shi=temp%100/10;
ge=temp%10;
}
display(bai,shi,ge);
}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void display(uchar bai,uchar shi,uchar ge)
{
dula=1;
P0=table[bai];
dula=0;
P0=0xff;//因为如果没有这句,段选数据送完后P0=table[bai],下面的位选打开//wela=1,P0口的数据P0=table[bai]送到下面的位选,导致数码管还没正式送位选P0=0xfe
//就直接显示数字P0=table[bai],导致错误
//P0=table[bai]会传给下面的位选导致后面几个数码管也可能亮
//P0=0xff作用是让所有数码管都不用,即消隐
wela=1;
P0=0xfe;
wela=0;
delay(1);//delay(1)是延时1ms,如果时间长了就可能影响中断的程序
//因为中断程序时间范围内,如果延时超过中断时间就会影响中断程序
dula=1;
P0=table[shi];
dula=0;
P0=0xff;//道理同上
wela=1;
P0=0xfd;
wela=0;
delay(1);//如果没有延时P0=0xfd会很快的传给下面的段选,导致错误
dula=1;
P0=table[ge];
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
delay(1);
}
void init()//初始化函数,程序规范化,初始化放到一个子函数里
{
wela=0;//初始化中要把段选和位选都清零
dula=0;
temp=0;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
aa++;
}
课件练习:
利用动态扫描方法在六位数码管上显示出稳定的654321:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit dula=P2^6;
sbit wela=P2^7;
uchar dunum;
char wenum;//uchar类型的是不能为负数的,这里的wela是要有负的部分数字
uchar code dutable[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
};
uchar code wetable[]={
0xfe,0xfd,0xfb,0xf7,0xef,0xdf
};
void delay(uint z)
{
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void init()
{
dunum=0;
wenum=5;
dula=0;
wela=0;
}
void main()
{
init();
while(1)
{
dunum++;
if(dunum==7)
dunum=1;
dula=1;
P0=dutable[dunum];
dula=0;
P0=0xff;//这句程序的后面要是加上delay(5),各个数码管会变化很多数字
wela=1;
P0=wetable[wenum];
wela=0;
wenum--;
if(wenum==-1)
wenum=5;// wetable[wenum]数组的起始值的序号是从0到5
delay(5);
}
}
课件的程序:
#include<reg52.h> //52单片机头文件
#include <intrins.h> //包含有左右循环移位子函数的库
#define uint unsigned int //宏定义
#define uchar unsigned char //宏定义
sbit dula=P2^6; //数码管段选锁存端
sbit wela=P2^7; 数码管位选锁存端
uchar code table[]={ //数码管显示编码
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void display(uchar,uchar,uchar,uchar,uchar,uchar); //函数声明
void delay(uint);
void main()
{
while(1)
{
display(6,5,4,3,2,1); //始终显示
}
}
void display(uchar one,uchar two,uchar three,uchar four,uchar five,uchar six)
{
dula=1;
P0=table[one]; //送段数据
dula=0;
P0=0xff; //送位数据前关闭所有显示,防止打开位选锁存后段选数据通过位选//锁存器
wela=1;
P0=0xfe;
wela=0;
delay(1);
dula=1;
P0=table[two];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delay(1);
dula=1;
P0=table[three];
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
delay(1);
dula=1;
P0=table[four];
dula=0;
P0=0xff;
wela=1;
P0=0xf7;
wela=0;
delay(1);
dula=1;
P0=table[five];
dula=0;
P0=0xff;
wela=1;
P0=0xef;
wela=0;
delay(1);
dula=1;
P0=table[six];
dula=0;
P0=0xff;
wela=1;
P0=0xdf;
wela=0;
delay(1);
}
void delay(uint z) //延时子函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
用动态扫描方法和定时器1在数码管的前三位显示出秒表,精确到1%秒,即后两位显示1%秒,一直循环下去:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar aa,bb,bai,shi,ge,shii;
sbit dula=P2^6;
sbit wela=P2^7;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
};
void delay(uchar z)
{
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void init()
{
aa=0;
bb=0;
bai=0;
shi=0;
ge=0;
shii=0;
TMOD=0x11;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
//TMOD=0x10;
TH1=(65536-10000)/256;
TL1=(65536-10000)%256;
//EA=1;
ET1=1;
TR1=1;
dula=1;
P0=table[0];
dula=0;
P0=0xff;
wela=1;
P0=0xc8;
wela=0;
}
void display(uchar bai,uchar shi,uchar ge)
{
dula=1;
P0=table[bai];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delay(1);
dula=1;
P0=table[shi];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delay(1);
dula=1;
P0=table[ge];
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
delay(1);
}
void displayy(uchar shii,uchar bb)
{
dula=1;
P0=table[shii];
dula=0;
P0=0xff;
wela=1;
P0=0xef;
wela=0;
delay(1);
dula=1;
P0=table[bb];
dula=0;
P0=0xff;
wela=1;
P0=0xdf;
wela=0;
delay(1);
}
void main()
{
init();
while(1)
{
if(aa==20)
{
aa=0;
ge++;
if(ge==10)
{
ge=0;
shi++;
if(shi==6)
{
shi=0;
bai++;
if(bai==10)
bai=0;
}
}
}
display(bai,shi,ge);
if(bb==10)
{
bb=0;
shii++;
if(shii==10)
shii=0;
}
displayy(shii,bb);
}
}
void inter0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
aa++;
}
void inter1() interrupt 3
{
TH1=(65536-10000)/256;
TL1=(65536-10000)%256;
bb++;
}
对于题目:用动态扫描方法和定时器1在数码管的前三位显示出秒表,精确到1%秒,即后两位显示1%秒,一直循环下去
我的方法:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar bai,shi,ge;
uint aa;
sbit dula=P2^6;
sbit wela=P2^7;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
};
void delay(uint z)
{
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void init()
{
aa=0;
bai=0;
shi=0;
ge=0;
TMOD=0x10;
TH1=(65536-10000)/256;
TL1=(65536-10000)%256;
EA=1;
ET1=1;
TR1=1;
/* dula=1;
P0=table[0];
dula=0;
P0=0xff;
wela=1;
P0=0xf8;
wela=0;*/
}
void display(uchar bai,uchar shi,uchar ge)
{
dula=1;
P0=table[bai];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delay(1);
dula=1;
P0=table[shi];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delay(1);
dula=1;
P0=table[ge];
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
delay(1);
}
void main()
{
init();
while(1)
{
display(bai,shi,ge); //显示函数要放在while(1)中,让display(bai,shi,ge)时刻显示,如//果放在中断函数中,只有中断时才会显示,在数码管上就显示不很亮,甚至亮度很弱
}
}
void inter1() interrupt 3
{
TH1=(65536-10000)/256;
TL1=(65536-10000)%256;
aa++;
}
利用动态扫描和定时器1在数码管上显示出从765432开始以1/10秒的速度往下递减直至765398并保持显示此数,与此同时利用定时器0以500MS速度进行流水灯从上至下移动,当数码管上数减到停止时,实验板上流水灯也停止然后全部开始闪烁,3秒后(用T0定时)流水灯全部关闭、数码管上显示出“HELLO”。到此保持住
我的方法:分成2块,第一块分成2部分:先利用动态扫描和定时器1在数码管上显示出从765432开始以1/10秒的速度往下递减直至765398并保持显示此数,再利用定时器0以500MS速度进行流水灯从上至下移动;第二块是流水灯也停止然后全部开始闪烁,3秒后(用T0定时)流水灯全部关闭、数码管上显示出“HELLO”
对于“直至765398并保持显示此数”,程序里关闭定时器1即可实现
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long int
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,
0x76,0x79,0x38,0x3f,0//为了显示HELLO,这里添加几个码,什么也不显示的码是0
};
sbit dula=P2^6;
sbit wela=P2^7;
uchar one,two,three,four,five,six,aa,bb,kk,dd,ee,flag;
ulong temp;//注意temp的值里有765432
void delay(uint z)
{
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void display(uchar one,uchar two,uchar three,uchar four,uchar five,uchar six)//显示函数单提出来
{
dula=1;
P0=table[one];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delay(1);//延时不能少,少了延时下面的数字送过来就会出现叠加
dula=1;
P0=table[two];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delay(1);
dula=1;
P0=table[three];
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
delay(1);
dula=1;
P0=table[four];
dula=0;
P0=0xff;
wela=1;
P0=0xf7;
wela=0;
delay(1);
dula=1;
P0=table[five];
dula=0;
P0=0xff;
wela=1;
P0=0xef;
wela=0;
delay(1);
dula=1;
P0=table[six];
dula=0;
P0=0xff;
wela=1;
P0=0xdf;
wela=0;
delay(1);
}
void init()
{
TMOD=0x11;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
EA=1;
ET0=1;
ET1=1;
TR0=1;
TR1=1;
ee=0xff;//ee为了控制发光二极管给P1口送数而设置的
flag=0;//flag为标志位,为了判断是否到了765398
kk=0xfe; //为了控制发光二极管流水灯给P1口送数
P1=kk;
temp=765432;
display(7,6,5,4,3,2);//显示初始值765432
}
void main()
{
init();
while(1)
{
display(one,two,three,four,five,six);//在主函数中才能不间断显示,在中断中会间断显//示
if(bb==10)
{
if(temp==765398)
flag=1; //当需要判断时多多利用标志位flag
if(flag==0)
{
bb=0;
kk=_crol_(kk,1);
P1=kk;
}
if(flag==1)
{
bb=0;
dd++;
if(dd==6)//定时3s后显示HELLO
{
dd=0;
TR0=0;
P1=0xff;
one=16;
two=17;
three=18;
four=18;
five=19;
six=20;//如果这里不将one到six换成HELLO,走到上面的//display(one,two,three,four,five,six),只会将原来的one到six的765398再次显示出来
display(one,two,three,four,five,six);
}
else
{
ee=~ee;
P1=ee;//全体发光二极管闪烁
}
}
}
}
}
void exter1() interrupt 3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
aa++;
if(aa==2)
{
aa=0;
temp--;
if(temp==765398)
{
TR1=0;//当temp==765398时,关断定时器1,就不再扫描
bb=0;
}
one=temp/100000;//分离出temp
two=temp%100000/10000;
three=temp%10000/1000;
four=temp%1000/100;
five=temp%100/10;
six=temp%10;
}
}
void exter0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
bb++;
}
课件的程序:在中断函数中,比如下面的中断0的中断时间是50ms,那么中断0中的函数的处理时间不要超过50ms,如果超过中断的时间,下一次中断到来时这次中断还没处理完,就会把下一次中断丢失;一个单周期指令是1us,一个双周期指令是2us,中断0才几条指令,总共也几微妙,远远小于50ms,所以不影响下一次中断;在中断中写一些利于方便计算和观察的程序就行
#include<reg52.h> //52单片机头文件
#include <intrins.h> //包含有左右循环移位子函数的库
#define uint unsigned int //宏定义
#define uchar unsigned char //宏定义
sbit dula=P2^6;
sbit wela=P2^7;
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,bai,shi,ge,flag,flag1;
uint shu;
void init(); //函数声明
void display(uchar aa,uchar bb,uchar cc,uchar bai,uchar shi,uchar ge);
void delay(uint z) //延时子函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void main() //主函数
{
init();
while(1)
{
if(flag1!=1) //如果flagi不再等于1则显示数据
display(7,6,5,bai,shi,ge);
else
display(16,17,18,18,19,20); //否则显示hello
}
}
void init() //初始化函数
{
shu=432;//观察到765432到765398的高3位都是765,不用参与分离程序,简化程序
temp=0xfe;
P1=temp;
TMOD=0x11;
TH0=(65536-50000)/256; //定时器初始化
TL0=(65536-50000)%256;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
EA=1;
ET0=1;
ET1=1;
TR0=1;
TR1=1;
}
void timer0() interrupt 1 //定时器0中断
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t0++;
if(flag!=1) //flag不等于1时进行流水灯
{
if(t0==10)
{
t0=1;//这里程序应该是t0=0
temp=_crol_(temp,1);
P1=temp;
}
}
else //否则进行灯闪烁
{
if(t0%4==0) //小灯每200毫秒变化一次
P1=~P1;
if(t0==60)
{
TR0=0; //3秒后关闭定时器0,关闭灯,并置flag=1
P1=0xff;
flag1=1;
}
}
}
void timer1() 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;
if(shu==398) //当到398时把原来T0中的数清除,重新加裁初值让小灯闪烁
{
TR0=0;
TH0=(65536-50000)/256;//还原定时器0,里面的数据此时会有一个数,//这里要还原一下
TL0=(65536-50000)%256;
TR0=1;//再重新启动定时器0
flag=1;
t0=0;
P1=0xff;
TR1=0;
}
}
}
void display(uchar aa,uchar bb,uchar cc,uchar bai,uchar shi,uchar ge) //显示子函数
{
dula=1;
P0=table[aa];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delay(1);
dula=1;
P0=table[bb];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delay(1);
dula=1;
P0=table[cc];
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
delay(1);
dula=1;
P0=table[bai];
dula=0;
P0=0xff;
wela=1;
P0=0xf7;
wela=0;
delay(1);
dula=1;
P0=table[shi];
dula=0;
P0=0xff;
wela=1;
P0=0xef;
wela=0;
delay(1);
dula=1;
P0=table[ge];
dula=0;
P0=0xff;
wela=1;
P0=0xdf;
wela=0;
delay(1);
}