今天在QQ群上一个初学单片机的人提了一个关于数码管的问题,主要是程序的问题,由于对基础知识掌握不够,花了比较长的时间才解决,现总结一下其中的细节。
电路中8位数码管是由两个74HC573锁存器分别控制位选和段选的。
原程序大致如下(省去了include和sbit定义),目的是要实现第一个数码管显示“1",但是后面有几个数码管也有显示:
程序1
void main()
{
WELA=1;//1
P1=0xFE;//2
WELA=0;//3
DULA=1;//4
P1=0x06;//5
DULA=0;//6
}
我原本是想让他在程序结尾加一个while(1)空循环,结果加错了,成了这样:
程序2
void main()
{
while(1) {
WELA=1; //1
P1=0xFE; //2
WELA=0; //3
DULA=1; //4
P1=0x06; //5
DULA=0; //6
}
}
后来有人说中间加一个P1=0xFF,看上去好了一些,后面几个数码管不亮了,实际上第一个数码管显示不正常,还是没有完全解决问题:
程序3
void main()
{
DULA=1; //1
P1=0x06; //2
DULA=0; //3
P1=0xFF; //4
WELA=1; //5
P1=0xFE; //6
WELA=0; //7
}
如果按照我原先的理解,结尾处加一个while(1)空循环,最后是可以正常显示的:
程序4
void main()
{
WELA=1; //1
P1=0xFE; //2
WELA=0; //3
DULA=1; //4
P1=0x06; //5
DULA=0; //6
while(1); //7
}
为了使程序更加完善,以下写法更加可靠:
程序5
void main()
{
P1=0xFE; //1
WELA=1; //2
WELA=0; //3
P1=0x06; //4
DULA=1; //5
DULA=0; //6
while(1); //7
}