如下图:网上下载的一个数码管计数器,原程序及其仿真是共阳极数码管,因我手上只有共阴极的数码管,所以我就将原程序里共阳极编码表换成了共阴极编码表。问题来了,计数器加减复位功能都正常,也能显示数字,但单位位数的显示位置发生了移动——共阴极显示的个位变到了共阳极的十位处;共阴极显示的十位变到了共阳极显示的百位处;共阴极显示的百位变到了共阳极显示的千位处;共阴极显示的千位变到了共阳极显示的个位处。糊涂了,单位位置怎嘛会变呢?(试过了,与另一个数码管有无无关)
请明白的坛友指点一二。谢谢
单片机代码如下:
/**********
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();
}
}
|