74HC595点亮8个LED灯
一、原理介绍

595有两个寄存器,都是8位的,如下所示:

595是串入并出带有锁存功能移位寄存器,它的使用方法简单:
- - 在正常使用时 /SCLR接高电平,/G接低电平。
- - 从SER每输入一位数据,串行输入时钟SCK上升沿有效一次,直到八位数据输入完毕
- - 输出时钟上升沿有效一次,此时,输入的数据就被送到了输出端。
不同的595引脚名称会不一样,但是功能是一样的。大家看引脚序号即可。以下是595引脚图:

595具体使用的步骤:
第一步:目的:将要准备输入的位数据移入74HC595数据输入端上。(用到SER数据输入引脚)
方法:送位数据到595。
第二步:目的:将位数据逐位移入74HC595,即数据串入(用到SCK引脚,移位寄存器)
方法:SCK 产生一上升沿,将595上的数据移入74HC595中的移位寄存器中,从低到高
第三步:目的:并行输出数据。即数据并出(用到RCK引脚,锁存器)
方法:RCK 产生一上升沿,将由SER上已移入数据寄存器中的数据送入到输出锁存器。
二、proteus 仿真画图
由于手头上没有595的硬件,用proteus进行仿真。
接线:
单片机的P1.4接按键;
单片机的P1.5接 LED;(起初用来测试按键,可忽略)
单片机的P2.0接595的DS(即SER)
单片机的P2.1接595的SH_CP(即SCK)
单片机的P2.2接595的ST_CP(即RCK)
595的8个输出口,接8个LED灯的正极
功能:
按下按键,8个LED灯亮起;(长按、短按)
松开按键,8个LED灯熄灭;

三、单片机程序
1、定义io、标志位
sbit SER_595=P2^; // DS 串行数据输入端
sbit RCK_595=P2^; // ST_CP 数据:移位寄存器--To--存储寄存器 (上升沿)
sbit SCK_595=P2^; // SH_CP 数据移位:QA--QB--QC-- ... --QH (上升沿) sbit Button=P1^; //按键
sbit LED=P1^;
uchar Btn_State=; //按键状态标志
uchar Count_Put=0xFF; //取反标志
2、发送数据函数:
//发送数据
void HC595_Send_Data(uchar send_data)
{
uchar i;
for(i=;i<;i++)
{
if((send_data<<i)&0x80)//判断最高位是否是1
SER_595=; //是1,则使SER=1,
else SER_595=; //是0,则使SER=0 SCK_595=;//上升沿(移入数据)
_nop_();
_nop_();
SCK_595=;
}
}
函数功能解释:
(1)一次只能发送8位数据,循环8次以下工作:
- - 将这8位数据和先向左移 i 位,再和0x80做与运算,从而判断数据的第一位是0还是1,进而使SER=0或者1
- - 接着给SCK_595一个上升沿脉冲,微妙级,将最高位数据0或者1送入595的移位寄存器
(2)i从0开始,也就是从数据的最高位开始,假如数据为01101100,则0先被送至移位寄存器,接着是1,以此类推。

3、输出数据函数:
//输出数据
void HC595_Put_Data()
{
RCK_595=;
_nop_();
_nop_();
RCK_595=;
}
4、主函数:
void main()
{
LED=;//初始关闭
while(){ //按键控制8个LED灯
if(Button!=Btn_State) //按下 Button=0 Btn_State=1
{
HC595_Send_Data(0xFF&Count_Put);
HC595_Put_Data();
Count_Put=~Count_Put;
LED=~LED;
Btn_State=Button; //Button=0 Btn_State=0
}
}
}
四、现象

