微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 讨论一下,程序问题,关于数码管动态显示四位数整数

讨论一下,程序问题,关于数码管动态显示四位数整数

时间: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”。我怀疑是子函数调用时,参数的定义和传递有问题,我试着改了多次,也无法成功(主要是我对子函数参数传递这块不太熟悉)。
如果有哪位仁兄,能热心帮助一下小弟,不胜感激!

一个简单功能写的这么复杂,数码管显示不用定时中断。

把子函数的void display(...)改为uchar display(。),因为void是无返回值的函数定义,你的display函数不是类似于delay那种空循环的,而是需要返回一个值得函数。

把子函数的void display(...)改为uchar display(。),因为void是无返回值的函数定义,你的display函数不是类似于delay那种空循环的,而是需要返回一个值得函数。

感谢你的回答哈,我试过你的方法,不可行的。这样写是可以的哈,因为本来就没有返回值嘛
后来校内网上有哥们找出问题了,主要是子函数中,while()循环中,一直在显示,中间没有任何延迟,就会导致4位数码管只显示一位,后来我将while语句去掉,再将display(qian,bai,shi,ge);放入中断函数中,这样就可以实现功能呢
最后,还是要谢谢你哈

呵呵,那用什么啊,直接用延迟函数吗?

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top