单片机教程网

电脑版
提示:原网页已由神马搜索转码, 内容由www.51hei.com提供.
查看:1100|回复:7
打印上一主题下一主题

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

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



单片机代码如下:
/**********
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; //显示百 ...

多谢多谢......明白了,改好了。
5#
ID:149451发表于 2022-4-5 11:25|只看该作者
兴安xa 发表于 2022-4-5 10:51
P2口位显也得改啊。
//***********************************************
//显示程序

多谢多谢......菜鸟基础不够,现在明白了,改好了。
6#
ID:332444发表于 2022-4-5 12:27|只看该作者
代码不需要修改换取反即可。
7#
ID:121859发表于 2022-4-5 15:50|只看该作者
段码修改后,位码也需要同时修改,其实不用那么麻烦,控制程序中,将段码和位码送IO扣前取反就可以了。
8#
ID:979299发表于 2022-4-5 17:37|只看该作者
  1. 代码不需要修改换取反即可。
复制代码

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

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

Powered by 单片机教程网