基于STC12C5A60S2系列1T 8051单片机实现74HC595控制LED或数码管显示按键值的功能
STC12C5A60S2系列1T 8051单片机管脚图
# STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置
# STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍
74HC595介绍
74HC595管脚图
74HC595真值表
74HC595工作原理
74HC595控制八个LED灯电路连接
74HC595控制十六个LED灯电路连接
74HC595控制八个数码管电路连接
基于STC12C5A60S2系列1T 8051单片机实现74HC595控制LED或数码管显示按键值的功能编程
main.c
#include <stc12c5a60s2.h>
#include "Timer0.h"
#include "Key.h"
#include "Digitron.h"
#include "74HC595.h"
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint
void PortModeSet()//端口模式设置函数
{
P0M1 = 0x00;
P0M0 = 0x00;
P1M1 = 0x00;
P1M0 = 0x00;
P2M1 = 0x00;
P2M0 = 0x00;
P3M1 = 0x00;
P3M0 = 0x00;
P4M1 = 0x00;
P4M0 = 0x00;
}
void main()//主函数
{
PortModeSet();//端口模式设置函数
// Uart1Init();//串行口1工作模式1的8位串行口波特率可变初始化函数 波特率为9600bps 晶振为12MHz
Timer0Init();//定时器0的16位定时模式1用12分频定时2ms初始化函数 晶振为12MHz
DigitronBootDisplay();//数码管开机显示函数
SN74HC595Init();//SN74HC595初始化函数
while(1)//主循环
{
KeyScanResult();//按键扫描结果函数
// SN74HC595SendData8Bit(0xfe);//SN74HC595发送数据给8个LED灯函数 点亮8个LED灯当中第一个LED灯
// SN74HC595SendData16Bit(0xfe,0xff);//SN74HC595发送数据给16个LED灯函数 点亮16个LED灯当中第一个LED灯
}
}
74HC595.c
#include "74HC595.h"
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint
void SN74HC595Init()//SN74HC595初始化函数
{
SN74HC595OE = 1;//输出使能引脚 关闭使能
SN74HC595DS = 0;//串行数据输入引脚置低电平
SN74HC595SHCP = 0;//移位寄存器时钟输入引脚置低电平
SN74HC595STCP = 0;//存储寄存器时钟输入引脚置低电平
SN74HC595OE = 0;//输出使能引脚置低电平 开始使能
}
// void SN74HC595SendData8Bit(uint Data)//SN74HC595发送数据给8个LED灯的函数
//{
// uchar i;//声明循环变量
// SN74HC595SHCP = 0;//移位寄存器时钟输入引脚置低电平
// SN74HC595STCP = 0;//存储寄存器时钟输入引脚置低电平
// for(i = 0; i < 8;i++)//循环取出数据变量的八位二进制数
// {
// if(Data >= 0x80)//如果数据变量大于等于0x80 则某数据变量的八位二进制数最高位为1
// {
// SN74HC595DS = 1;//串行数据输入引脚取数据变量的八位二进制数中的1
// }
// else//否则
// {
// SN74HC595DS = 0;//串行数据输入引脚取数据变量的八位二进制数中的0
// }
// SN74HC595SHCP = 0;//移位寄存器时钟输入引脚置低电平
// SN74HC595SHCP = 1;//移位寄存器时钟输入引脚高电平
// Data <<= 1;//数据变量的八位二进制数每次左移一位
// }
// SN74HC595STCP = 0;//存储寄存器时钟输入引脚置低电平
// SN74HC595STCP = 1;//存储寄存器时钟输入引脚高电平
// SN74HC595DS = 0;//串行数据输入引脚置低电平
// SN74HC595SHCP = 0;//移位寄存器时钟输入引脚置低电平
// SN74HC595STCP = 0;//存储寄存器时钟输入引脚置低电平
// }
void SN74HC595SendData16Bit(uchar Data1,uchar Data2)//SN74HC595发送数据给16个LED灯或8个数码管的段和位或4个数码管的段和位函数
{
uchar i;//声明循环变量
uchar Temp;//声明临时变量
Temp = Data1;//数据变量1赋给临时数据变量
for(i = 0; i < 8;i++)//循环取出临时数据变量的八位二进制数
{
if(Temp >= 0x80)//如果临时数据变量大于等于0x80 则临时数据变量的八位二进制数最高位为1
{
SN74HC595DS = 1;//串行数据输入引脚取临时数据变量的八位二进制数中的1
}
else//否则
{
SN74HC595DS = 0;//串行数据输入引脚取临时数据变量的八位二进制数中的0
}
SN74HC595SHCP = 0;//移位寄存器时钟输入引脚置低电平
SN74HC595SHCP = 1;//移位寄存器时钟输入引脚高电平
Temp <<= 1;//临时数据变量的八位二进制数每次左移一位
}
Temp = Data2;//数据变量2赋给临时数据变量
for(i = 0; i < 8;i++)//循环取出临时数据变量的八位二进制数
{
if(Temp >= 0x80)//如果临时数据变量大于等于0x80 则临时数据变量的八位二进制数最高位为1
{
SN74HC595DS = 1;//串行数据输入引脚取临时数据变量的八位二进制数中的1
}
else//否则
{
SN74HC595DS = 0;//串行数据输入引脚取临时数据变量的八位二进制数中的0
}
SN74HC595SHCP = 0;//移位寄存器时钟输入引脚置低电平
SN74HC595SHCP = 1;//移位寄存器时钟输入引脚高电平
Temp <<= 1;//临时数据变量的八位二进制数每次左移一位
}
SN74HC595STCP = 0;//存储寄存器时钟输入引脚置低电平
SN74HC595STCP = 1;//存储寄存器时钟输入引脚高电平
SN74HC595DS = 0;//串行数据输入引脚置低电平
SN74HC595SHCP = 0;//移位寄存器时钟输入引脚置低电平
SN74HC595STCP = 0;//存储寄存器时钟输入引脚置低电平
}
74HC595.h
#ifndef _74HC595_H
#define _74HC595_H
#include "STC12C5A60S2.h"
#define uchar unsigned char//自定义无符号字符型为uchar