数码管同时显示的问题

2019-07-18 11:12发布

各位大神,我的数码管不能同时显示,只能一个一个的显示,不知道问题出在哪,求教。程序如下:
#include<reg52.h>
#include<intrins.h>            //51单片机的头文件
#define uchar unsigned char //类型定义,定义uchar类型
#define uint  unsigned int //类型定义,定义uint类型
uint Tcount,ADadv;//定义定时器溢出次数、数据平均值
uint ADnum[10];  //定义数据存储的数组
uint jishu;            //定义光照阈值基数符号
int q=0;                //存储数组的数量符号
int m=0;        //定义按键标志符号
sbit adcs=P2^7;//定义单片机P2.7管脚符号adcs
sbit adrd=P2^6;//定义单片机P2.6管脚符号adrd
sbit adwr=P2^5;//定义单片机P2.5管脚符号adwr
sbit led1=P2^0;//定义单片机P2.0管脚符号
sbit dula=P2^4; //定义单片机P2.4管脚、P2.3管脚符号为
sbit wela=P2^3; //dula、wela
sbit s1=P2^2;        //定义单片机P2.2管脚符号按键s1
sbit s2=P2^1;   //定义单片机P2.1管脚符号按键S2
void delayms(uint xms);
void key();
void ad_ini();
void display(uint,uint,uint,uint,uint);
uchar code table[]={       //共阴极段码
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,                                       
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};

void main()               
{   uint A1,A2,A3,L1,L2;
        uint i,j;
        jishu=60;  //设置比较阈值的基数为60LX
        Tcount=0;                     
        TMOD=0x01; //设置定时器/计数器工作方式1
        TH0=(65536-50000)/256; //设置定时器/计数器的初值
        TL0=(65536-50000)%256;           
        EA=1;      //开全局中断允许
        ET0=1;     //开定时器/计数器T0中断允许
        EX0=1;     //开外部中断0中断允许
        TR0=1;     //启动定时器/计数器T0
        IT0=1;     //外部中断0下降沿触发
        ad_ini(); //AD初始化
        led1=1;
        while(1)                        
        {
                if(q>=10)                     
                        {
                                for(q=0;q<=9;q++)               
                                {ADadv=ADnum[q]+ADadv;}      
                       
                                ADadv=ADadv/10;//AD采集数据满10个,取平均
                       }
                                         
                A1=ADadv/100; //计算数据的百位、十位、个位数字
            A2=ADadv%100/10;
            A3=ADadv%10;
               L1=jishu/10; //计算阈值十位、个位数字
            L2=jishu%10;
                if(m==0)                       
                {        key();                      //键盘扫描
                 display(A1,A2,A3,L1,L2);     //显示     
                }
            else                           
            for(i=500;i>0;i--)                  
                {         for(j=110;j>0;j--)
                        m=0;
                }
            if(jishu<ADadv) //光强值与阈值的比较
                {led1=1;}               
        else
        led1=0;  
        }
                               
}
void ad_ini() //AD命令管脚先置1 ,为启动做准备
{
        adcs=1;
        adrd=1;
        adwr=1;
}

void ad_start()         //AD转换启动程序
{       
        adcs=0;    //AD的片选信号cs
        adwr=0; //AD的写信号
        _nop_(); //等待一个机器周期
        _nop_();
        adwr=1;
        adcs=1;
}
void ad_int() interrupt 0        //转化结束后,INTO自动为0  ,进入该中断程序
{
        EX0=0;        //进入中断后关闭中断使能,防止中断再次进入
        P0=0xff; //读取单片机P0端口数据前先给P0端口写1操作
        adcs=0;   //AD片选信号为0
        adrd=0;   //AD读信号为0
        _nop_();  //等待一个机器周期
        _nop_();
        ADadv=P0;  //将AD转换完成的数字通过P0口读取
        adrd=1;          //为下一次AD启动做准备
        adcs=1;
        q=q+1;           
        EX0=1;              //开外部中断0使能
}
void T0_int()  interrupt 1         //定时中断        50ms产生个中断,使Tcount加1
{
        TH0=(65536-50000)/256;  //定时器赋初值TH0、TL0
        TL0=(65536-50000)%256;
        Tcount++;            //进入该中断的次数
        if(Tcount>=10)
                {
                        ad_start(); //中断次数增加到10时,启动一次AD
                        Tcount=0;   //重新计数中断次数
                }
}
void delayms(uint xms)         //定义延迟程序 定时时间单位是ms,定时数值
{        uint i,j;             //        由xms值大小决定。
        for(i=xms;i>0;i--)                                                                       
        for(j=110;j>0;j--);
}

