注:此单片机型号为 STC15F2K60S2.
原理
如图,发光二极管L1—L8 共阳接法,VCC为电源正极,高电平。
已知发光二极管正向导通反向截至,要使得二极管发光,就要让Q1—Q8为低电平。可控管脚为P00—P07,所以要输入P00—P07为低电平。为了让P0能够影响到Q1—Q8,就要使得锁存器 M74HC573M1R 导通,即要让管脚LE为高电平。又管脚LE与Y4C连接,所以Y4C也为高电平。
又Y4C连接了一个或非门,或非门的输入端为Y4和WR。因为WR已用跳线帽与GND连接在了一起,GND为接地,所以WR为0(低电平)。
根据或非门逻辑表格:
Y4 WR Y4C
0 0 1
0 1 0
1 0 0
1 1 0
所以,当Y4C为0时,Y4为1;当Y4C为1时,Y4为0.
所以,要使得Y4C为高电平,Y4就要为低电平,即Y4为0.
又Y4是由 74HC138 位译码器的输入端A、B、C来控制,以 C、B、A 为逻辑顺序,CBA组成二进制数,来选中Y0—Y7,被选中者即为低电平。
所以,要使得 Y4 为低电平,CBA 要为 100.
另外,由于 P0 口是复用的,意味着也要控制别的器件,所以如果一直让 LE 为高,那么就在控制别的器件的时候就会影响到 LED,所以在锁存器导通后,应该截止保存住它的状态。
整理逻辑:
点亮LED:
Q1—Q8为低电平 —> P00-P07为低电平 -> 导通锁存器,LE为高电平 ->
Y4C为高电平 -> 或非门,Y4为低电平 -> 译码器,CBA组合为100 ->
锁存状态,断开锁存器,LE为低电平,Y4C为低电平 ->
或非门,Y4为高电平 -> 译码器,CBA组合为000.(不为100即可)
同理,熄灭LED:
Q1—Q8为高电平 —> P00-P07为高电平 -> 导通锁存器,LE为高电平 ->
Y4C为高电平 -> 或非门,Y4为低电平 -> 译码器,CBA组合为100 ->
锁存状态,断开锁存器,LE为低电平,Y4C为低电平 ->
或非门,Y4为高电平 -> 译码器,CBA组合为000.(不为100即可)
代码
官方代码
来源:蓝桥杯官方资料。
#include "reg52.h"
// #include "absacc.h"
// 关闭外设
void Cls_Peripheral(void)
{
// IO模式(J13-2和J13-3相连)
P0 = 0xFF;
P2 = P2 & 0x1F | 0x80; // P27~P25清零,再定位Y4C
P2 &= 0x1F; // P27~P25清零
P0 = 0;
P2 = P2 & 0x1F | 0xA0; // P27~P25清零,再定位Y5C
P2 &= 0x1F; // P27~P25清零
//XBYTE[0x8000] = 0xFF; // MM模式(J13-2和J13-1相连)
//XBYTE[0xA000] = 0;
}
// LED显示
void Led_Disp(unsigned char ucLed)
{
// IO模式(J13-2和J13-3相连)
P0 = ~ucLed; //unsigned char
P2 = P2 & 0x1F | 0x80; // P27~P25清零,再定位Y4C
P2 &= 0x1F; // P27~P25清零
//XBYTE[0x8000] = ~ucLed; // MM模式(J13-2和J13-1相连)
}
// 延时函数(最小约1ms@12MHz)
void Delay(unsigned int num)
{
unsigned int i;
while(num--)
for(i=0; i<628; i++);
}
// 主函数
void main(void)
{
unsigned c