想必大家都看過站長推薦的能配合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;
歡迎光臨 (http://m.zg4o1577.cn/bbs/) | Powered by Discuz! X3.1 |