另外:看到有篇文章写的很好,大家可以去看看这个:
http://www.21ic.com/jichuzhishi/datasheet/74HC595/data/757249.html
74HC595点亮8个LED灯的更多相关文章
- 01 Arduino-点亮一盏LED灯
01 硬件连接 图片比较丑 特别说明:一般默认为二极管灯的压降是 2V 均值电流为15ma,所以如果接在5V的电源上面,串联接的电阻值为200欧姆左右,可做适当调整 切记不允许把LED灯直接并联在5 ...
- nodejs和树莓派开发以及点亮RGB的LED灯代码
前段时间集团举行前端IOT比赛,借此机会熟悉了树莓派相关的东西,特此记录一些相关的文档和开发指南. 先介绍一些树莓派的入门教程 阮一峰的树莓派入门 微雪电子-树莓派硬件中文官网 ssh链接树莓派 ss ...
- 点亮第一个LED灯
1.代码: #include <reg52.h> //<reg51.h> 包含52单片机寄存器库sbit led = P1^0; //只有地址可以被8整除的 才可以用s ...
- 嵌入式linux——点亮led灯(二)
刚才在jz2440板子上写了一个点亮中间led的程序,前前后后十几分钟才好.最终代码 本节内容: 1. 汇编点灯 2. C点灯 3. 参数选择点灯 4. 按键点灯 1. 汇编点灯 .text .glo ...
- 嵌入式学习笔记(综合提高篇 第一章) -- 利用串口点亮/关闭LED灯
1 前言 从踏入嵌入式行业到现在已经过去了4年多,参与开发过的产品不少,有交换机.光端机以及光纤收发器,停车场出入缴费系统,二维码扫码枪,智能指纹锁以及数字IC芯片开发等; 涉及产品中中既有 ...
- TI-RTOS 控制LED灯
TI将FreeRtos放在自家芯片上,于是得到了TI-RTOS,两者的区别我还不太清楚,近日因为项目需要,开始试用TI-RTOS,先来一个点灯的实验吧,算是 hello world. 这次手上的板子是 ...
- 定时器的应用---中断方式---让8个LED灯,左右各4个来回亮
定时器的应用---中断方式---让8个LED灯,左右各4个来回亮 /*************************** 中断方式 是主程序专注于其他的事情, 待定时器中断时才执行中断子程序. ** ...
- 定时器的应用---查询方式---让8个LED灯,左右各4个来回亮
定时器的应用,查询方式.让8个LED灯,左右各4个来回亮 代码: /********************** 查询方式是主程序不断的查询是否中断,而不需要准备子程序 *************** ...
- 点亮一个led灯
/********************************* 代码功能:点亮一个led灯 使用函数: pinMode(引脚号,模式); digitalWrite(引脚号,电平状态); //默认 ...
随机推荐
- python3中浮点数相减问题(大部分时候只需要关注整数的二进制形式就行了)
首先直接上判断方法:一切判断直接将整数部分装化成二进制,如果位数相等则相减后的值是等于的,如果不相等,相减大的结果一定不等于你要比较的结果. 如66.6-60.6==6.0的情况,66.6的二进制:1 ...
- python-模块 time, os, sys
时间模块 和时间有关系的我们就要用到时间模块.在使用模块之前,应该首先导入这个模块. #常用方法 1.time.sleep(secs) (线程)推迟指定的时间运行.单位为秒. 2.time.time( ...
- Centos7.6安装教程 && history设置显示执行命令的时间
一.规划磁盘使用空间(磁盘总大小200GB) /dev/sda1 mount /boot 1G mount point /dev/sda2 mount / 100G /dev/sda3 mount / ...
- 【目录】mysql 进阶篇系列
随笔分类 - mysql 进阶篇系列 mysql 开发进阶篇系列 55 权限与安全(安全事项 ) 摘要: 一. 操作系统层面安全 对于数据库来说,安全很重要,本章将从操作系统和数据库两个层面对mysq ...
- ASP.NET MVC 学习笔记之 MVC + EF中的EO DTO ViewModel
EO: Entity Object 就是EF中的实体类, 对EO的操作会对数据库产生影响. DTO: Data Transfer Object 数据传输对象.用于在各层之间传递数据的普通类,DTO有哪 ...
- 同域SQL server 做镜像服务器遇到1418错误
今天遇到了如题所说的错误,查了一天没有看到好的解决方案,因为作者是小白,所以对于解决方案都是代码的那种,完全理解不了. 现在,讲述一下我的解决方法.因为是同域的服务器,这个时候说网络访问不了对方,但是 ...
- chroot 试用alpinelinux安装软件包的问题
前边有说明使用chroot 体验alpinelinux,但是因为默认没有dns server,造成软件包无法下载 现象 问题原因 解决方法 copy host resolv.conf 到alpine ...
- appium1.7的使用
1.安装成功后,双击图标启动appium 2.输入host:0.0.0.0 ,port:4723,点击start server,启动appium,如下图所示,启动成功 3.点击搜索图标,打开定位工具I ...
- Java中udp/tcp的发送和接收
InetAddress UDP例程: 发送数据: 接收数据: 结果: TCP例程: 发送数据: 接收数据: 结果:
- 表格table隔行变色
if($('.p03-s2').find('table').length >= 2) {$('table:last-child').css({'borderTop': 'none'});}if( ...