硬件采用2个锁存器分别控制使能脚与显示脚
有问题的代码如下:
#include <reg52.h>
#define UINT16 unsigned int
#define BYTE unsigned char
sbit weBit = P1^6;//数码管使能
sbit duBit = P1^7;//数码显示
sbit du0 = P0^0;
BYTE digitArr[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
BYTE weMask[] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
void Delayms(UINT16 time) //@11.0592MHz
{
BYTE i, j;
UINT16 k;
for (k=0;k<time;k++)
{
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
}
void main(void)
{
UINT16 i=0;
while(1)
{
for (i=0;i<8;i++)
{
P0=0;
duBit = 0;
weBit = 1;
P0 = weMask;//选中第i个数码管,共8个
weBit = 0;
P0=0;
duBit = 1;
P0=digitArr;//给这个数码管送数据
duBit = 0;//这行去掉显示就正常了
Delayms(2);
}
}
}
问题在于当打开下一个使能时,数据锁存器的数据仍会送出去,因此在下一个数码管会显示上一个数码管的数据,解决办法就是将for循环最后的duBit=0去掉,此时循环中会去清当前显示内容,即显示全灭,然后再显示一个数码管数据,这样就能保证上个数据不会带到下个数据中,导致微亮问题
文章评论(0条评论)
登录后参与讨论