基于STC12C5A60S2系列1T 8051单片机实现74HC595控制LED或数码管显示按键值的功能

该博客详细介绍了如何利用STC12C5A60S2系列1T 8051单片机配合74HC595芯片来控制LED灯和数码管显示按键值。内容包括74HC595的工作原理、管脚图、真值表,以及不同电路连接方式。通过示例代码展示了如何编程实现这一功能,并给出了实验现象。
摘要由CSDN通过智能技术生成

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
#define uint unsigned int//自定义无符号整数型为uint 
sbit <
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值