LED电路图
74HC573锁存器
由LED电路图可以看出,LED并不是直接连接在单片机的IO口进行控制,而是通过74HC573锁存器间接控制。
锁存器左端输入端 D1~D7连单片机的P00-P07口,右端输出端Q1-Q2连八个共阳LED灯。
当锁存使能输入端(LE)输入高电平时,锁存器处于非锁存状态,即输入口Dx和输出口Qx电位一致;反之,锁存器处于锁存状态,Qx不受Dx控制。
74HC02或非门电路
由图可知,74HC02或非门电路控制Y4C,当输入端Y4和WR电平改变时,Y4C的电平随之改变。
- 真值表
74HC138译码器
三个输入端控制八个输出端
要使Y4输出低电平,则P25=0,P26=0,P27=1
程序设计:
使用前将J13调整为IO模式(2,3)脚短接
- 关闭外设
(有时一开机,单片机可能出现灯亮或者蜂鸣器响的情况,所以要关闭外设。)
// 关闭外设
void Cls_Peripheral(void)
{
P0 = 0xff; //关闭LED
P2 = P2 & 0x1f | 0x80; //P2高三位P27~P25清零,之后再给其赋值100,LED锁存器
P2 &= 0x1f; //高三位清零,关闭LED锁存器,释放P0口
P0 = 0; //关闭蜂鸣器
P2 = P2 & 0x1f | 0xA0; //P2高三位清零,然后再赋值101,蜂鸣器锁存器(Y5)
P2 &= 0x1f; //关闭蜂鸣器锁存器
}
- LED显示
//LED显示
void Led_Disp(unsigned char ucLed)
{
P0 = ~ucLed;
P2 = P2 & 0x1F | 0x80; // P27~P25清零,然后给其赋值,打开LED锁存器
P2 &= 0x1F; // P27~P25清零
}
- 延时函数
// 延时函数(最小约1ms@12Mhz)
void Delay(unsigned int num)
{
unsigned int i;
while(num--)
for(i=0; i<628; i++);
}
- 主函数
void main(void)
{
unsigned char i, j;
Cls_Peripheral(); //调用函数,关闭外设,LED灯灭,蜂鸣器不响。
while(1)
{ // 4个亮度等级
for(i=0; i<4; i++)
for(j=0; j<100; j++)
{
Led_Disp(0xff); //调用函数->形参ucled=0xff->现象:LED全亮
Delay(i+1); //延时i+1,期间ucled值不变,led状态不变。
Led_Disp(0); //调用函数->形参ucled=0x00->现象:LED全灭
Delay(4-i); //延时4-i,期间ucled值不变,led状态不变。
}
}
}
- 整体函数
// 使用程序前,将J13调整为IO模式(2,3脚短接)
#include "reg52.h"
// #include "absacc.h"
// 关闭外设
void Cls_Peripheral(void)
{ // IO模式(J13-2和J13-3相连)
P0 = 0xFF;
P2 = P2 & 0x1F | 0x80;
P2 &= 0x1F;
P0 = 0;
P2 = P2 & 0x1F | 0xA0;
P2 &= 0x1F;
//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;
P2 = P2 & 0x1F | 0x80;
P2 &= 0x1F;
//XBYTE[0x8000] = ~ucLed; // MM模式(J13-2和J13-1相连)
}
//延时函数
void Delay(unsigned int num)
{
unsigned int i;
while(num--)
for(i=0; i<628; i++);
}
//主函数
void main(void)
{
unsigned char i, j;
Cls_Peripheral();
while(1)
{ // 4个亮度等级
for(i=0; i<4; i++)
for(j=0; j<100; j++)
{
Led_Disp(0xff);
Delay(i+1);
Led_Disp(0);
Delay(4-i);
}
}
}