#include<reg52.h>
typedef unsigned char uint8;
typedef unsigned int uint16;
uint16 y;
sbit smg1=P0^0;
sbit smg2=P0^1;
sbit smg3=P0^2;
sbit smg4=P0^3;
code uint8 number[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,};
uint8 a[4];
void smg_led()
{
static uint8 x=0;
P0=0xff; //为什么不加这一句数码管显示乱码?
switch(x)
{
case 0:smg1=0; x++;P1=number[a[0]]; break;
case 1:smg2=0; x++;P1=number[a[1]]; break;
case 2:smg3=0; x++;P1=number[a[2]]; break;
case 3:smg4=0; x=0;P1=number[a[3]]; break;
default: break;
}
}
void T1_time()
{
TMOD=0x01;
TH1=0x3c;
TL1=0xb0;
TR1=1;
}
void T1_zd()
{
EA=1;
ET1=1;
}
main()
{
T1_time();
T1_zd();
while(1);
}
void T1_interrupt()interrupt 3
{
static uint16 j=0;
TH1=0x3c;
TL1=0xb0;
TR1=1;
y++;
if(y==20)//中断20次不是一秒吗。为什么只有1%10左右,晶振12MHZ;
{
j++;
y=0;
a[0]=j%10;
a[1]=j/10%10;
a[2]=j/100%10;
a[3]=j/1000%10;
}
smg_led();
}
你好,按照你的程序重新编写了一下 ,数码管不亮了,第一个问题已经知道了 。就是中断不太明白, 谢谢你啊。。
追答其实 只要 把你的 T1 中断, 分成 T0 和 T1 两个中断,
原来的 T1 把定时 时间 修改一下,直接用来 调用显示程序,其它程序 放到 T0 中,
原来的 T1 把定时 复制一个 ,改成 T0 , 去掉 显示程序,
T0 T1 初始化一下 就可以了,
如:
void T1_time()
{
TMOD=0x01;
TH0=0x3c;
TL0=0xb0;
TH1=0x3c;
TL1=0xb0;
TR0=1;
TR1=1;
}
void T1_zd()
{
EA=1;
ET0=1;
ET1=1;
}
void T0_interrupt()interrupt 1
{
static uint16 j=0;
TH1=0x3c;
TL1=0xb0;
y++;
if(y==20)
{
j++;
y=0;
a[0]=j%10;
a[1]=j/10%10;
a[2]=j/100%10;
a[3]=j/1000%10;
}
}
void T1_interrupt()interrupt 3
{
TH1=0x0c; // 5 mS
TL1=0x77;
smg_led();
}