竞赛板上有四片74573锁存器,由138译码器进行输入控制,Y4C-Y7C分别连接LED,ULN2003,数码管位选控制器,段选控制器。
由138真值表可得译码器输入三位二进制数决定对应引脚的低电平,其余引脚为高电平,经或非门门0变为1,对应锁存器打开。
Y4 Y5 Y6 Y7导通时138输入为4,5,6,7,对应二进制为100,101,110,111
138译码器的控制位从高到低为CBA,连接到P2口高三位,锁存器控制代码如下:
void CTL138(u8 n) { P2 &= 0x1f; //关闭所有锁存器 P2 |= n<<5; //将n移到高三位,选通锁存器 P2 &= 0x1f; //关闭所有锁存器 }
锁存器选通前后均进行关闭操作是为了避免其他数据串入对应锁存器。
下面我们利用锁存器控制函数实现对一些外设的的控制
首先是ULN2003,这其实就是一个反向驱动器,顾名思义,输入与输出是反向的。
废话不多说,直接上代码
void ULN2003(u8 n) { switch(n) { case 0: P0&=~0x40;break;//关蜂鸣器 case 1: P0|=0x40;break; case 2: P0&=~0x10;break;//关继电器 case 3: P0|=0x10;break; } CTL138(5); }
此外,板子如果不关LED锁存器不赋初值的话,后面写程序led会乱闪,因此LED也需要上电初始化。
void closeLED() { P0=0xFF; CTL138(4); }
总结:
CD107D开发板上电必做的事:
1.关闭蜂鸣器
2.关闭继电器
3.关闭LED
ULN2003(0); //关蜂鸣器 ULN2003(2); //关继电器 closeLED(); //关LED