找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3510|回复: 4
收起左侧

单片机数码管某些数字显示错误,求解

[复制链接]
ID:297685 发表于 2018-12-14 11:49 | 显示全部楼层 |阅读模式
数码管1,4,7显示乱码,暂停和启动不能实现。求大神解惑。问题程序段如下
/* if((ina==0)&&(dea==0))//暂停
              {
      delayms(1) ;
      if((ina==0)&&(dea==0)){   
    TR0=1;
    j=miao;      
    while(!ina);
    while(!dea);  
    }
    }*/



#include <reg52.h>
#define uchar unsigned char
sbit ina=P1^0; //a得分加一按钮
sbit inb=P1^2; //b得分加一按钮
sbit dea=P1^1; //a得分减一按钮
sbit deb=P1^3; //b得分减一按钮
sbit change=P1^4; //分数互换按钮
//sbit clean=P1^5; //分数清零按钮
//sbit xiuxi=P1^6; //暂停休息按钮
sbit fm=P1^6 ; //蜂鸣器控制口
sbit led=P1^7;        
sbit dt=P3^6;
//定义全局变量
uchar count1,count2,miao10,miao1,fen10,fen1,adui10;
uchar j,k,l;
uchar adui1,bdui10,bdui1,fen,adui,bdui,x,a,b;
uchar adui100,bdui100;
char miao;
  //char code table[]={~0xc0,~0xf9,~0xa4,~0xb0,~0x99,~0x92,~0x82,~0xf8,~0x80,~0x90,0x00}
char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //0-9
void delayms( uchar time) //延时子函数
{ uchar i,j;
for(i=time;i>0;i--)
for(j=100;j>0;j--) ;
}
void buzzer()
{ //蜂鸣器
  fm=(((ina==0)||(inb==0)||(dea==0)||(deb==0)||(change==0))?0:1);
}
////////////////////////////////////////////////
void displayadui100(adui100) //显示a得分数的百位
{
P2=0xfe ; //选中某一数码管(靠最左端一个)
dt=1;
P0=table[adui100] ; //送数据
dt=0;
delayms(5) ; //延时
}
void displayadui10(adui10) //显示a得分数的十位
{
P2=0xfd ; //选中某一数码管(靠最左端一个)
dt=1;
P0=table[adui10] ; //送数据
dt=0;
delayms(5) ; //延时
}
void displayadui1(adui1) //显示a得分数的个位
{
P2=0xfb ; //选中某一数码管(靠最左端一个)
dt=1;
P0=table[adui1] ; //送数据
dt=0;
delayms(5) ; //延时
}

void displayadui(uchar adui) // 显示a得分(数据处理)
{ adui100=adui/100;
  adui10=adui%100/10;
  adui1=adui%100%10;
displayadui100(adui100);
displayadui10(adui10);
displayadui1(adui1);
}
////////////////////////////////////////////////////////////////
void displaybdui100(bdui100) //显示B得分数的百位
{
P2=0xdf ; //选中某一数码管(靠最左端一个)
dt=1;
P0=table[bdui100] ; //送数据
dt=0;
delayms(5) ; //延时
}
void displaybdui10(bdui10) //显示B得分数的十位
{
P2=0xbf ; //选中某一数码管(靠最左端一个)
dt=1;
P0=table[bdui10] ; //送数据
dt=0;
delayms(5) ; //延时
}
void displaybdui1(bdui1) //显示B得分数的个位
{
P2=0x7f ; //选中某一数码管(靠最左端一个)
dt=1;
P0=table[bdui1] ; //送数据
dt=0;
delayms(5) ; //延时
}

void displaybdui(uchar bdui) // 显示B得分(数据处理)
{ bdui100=bdui/100;
  bdui10=bdui%100/10;
  bdui1=bdui%100%10;
displaybdui100(bdui100);
displaybdui10(bdui10);
displaybdui1(bdui1);
}
   ////////////////////////////////////
