8位数码管同时显示两个时钟
时间:10-02
整理:3721RD
点击:
小白刚学单片机,想弄个8位数码管同时显示两个时钟,但是仿真的时候一直停留在如图画面:
代码如下,哪位大神能帮我看一下吗?
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar a1,a2,fen1,miao1,fen2,miao2,fen11,fen12,fen21,fen22,miao11,miao12,miao21,miao22;
uchar code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //LED显示字模
uchar BitTab[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01 }; //LED位驱动码
void init();//初始化函数
void display();//显示函数
void delay(uint z);//延时函数
void main()//主函数
{
init();
while(1)//等待中断,并不停地动态扫描,定时器的时间到了,则中断发生,然后时间数值变化一次,时间不到则不停动态扫描。
{
fen11=fen1/10;//数值变化
fen12=fen1%10;
miao11=miao1/10;
miao12=miao1%10;
fen21=fen2/10;//数值变化
fen22=fen2%10;
miao21=miao2/10;
miao22=miao2%10;
display();//显示函数
}
}
void delay(uint z)//延时子函数
{ uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void init()//初始化变量,开启中断
{
fen1=1;
miao1=0;
TMOD=0x11;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1; //计数器0开始运行
TR1=1;
EA=1;
ET1=1;
}
void display()//显示子函数
{
P2=BitTab[0];//位选
P0=table[fen11];//段选
delay(1);
P2=BitTab[1];
P0=table[fen12];
delay(1);
P2=BitTab[2];
P0=table[miao11];
delay(1);
P2=BitTab[3];
P0=table[miao12];
delay(1);
P2=BitTab[4];//位选
P0=table[fen21];//段选
delay(1);
P2=BitTab[5];
P0=table[fen22];
delay(1);
P2=BitTab[6];
P0=table[miao21];
delay(1);
P2=BitTab[7];
P0=table[miao22];
delay(1);
}
void T0_time() interrupt 1 //中断服务程序
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
a1++;
a2++;
if(a1==20)//一秒钟
{
a1=0;
miao1++;
if(miao1==60)//秒钟
{
miao1=0;
fen1++;
if(fen1==60)//分钟
{
fen1=0;
}
}
}
if(a2==20)//一秒钟
{
a2=0;
miao2++;
if(miao2==60)//秒钟
{
miao2=0;
fen2++;
if(fen2==60)//分钟
{
fen1=0;
}
}
}
}
代码如下,哪位大神能帮我看一下吗?
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar a1,a2,fen1,miao1,fen2,miao2,fen11,fen12,fen21,fen22,miao11,miao12,miao21,miao22;
uchar code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //LED显示字模
uchar BitTab[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01 }; //LED位驱动码
void init();//初始化函数
void display();//显示函数
void delay(uint z);//延时函数
void main()//主函数
{
init();
while(1)//等待中断,并不停地动态扫描,定时器的时间到了,则中断发生,然后时间数值变化一次,时间不到则不停动态扫描。
{
fen11=fen1/10;//数值变化
fen12=fen1%10;
miao11=miao1/10;
miao12=miao1%10;
fen21=fen2/10;//数值变化
fen22=fen2%10;
miao21=miao2/10;
miao22=miao2%10;
display();//显示函数
}
}
void delay(uint z)//延时子函数
{ uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void init()//初始化变量,开启中断
{
fen1=1;
miao1=0;
TMOD=0x11;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1; //计数器0开始运行
TR1=1;
EA=1;
ET1=1;
}
void display()//显示子函数
{
P2=BitTab[0];//位选
P0=table[fen11];//段选
delay(1);
P2=BitTab[1];
P0=table[fen12];
delay(1);
P2=BitTab[2];
P0=table[miao11];
delay(1);
P2=BitTab[3];
P0=table[miao12];
delay(1);
P2=BitTab[4];//位选
P0=table[fen21];//段选
delay(1);
P2=BitTab[5];
P0=table[fen22];
delay(1);
P2=BitTab[6];
P0=table[miao21];
delay(1);
P2=BitTab[7];
P0=table[miao22];
delay(1);
}
void T0_time() interrupt 1 //中断服务程序
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
a1++;
a2++;
if(a1==20)//一秒钟
{
a1=0;
miao1++;
if(miao1==60)//秒钟
{
miao1=0;
fen1++;
if(fen1==60)//分钟
{
fen1=0;
}
}
}
if(a2==20)//一秒钟
{
a2=0;
miao2++;
if(miao2==60)//秒钟
{
miao2=0;
fen2++;
if(fen2==60)//分钟
{
fen1=0;
}
}
}
}
初始化定时器少了一句:ET0 = 1;加上去就OK了~
另外把TR1 = 1;和 ET1 = 1注释掉
嗯嗯,谢谢。早上起来的时候也发现了这个问题,但是改了这个问题还是不行,后来我把中断拆分成了两个中断就运行正常了
东西不错,学习一下,谢谢小编
这个只是一部分功能,我想通过按键实现设置每一位数码管的值,不知道如何写程序
提供个思路,你用定时器扫描数码管,主程序WHILE里面扫描按键
中断程序尽量短,可以把判断语句放在主循环,另外数码管显示在输入新的段数据并延时后要关闭位选
顶顶顶顶顶顶顶顶顶
谢谢分享的好资料