如下圖:網上下載的一個數碼管計數器,原程序及其仿真是共陽極數碼管,因我手上只有共陰極的數碼管,所以我就將原程序里共陽極編碼表換成了共陰極編碼表。問題來了,計數器加減復位功能都正常,也能顯示數字,但單位位數的顯示位置發生了移動——共陰極顯示的個位變到了共陽極的十位處;共陰極顯示的十位變到了共陽極顯示的百位處;共陰極顯示的百位變到了共陽極顯示的千位處;共陰極顯示的千位變到了共陽極顯示的個位處。糊涂了,單位位置怎嘛會變呢?(試過了,與另一個數碼管有無無關)
請明白的壇友指點一二。謝謝
捕獲0.JPG (117.65 KB, 下載次數: 45)
下載附件
2022-4-5 06:38 上傳
捕獲1.JPG (191.65 KB, 下載次數: 47)
下載附件
2022-4-5 06:47 上傳
單片機代碼如下:
/**********
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();
}
}
|