void displaymiao10(miao10) // 显示时间秒 的十位
{
P2=0xf7;
dt=1;
P0=table[miao10] ;
dt=0;
delayms(1) ;
}
void displaymiao1(miao1) // 显示时间秒的个位
{
P2=0xef ;
dt=1;
P0=table[miao1] ;
dt=0;
delayms(1) ;
}
void displaymiao(miao) //显示秒(数据处理)
{miao10=miao/10;
miao1=miao%10;
displaymiao10(miao10);
displaymiao1(miao1);
}
//////////////////////////////
void timer0() interrupt 1 //中断函数(定时器1工作于方式1)
{
TH0=(65536-50000)/256; //初值重装
TL0=(65536-50000)%256;
count1++; // 计数加一,实现时间的计算
if(count1==20) // 实现时间计时为一秒 (20个中断 为时间一秒)
{  count1=0; // count1重新开始,计时下一秒
    miao--; // 秒倒计时一
    if(miao==-1) // 当秒倒计时到0时,将秒赋值59,重新倒计时,同时分倒计一
      { miao=24;}
     if(miao==12 ) // 0为通
      { led=0;}
     if(miao!=12 ) //
      { led=1;}
       displaymiao(miao);} // 将时间秒更新显示
}
/*
uchar changgscan()
{
   if(change==0) //扫描换分按键
  {  delayms(1);     
   if(change==0) {
       jishu++;
     while(!change); }
    }
  return(jishu);
}
  */
uchar keyscan() //键盘扫描
{ uchar temp;
        if(change==0) //扫描换分按键
  {  delayms(1);     
   if(change==0)        
    {  
     temp=adui; //数据交换
     adui=bdui;
     bdui=temp;
     delayms(1);      
     while(!change); //待键开  
    }
  }

  ///////////////////  //////////////
  
    //if ((ina==0)&&(dea==0)){ TR0=1;j=miao;}//暂停
    if((ina==0)&&(dea==0))//暂停
              {
      delayms(1) ;
      if((ina==0)&&(dea==0)){   
    TR0=1;
    j=miao;      
    while(!ina);
    while(!dea);  
    }
    }
  //  if ((inb==0)&&(deb==0)){ TR0=0;miao=j;} //启动
     if((inb==0)&&(deb==0))//启动
              {
      delayms(1) ;
      if((inb==0)&&(deb==0)){   
    TR0=0;
    miao=j;      
    while(!inb);
    while(!deb);  
    }
    }
          if((ina==0)&&(dea==1)) //A加分按键按下
              {
      delayms(1) ;
      if((ina==0)&&(dea==1)){   
    adui++ ; //a分数+1      
    while(!ina);  
    }
    }
      if((ina==1)&&(dea==0)) //A-按键按下
               {
    delayms(1) ;
      if((ina==1)&&(dea==0)){
    adui-- ; //a分数-1      
    while(!dea);
    }
    }
     if((inb==0)&&(deb==1)) //B加分按键按下
               {
    delayms(1) ;
      if((inb==0)&&(deb==1)){     
    bdui++ ; //B分数加一  
    while(!inb);
    }
    }
        if((inb==1)&&(deb==0)) //B减分按键按下
               {
    delayms(1) ;
      if((inb==1)&&(deb==0)){
   
    bdui-- ; //B分数减一        
    while(!deb);
    }
    }
             return(adui);
    return(bdui);  }

void main() //主函数
{
TMOD=0x11; //设置定时器1,2工作于方式1
TH0=(65536-50000)/256; //设置初值
TL0=(65536-50000)%256;
fm=1; //起初关蜂鸣器
EA=1; //开总中断
ET0=1; // 允许定时器0中断
ET1=1; //允许定时器1中断
//TR1=0; //先不启定时器1
miao=24;
TR0=1; //开启定时器0,倒计时开始
P0=0xff ;
delayms(1) ;
while(1) //随时扫描按键并显示
{  buzzer();
   // changgscan();
   keyscan();
  displayadui(adui);
  displaybdui(bdui);
  displaymiao(miao);
}
}

回复

使用道具 举报

ID:396960 发表于 2018-12-14 13:21 | 显示全部楼层
把问题说出来,然后把代码一贴,这样问问题的方式不好,没几个人会帮你看代码的,所以怎么回答你。
你应该经过自己思考,把问题的范围定好,再问人,这样会好些。
回复

使用道具 举报

ID:277550 发表于 2018-12-14 13:35 | 显示全部楼层
楼主还是先处理一些问题吧,如

        return(adui);
        return(bdui);


一个函数,2个返回语句。
回复

使用道具 举报

ID:446291 发表于 2018-12-14 13:52 | 显示全部楼层
看一下是不是位选没有做好
回复

使用道具 举报

ID:446422 发表于 2018-12-14 17:00 来自手机 | 显示全部楼层
aaa0557li 发表于 2018-12-14 13:52
看一下是不是位选没有做好

应该是电路图对应的代码没写对
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表