想必大家都看過站長推薦的能配合51hei-5開發板電路的那個視頻教程吧。我后來發現了視頻里有一個小小的失誤在消隱方面,如果完全按照視頻教程里的來就會出現數碼管暗亮影響美觀,于是我在找到原因之后做了一些修改,代碼在下面。
下面是本站板子數碼管部分的電路圖,
//*===============================
//接線要求:P0口分時復用輸出,P2.6,P2.7做74ls573片選
//入口參數:0000--9999范圍內的二進制或十進制數
//出口參數:無
//函數功能:數碼管實現小于9999數的十進制顯
//by Oliver 21/03,21:59
//==================================
#include <AT89X52.H>
#define uchar unsigned char
sbit WEI=P2^7;
sbit DUAN=P2^6;
sbit LED=P1^4;
uchar wei[]={0xfe,0xfd,0xfb,0xf7};
uchar duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void delay(void) //誤差 0us
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=222;b>0;b--)
for(a=12;a>0;a--);
}
//--------------6ms延時
void undo(void)
{
WEI=1;
P0=0xff;
WEI=0;
}//使位選失效
void wei_cs(uchar a)
{
P0=wei[a];//=====關鍵之處---------------------------------------------------消隱------
WEI=1;
WEI=0;
}
//-------------------位選---------
void duan_cs(uchar a)
{
P0=duan[a];
DUAN=1;
DUAN=0;
}
//-------------------段選---------
void show(int DATA)
{
uchar qian,bai,shi,ge;
uchar duan_flag=0;
if(DATA>9999)
{
LED=0;
P0=0xfe;
}//判斷是否超出顯示范圍
else
{
qian=DATA/1000;
bai=DATA%1000/100;
shi=DATA%100/10;
ge=DATA%10;
//-------------各位分離
if(qian!=0)
{
duan_cs(qian);
wei_cs(duan_flag++);
}
delay();
if((bai|qian)!=0)
{
duan_cs(bai);
wei_cs(duan_flag++);
}
delay();
if((shi|bai|qian)!=0)
{
duan_cs(shi);
wei_cs(duan_flag++);
}
delay();
if(1)
{
duan_cs(ge);
wei_cs(duan_flag);
}
}
}
void main(void)
{
while(1)
show(1545);
} 消隱的研究:隱紅的出現:1 ,段碼改變時,位碼未變,在位碼變化之前,會在前一個位碼處產生殘影; 2 ,位碼改變時,如先使P2^7有效,則段碼在位碼寫入之前會在新的位碼處產生殘影。 消除方法:1, 段碼改變之前將位碼全部置成無效,此時間間隔仍能滿足視覺暫留的要求; 2, 位碼改變時,先將下一個位碼寫入P0口,再使P2^7有效,則可消除此種殘 影。 另外,如P0口時序要求更為嚴格,為保證數據安全性,可將連接圖中的OC端統一接一控制引腳,使兩片573同時輸出使能,即可更好消除殘影。 視頻教程中的代碼是:
WEI=1; //開通 P0=wei[a]; WEI=0; //鎖存 我修改為下面的代碼后,殘影消失,感覺非常完美呵呵. P0=wei[a]; WEI=1; WEI=0;
[此貼子已經被作者于2011-3-17 0:21:47編輯過]
|