数码管延时我用的定时器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;//进 |