找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 967|回复: 7
收起左侧

单片机数码管仿真中遇到的数码管显示乱码问题

[复制链接]
ID:149451 发表于 2022-4-5 06:52 | 显示全部楼层 |阅读模式
如下图:网上下载的一个数码管计数器,原程序及其仿真是共阳极数码管,因我手上只有共阴极的数码管,所以我就将原程序里共阳极编码表换成了共阴极编码表。问题来了,计数器加减复位功能都正常,也能显示数字,但单位位数的显示位置发生了移动——共阴极显示的个位变到了共阳极的十位处;共阴极显示的十位变到了共阳极显示的百位处;共阴极显示的百位变到了共阳极显示的千位处;共阴极显示的千位变到了共阳极显示的个位处。糊涂了,单位位置怎嘛会变呢?(试过了,与另一个数码管有无无关)
    请明白的坛友指点一二。谢谢
捕获0.JPG 捕获1.JPG


单片机代码如下:
/**********
20220318 摘自网上 若仅修改所用数码管,将共阳极换成共阴极,显示的位置将变化,这是为什么?
************/
//----------------------------------------------------------------------
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int

sbit k1 = P3^4;                   //加
sbit k2 = P3^3;                   //减
sbit k3 = P3^2;                   //复位
void key(void);
void display(void);

/**********************************/
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,
                    0x92,0x82,0xf8,0x80,0x90};           //共阳极数组
/***************
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,
                    0x6d,0x7d,0x07,0x7f,0x6f};           //共阴极数组
*******************/                        


char m=99,n=98;                                //显示初值,m,n的值决定开机显示数值
//****************************************
//延时程序
//****************************************
void delayms(uint xms)
{
   uint i,j;
   for(i=xms;i>0;i--)
   for(j=110;j>0;j--);
}
//***********************************************
//显示程序
//***********************************************
void display(void)
{
        P2=0X08;
                P1=table[m%10];   //显示个位
                delayms(5);  
                P2=0X04;
            P1=table[m/10];          //显示十位
                delayms(5);                                                              
            P2=0X02;
                P1=table[n%10];          //显示百位
                delayms(5);
                P2=0X01;
                P1=table[n/10];          //显示千位
                delayms(5);
}

//***************************************************
//按键处理
//***************************************************
void key()
{
  if(k1==0)                                         //检测按键是否被按下
   {                                                 //延时消抖
           delayms(10);                        
        if(k1==0)                                 //再次检测是否真正按下按键
        {
          m++;                                         //m自加一
          if(m>=100)                         //如果m加到100则n加一 (限制m的取值范围) 个位、十位最大显示99
          {
                  n++;                                 //n自加一
                m=0;                                 //使m又从0开始计数
                if(n>=100)                         //如果n加到100则m=n=99 (限制n的取值范围) 百位、千位最大显示99
                {
                  m=99;                                 //最大显示9999
                  n=99;
                }
          }
        }
        while(!k1);                                 //按键松开
   }

  if(k2==0)                                         //检测按键是否被按下
   {                                                 //延时消抖
           delayms(10);                         //再次检测是否真正按下按键
        if(k2==0)
        {                                                 //m自减一
          m--;
          if(m<=0)                                 //如果m减到0则n减一 (限制n的取值范围) 个位、十位最小显示00
          {                                                
            m=99;                                 //重新给m装初值
                  n--;                                 //n自减一
                if(n==-1)                         //如果n减到-1,则m=n=0 (限制n的取值范围) 百位、千位最小显示00
                {
                 n=0;                                 //最小显示0000
                 m=0;
                }
          }
        }
        while(!k2);                                 //按键松开
   }

if(k3==0)                                         //检测按键是否被按下
{
   delayms(10);                                 //延时消抖
   if(k3==0)                                 //再次检测是否真正按下按键
   {
            m=0;                                         //复位,显示0000
         n=0;
   }
   while(!k3);                                 //按键松开
}
}

void main()
{
  while(1)
  {                                                         //调用按键检测
   key();                                         //数码管显示
   display();
  }

}        



回复

使用道具 举报

ID:195446 发表于 2022-4-5 10:39 | 显示全部楼层
改共阴数码管后段码要变,位码也要变啊。P2=0X0E; //显示个位,P2=0X0D; //显示十位,,P2=0X0B; //显示百位,P2=0X07; //显示千位。
回复

使用道具 举报

ID:979299 发表于 2022-4-5 10:51 | 显示全部楼层
P2口位显也得改啊。
//***********************************************
//显示程序
//***********************************************
void display(void)
{
        P2=0X07;
        P1=table[m%10];   //显示个位
        delayms(5);  
        P2=0X0B;
        P1=table[m/10];   //显示十位
        delayms(5);                                                              
        P2=0X0D;
        P1=table[n%10];   //显示百位
        delayms(5);
        P2=0X0E;
        P1=table[n/10];   //显示千位
        delayms(5);
}
回复

使用道具 举报

ID:149451 发表于 2022-4-5 11:24 | 显示全部楼层
mffhxa 发表于 2022-4-5 10:39
改共阴数码管后段码要变,位码也要变啊。P2=0X0E; //显示个位,P2=0X0D; //显示十位,,P2=0X0B; //显示百 ...

多谢多谢......明白了,改好了。
回复

使用道具 举报

ID:149451 发表于 2022-4-5 11:25 | 显示全部楼层
兴安xa 发表于 2022-4-5 10:51
P2口位显也得改啊。
//***********************************************
//显示程序

多谢多谢......菜鸟基础不够,现在明白了,改好了。
回复

使用道具 举报

ID:332444 发表于 2022-4-5 12:27 | 显示全部楼层
代码不需要修改换取反即可。
回复

使用道具 举报

ID:121859 发表于 2022-4-5 15:50 | 显示全部楼层
段码修改后,位码也需要同时修改,其实不用那么麻烦,控制程序中,将段码和位码送IO扣前取反就可以了。
回复

使用道具 举报

ID:979299 发表于 2022-4-5 17:37 | 显示全部楼层
  1. 代码不需要修改换取反即可。
复制代码

就是,段码也不用换的,只需要把所有赋值段码和位码前写上~这个取反符号即可
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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