數碼管延時我用的定時器1,程序是每隔一秒數碼管加一,LED亮滅一次,如果在主程序內調用數碼管就能正常工作,放到任意一個定時器內調用都不行,有沒有大神能解解惑,或者我想讓數碼管全程顯示,后期主程序內會有其他循環程序,如果一次次調用太麻煩,有沒有什么別的辦法讓數碼管全程顯示而不影響主程序的方法?(文化水平不高,代碼編的有點菜,望見諒)
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit wei=P2^7;//位選,第幾個數碼管亮
sbit duan=P2^6;
sbit D1=P1^1;
uint xianshu,shi,ge,bai,qian,wan;
uint aa,s,bb;
uchar y;
uchar code smb[]={ //數碼表
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void xshu(uint ge,uint shi,uint bai,uint qian,uint wan);
void delay(uint);//延時子程序聲明
void chushi();//初始化子程序聲明
void main()
{
chushi();
delay(10);
while(1)
{
// xshu(ge,shi,bai,qian,wan);//調用顯示子程序
if(aa>=10)//定時器進入10次中斷
{
D1=1;
if(aa>=19)//定時器進入19次中斷
{
D1=0;//點亮LED
aa=0;//定時器進入中斷數清零
s++;//數碼管顯示的數字
}
}
}
}
void chushi()//初始化子程序
{
xianshu=0;
TMOD=0x01;
EA=1;//全局中斷總開關
TH0=(65536-46072)/256;//裝入初值
TL0=(65536-46072)%256;
TR0=1;//打開定時器0
ET0=1;//定時器0允許中斷開關
TH1=(65536-5072)/256;//裝入初值
TL1=(65536-5072)%256;
TR1=1;//打開定時器1
ET1=1;//定時器0允許中斷開關
}
void timer0() interrupt 1 //定時器0中斷服務程序
{
TH0=(65536-46072)/256;//進入定時器服務函數后,需要重新裝入初值
TL0=(65536-46072)%256;
aa++;
xshu(ge,shi,bai,qian,wan);//調用數碼管子程序
}
void timer1() interrupt 3 //定時器1中斷服務程序
{
TH1=(65536-5072)/256;//進入定時器服務函數后,需要重新裝入初值
TL1=(65536-5072)%256;
y++;
}
void Delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void xshu(uint ge,uint shi,uint bai,uint qian,uint wan)//數碼管顯示子程序
{
if(s==65000)//最大65535
{
s=0;//數碼管顯示清零
}
xianshu=s;//讓數碼管顯示脈沖s的數量
wan=xianshu/10000;
qian=xianshu%10000/1000;
bai=xianshu%10000%1000/100;
shi=xianshu%10000%1000%100/10;
ge=xianshu%10;
if(s>=10000)
{
wei=1;
P0=0xfd;
wei=0;
duan=1;
P0=smb[wan];
duan=0;
y=0;//進中斷數清零
while(y<=10);//延時
P0=0xff; //消影
}
if(s>=1000)
{
wei=1;
P0=0xfb;
wei=0;
duan=1;
P0=smb[qian];
duan=0;
y=0;//進中斷數清零
while(y<=10);//延時
P0=0xff; //消影
}
if(s>=100)
{
wei=1;
P0=0xf7;
wei=0;
duan=1;
P0=smb[bai];
duan=0;
y=0;//進 |