void key()
{  if(s1==0)       //判断按键是否按下
   delayms(5);     //延迟5ms
   if(s1==0);     //再次判断按键是否按下
   {jishu=jishu+1; m=1;}  //基数上加1,m为按键标志
   if(s2==0)         //判断按键是否按下
   delayms(5);     //延迟5ms
   if(s2==0)       //再次判断按键是否按下
   { jishu=jishu-1;m=1;}   //基数上减1操作
}

void display(uint bai,uint shi,uint ge,uint L1,uint L2)
{
        P1=0x00;       //消影
        dula=1;        //选择段选锁存器
        P1=table[bai];  //把数据的百位(断码)送入锁存器输入端口
        dula=0;         //把段选锁存器输出端口数据锁存
        P1=0xff;       //消影
        wela=1;        //选择位选锁存器
        P1=0xfe;       //把位选数据送到位选锁存器输入端口
        wela=0;       //把位选锁存器输出端口锁存
        delayms(500);     //延迟5ms

        P1=0x00;       //消影
        dula=1;          //选择段选锁存器
        P1=table[shi];      //把数据的十位(断码)送入锁存器输入端口
        dula=0;           //把段选锁存器输出端口数据锁存
        P1=0xff;           //消影
        wela=1;          //选择位选锁存器
        P1=0xfd;           //把位选数据送到位选锁存器输入端口
        wela=0;           //把位选锁存器输出端口锁存
        delayms(500);         //延迟5ms

        P1=0x00;       //消影
        dula=1;          //选择段选锁存器
        P1=table[ge];       //把数据的个位(断码)送入锁存器输入端口
        dula=0;           //把段选锁存器输出端口数据锁存
        P1=0xff;           //消影
        wela=1;          //选择位选锁存器
        P1=0xfb;           //把位选数据送到位选锁存器输入端口
        wela=0;           //把位选锁存器输出端口锁存
        delayms(500);         //延迟5ms

        P1=0x00;       //消影
        dula=1;          //选择段选锁存器
        P1=table[L1];     //把数据的阈值十位送入锁存器输入端口
        dula=0;           //把段选锁存器输出端口数据锁存
        P1=0xff;           //消影
        wela=1;          //选择位选锁存器
        P1=0xf7;           //把位选数据送到位选锁存器输入端口
        wela=0;           //把位选锁存器输出端口锁存
        delayms(500);         //延迟5ms

        P1=0x00;       //消影
        dula=1;          //选择段选锁存器
        P1=table[L2];       //把数据的阈值个位送入锁存器输入端口
        dula=0;           //把段选锁存器输出端口数据锁存
        P1=0xff;           //消影
        wela=1;          //选择位选锁存器
        P1=0xef;           //把位选数据送到位选锁存器输入端口
        wela=0;           //把位选锁存器输出端口锁存
        delayms(500);         //延迟5ms
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
武力戡乱
1楼-- · 2019-07-18 12:15
 精彩回答 2  元偷偷看……
电子工程师2014
2楼-- · 2019-07-18 13:48
发工程上了,这样好累
明心ZZ见性
3楼-- · 2019-07-18 18:27
电子工程师2014 发表于 2016-5-9 10:20
发工程上了,这样好累

什么意思,,,,,,,,,,,,,,,,
明心ZZ见性
4楼-- · 2019-07-18 20:34
武力戡乱 发表于 2016-5-7 17:34
总体循环时间太长了。程序设计不好。

好的,我改改,,,,,,,,,,,,
武力戡乱
5楼-- · 2019-07-19 00:46
明心ZZ见性 发表于 2016-5-21 15:21
好的,我改改,,,,,,,,,,,,

一周热门 更多>