单片机学习笔记————51单片机实现两片联级74HC595驱动16个LED灯(把74HC595驱动程序翻译成类似单片机IO口直接驱动的方式)

一、使用proteus绘制简单的电路图,用于后续仿真

 

二、编写程序

/********************************************************************************************************************
----	@Project:	LED-74HC595
----	@File:	main.c
----	@Edit:	ZHQ
----	@Version:	V1.0
----	@CreationTime:	20200524
----	@ModifiedTime:	20200524
----	@Description:	两片联级的74HC595驱动的16个LED灯交叉闪烁。比如,先是第1,3,5,7,9,11,13,15八个灯亮,其它的灯都灭。然后再反过来,原来亮的就灭,原来灭的就亮。交替闪烁。
----	单片机:AT89C52
********************************************************************************************************************/
#include "reg52.h"
/*——————宏定义——————*/
#define FOSC 11059200L
#define T1MS (65536-FOSC/12/1000)   /*1ms timer calculation method in 12Tmode*/

#define const_time_level  400   


/*——————变量函数定义及声明——————*/
/*定义74HC595*/
sbit Hc595_Sh = P2^3;
sbit Hc595_St = P2^4;
sbit Hc595_Ds = P2^5;

unsigned char ucLED1 = 0;   /*代表16个灯的亮灭状态,0代表灭,1代表亮*/
unsigned char ucLED2 = 0;
unsigned char ucLED3 = 0;
unsigned char ucLED4 = 0;
unsigned char ucLED5 = 0;
unsigned char ucLED6 = 0;
unsigned char ucLED7 = 0;
unsigned char ucLED8 = 0;
unsigned char ucLED9 = 0;
unsigned char ucLED10 = 0;
unsigned char ucLED11 = 0;
unsigned char ucLED12 = 0;
unsigned char ucLED13 = 0;
unsigned char ucLED14 = 0;
unsigned char ucLED15 = 0;
unsigned char ucLED16 = 0;


unsigned char ucLed_update = 0;  /*刷新变量。每次更改LED灯的状态都要更新一次。*/

unsigned char ucLedStep = 0; /*步骤变量*/
unsigned int
  • 1
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是基于STM32单片机74HC595驱动8个LED的代码: ```c #include "stm32f10x.h" #define HC595_PORT GPIOA #define HC595_DS_PIN GPIO_Pin_0 #define HC595_SHCP_PIN GPIO_Pin_1 #define HC595_STCP_PIN GPIO_Pin_2 void HC595_Init(void); void HC595_Write(uint8_t dat); int main(void) { HC595_Init(); uint8_t led_data = 0x01; while (1) { HC595_Write(led_data); led_data = (led_data << 1) | (led_data >> 7); //循环移位 for (uint16_t i = 0; i < 10000; i++); //延时 } } void HC595_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = HC595_DS_PIN | HC595_SHCP_PIN | HC595_STCP_PIN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(HC595_PORT, &GPIO_InitStructure); GPIO_ResetBits(HC595_PORT, HC595_DS_PIN | HC595_SHCP_PIN | HC595_STCP_PIN); } void HC595_Write(uint8_t dat) { for (uint8_t i = 0; i < 8; i++) { if (dat & 0x80) GPIO_SetBits(HC595_PORT, HC595_DS_PIN); else GPIO_ResetBits(HC595_PORT, HC595_DS_PIN); GPIO_SetBits(HC595_PORT, HC595_SHCP_PIN); GPIO_ResetBits(HC595_PORT, HC595_SHCP_PIN); dat <<= 1; } GPIO_SetBits(HC595_PORT, HC595_STCP_PIN); GPIO_ResetBits(HC595_PORT, HC595_STCP_PIN); } ``` 在此代码中,我们使用了STM32的GPIO模块控制74HC595芯片,来实现控制8个LED的功能。具体实现方式为,通过循环移位来得到要显示的数据,并将数据写入到74HC595芯片中,然后通过锁存时钟信号(STCP)将数据传给输出寄存器,最后通过移位时钟信号(SHCP)将输出寄存器中的数据传给移位寄存器,然后通过数据信号(DS)将数据传入到移位寄存器中,完成LED的控制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值