讨论一下,程序问题,关于数码管动态显示四位数整数
时间:10-02
整理:3721RD
点击:
#include<reg52.h> //数码管动态显示一个四位数整数2352
#define uchar unsigned char //宏定义
void display(uchar qian,uchar bai,uchar shi,uchar ge); //显示函数申明
uchar table[]={
0xeb,0x88,0xb3,0xba,
0xd8,0x7a,0x7b,0xa8,
0xfb,0xfa,0xf9,0x5b,
0x63,0x9b,0x73,0x71}; /*数码管译码表*/
uchar tablewe[]={0x01,0x02,0x04,0x08}; //数码管位选表
uchar cnt1,cnt2;
uchar qian,bai,shi,ge; //显示四位整数,千百十个
int num;
void main()
{
EA=1; //定时器初始化
TMOD=0x01;
TH0=(65536-200)/256;
TL0=(65536-200)%256;
ET0=1;
TR0=1; //定时器的初始化完成
num=2352; //对num进行赋值
while(1)
{
qian=num/1000; //对num进行千百十个的分离
bai=(num/100)%10;
shi=(num/10)%10;
ge=num%10; //将整数分离完成
if(cnt1==5) //当cnt1=5时,即1ms时,进入显示部分
{
cnt1=0; //将cnt1清零
display(qian,bai,shi,ge); //调用显示子函数,问题出在这里
}
}
}
void display(uchar qian,uchar bai,uchar shi,uchar ge) //显示子函数
{
while(cnt2<4) //判断cnt2的值是否小于4,总共4个数码管,显示4次
{
P1=tablewe[cnt2]; //位选通
if(cnt2==0) //判断是整数的哪一位,并显示出来
P0=table[qian];
else if(cnt2==1)
P0=table[bai];
else if(cnt2==2)
P0=table[shi];
else if(cnt2==3)
P0=table[ge];
cnt2++; //将cnt2从0,1,2,3分别显示出来
}
if(cnt2==4) //当cnt2=4时,清零
cnt2=0;
}
void into_T0() interrupt 1 //定时器中断,晶振为24MHZ,定时时间为0.2ms
{
TH0=(65536-200)/256;
TL0=(65536-200)%256; //装入初值
cnt1++; //对cnt1累加计数,当cnt1=5时,进入显示部分
}
这个函数的功能,是用单片机数码管,动态显示一个四位数整数“2352”。
我试过,如果不写显示子函数的话,将显示部分放在void main主函数下,while语句中if判断语句下,程序执行没有问题,并且下载运行没问题。
但是我想写一个子函数(主要是在学习期),但发现实现不了,数码管上只能显示一个数“2”。我怀疑是子函数调用时,参数的定义和传递有问题,我试着改了多次,也无法成功(主要是我对子函数参数传递这块不太熟悉)。
如果有哪位仁兄,能热心帮助一下小弟,不胜感激!
#define uchar unsigned char //宏定义
void display(uchar qian,uchar bai,uchar shi,uchar ge); //显示函数申明
uchar table[]={
0xeb,0x88,0xb3,0xba,
0xd8,0x7a,0x7b,0xa8,
0xfb,0xfa,0xf9,0x5b,
0x63,0x9b,0x73,0x71}; /*数码管译码表*/
uchar tablewe[]={0x01,0x02,0x04,0x08}; //数码管位选表
uchar cnt1,cnt2;
uchar qian,bai,shi,ge; //显示四位整数,千百十个
int num;
void main()
{
EA=1; //定时器初始化
TMOD=0x01;
TH0=(65536-200)/256;
TL0=(65536-200)%256;
ET0=1;
TR0=1; //定时器的初始化完成
num=2352; //对num进行赋值
while(1)
{
qian=num/1000; //对num进行千百十个的分离
bai=(num/100)%10;
shi=(num/10)%10;
ge=num%10; //将整数分离完成
if(cnt1==5) //当cnt1=5时,即1ms时,进入显示部分
{
cnt1=0; //将cnt1清零
display(qian,bai,shi,ge); //调用显示子函数,问题出在这里
}
}
}
void display(uchar qian,uchar bai,uchar shi,uchar ge) //显示子函数
{
while(cnt2<4) //判断cnt2的值是否小于4,总共4个数码管,显示4次
{
P1=tablewe[cnt2]; //位选通
if(cnt2==0) //判断是整数的哪一位,并显示出来
P0=table[qian];
else if(cnt2==1)
P0=table[bai];
else if(cnt2==2)
P0=table[shi];
else if(cnt2==3)
P0=table[ge];
cnt2++; //将cnt2从0,1,2,3分别显示出来
}
if(cnt2==4) //当cnt2=4时,清零
cnt2=0;
}
void into_T0() interrupt 1 //定时器中断,晶振为24MHZ,定时时间为0.2ms
{
TH0=(65536-200)/256;
TL0=(65536-200)%256; //装入初值
cnt1++; //对cnt1累加计数,当cnt1=5时,进入显示部分
}
这个函数的功能,是用单片机数码管,动态显示一个四位数整数“2352”。
我试过,如果不写显示子函数的话,将显示部分放在void main主函数下,while语句中if判断语句下,程序执行没有问题,并且下载运行没问题。
但是我想写一个子函数(主要是在学习期),但发现实现不了,数码管上只能显示一个数“2”。我怀疑是子函数调用时,参数的定义和传递有问题,我试着改了多次,也无法成功(主要是我对子函数参数传递这块不太熟悉)。
如果有哪位仁兄,能热心帮助一下小弟,不胜感激!
一个简单功能写的这么复杂,数码管显示不用定时中断。
把子函数的void display(...)改为uchar display(。),因为void是无返回值的函数定义,你的display函数不是类似于delay那种空循环的,而是需要返回一个值得函数。
把子函数的void display(...)改为uchar display(。),因为void是无返回值的函数定义,你的display函数不是类似于delay那种空循环的,而是需要返回一个值得函数。
感谢你的回答哈,我试过你的方法,不可行的。这样写是可以的哈,因为本来就没有返回值嘛
后来校内网上有哥们找出问题了,主要是子函数中,while()循环中,一直在显示,中间没有任何延迟,就会导致4位数码管只显示一位,后来我将while语句去掉,再将display(qian,bai,shi,ge);放入中断函数中,这样就可以实现功能呢
最后,还是要谢谢你哈
呵呵,那用什么啊,直接用延迟函数吗?