想必大家都看过站长推荐的能配合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://www.51hei.com/bbs/) | Powered by Discuz! X3.1 |