15.LED模块

15.LED模块

添加芯片包

打开STC-ISP,选择Keil仿真设置,选择单片机型号IAP15F2K61S2,按添加型号和头文件到Keil中,选择Keil的安装目录

发光二极管

右侧VCC供电,提供1(高电平),若要LED导通,则需要左侧提供0(低电平)

M74HC573M1R为锁存器

当使能(LE)为高时,将上面数据(D)更新给数码管上侧(Q),使能为低时,输出将锁存在已建立的数据电平上,即不更新

若使L1亮则P00=0,然后使能LE抬高,寻找Y4C

WR接地,则Y4=0时,Y4C=1

使用8421编码,C-4,B-2,A-1,CBA-001时选中Y1,CBA-011时选中Y3

使用P25,P26,P27控制Y0-Y7

路径

P27=1;P26=0;P25=0;——Y4=0——Y4C=1——使能LE抬高——P00=0——LI打开

建立模板

选择STC15F2K60S2

外设关闭

将所有二极管关闭

P0=0xff;

P2需要P27,P26,P25-100——Y4=0

P2&0x1f得到P27=0,P26=0.P25=0

(P2&0x1f)|0x80得到P27,P26,P25-100,打开寄存器

P2&=0x1f;关闭寄存器

关闭继电器,蜂鸣器

VCC为1,则N BUZZ为0才能导通

ULN2003驱动(其存在反向器),给ULN2003为1的时候N BUZZ为0

则给P0全为0时ULN2003为0,N BUZZ为1即关闭蜂鸣器

P0=0x00;//关闭蜂鸣器和继电器

(P2&0x1f)|0xa0打开Y5C(0xa0为1010 0000,CBA为101)

Init.c

#include <Init.h>

void System_Init()
{
	P0=0xff;//关闭LED
	P2=P2&0x1f|0x80;//打开寄存器Y4C
	P2&=0x1f;//关闭寄存器
	
	P0=0x00;//关闭蜂鸣器和继电器
	P2=P2&0x1f|0xa0;//打开Y5C
	P2&=0x1f;//关闭
}

Init.h

#include <STC15F2K60S2.H>

void System_Init();

Led

Led.c

#include <Led.h>

//addr-灯的地址 enable-使能标志位 0不使能 1使能
void Led_Disp(unsigned char addr,enable)
{
	//局部静态变量,不会重复刷新初值,只有第一次上电时为初值
	static unsigned char temp=0x00;
	static unsigned char temp_old=0xff;
	//不更改原本其他位的数据,只更改要变的灯的亮灭
	if(enable)
		temp |= 0x01 <<addr;
	else
		temp &= ~(0x01 <<addr);
	//不同的时候才开关寄存器
	if(temp !=temp_old)
	{
		//原本给0是亮,方便记忆则改为给1是亮
		P0 = ~temp;
		P2 = P2&0x1f|0x80;
		P2 &=0x1f;
		temp_old=temp;
	}
}

//点亮第二个灯
//Led_Disp(1,1);

Led.h

#include <STC15F2K60S2.H>

void Led_Disp(unsigned char addr,enable);

main.c

//头文件声明区
#include <Init.h>
#include <Led.h>

//main
void main()
{
	//关闭外设
	System_Init();
	while(1)
	{
		Led_Disp(0,1);
	}
}