一 硬件

74HC595是一种8位串行输入,并行输出的寄存器芯片,一共有16个引脚,如下图。

首先需要理解串行和并行的概念,这个比较容易,串行输入就是一个一个数地输入,并行输出就是8位一道输出,见下图【1】

其次需要明确芯片每个引脚的功能,见下表【2,3】

74HC595引脚功能
符号 引脚 功能
Q0~Q7 15,1~7 8位并行数据(parallel data)输出
GND 8 接地
Q7s 9 串行数据出口引脚,当移位寄存器中的数据多于8bit时,会把已有的bit“从此引脚挤出去”。可用于595的级联,这里将其空置
MR 10 清空移位寄存器中已有的bit数据(低电平有效),这里接VCC高电平即可
SHCP 11 移位寄存器时钟引脚,上升沿时,移位寄存器中的bit 数据整体后移,并接受新的bit
STCP 12 存储寄存器时钟输入引脚。上升沿时,数据从移位寄存器转存带存储寄存器
OE 13 输出使能控制脚(低电平有效),所以接GND
DS 14 串行数据输入引脚
VCC 16 电源

这里面比较需要理解的是11、12引脚,对照功能描述,可以知道595芯片里面有2个8位寄存器:移位寄存器(Shift regisiter)、存储寄存器(Storage register)。这两个寄存器的讲解我觉得Vuko-wxh写的【3】里面非常清楚,移位就像压子弹入弹夹,当一个新的位数据要进来时,已经进入的位数据就在移位寄存器时钟脉冲的控制下(即11脚),整体后移,让出位置。数据从位移寄存器转移到存储寄存器,也是需要时钟脉冲驱动的,这就是12脚的作用。

最后是实际使用,1位数码管本来需要8个数字引脚控制,用595空置,只需占用3个数字引脚(如图,11、12、14接板上的数字引脚),硬件连接如下图:

共阳数码管,一端阳极空置,另一端外接220欧姆再接VCC,Q0~Q7按照顺序依次接b->a->f->g->e->d->c->DP。另外接入按钮,配合下拉电阻使用。

二 代码

功能:配合按钮+一位数码管,随机显示一个数字,效果是一位数码管一直随机显示数字,数字不断变换,当按下按钮,随机数会固定显示,松开后又恢复之前不断变换的状态。具体代码如下,参考了【1】

 //数字引脚
int latchPin = 8;//对接595芯片12引脚
int clockPin=3;//对接595芯片11引脚
int dataPin=9;//对接595芯片14引脚
int buttonPin=12;
//数字0~9
byte Tab[]={0x11,0x7D,0x23,0xb0,0x99,0x88,0x81,0x80,0x90};//0,1,2,6对,其他数字int number;
long randNumber;void setup() {pinMode(latchPin,OUTPUT);pinMode(dataPin,OUTPUT);pinMode(clockPin,OUTPUT);pinMode(buttonPin,INPUT);randomSeed(analogRead(0));//设置一个随机数产生源模拟口0}void loop() {boolean state = digitalRead(buttonPin);randNumber=random(10);//产生0~9之间随机数  //一旦按钮按下,显示该数,并保持到松开为止while(state == HIGH){delay(1000);state = digitalRead(buttonPin);}
}
//数码管显示数字
void showNumber(int number){digitalWrite(latchPin,LOW);shiftOut(dataPin,clockPin,LSBFIRST,Tab[number]);digitalWrite(latchPin,HIGH);delay(400);}

知识点讨论:

1.关于对应数字的输入,这里没有用之前文章中数组的设计(因为是并行输出,不需要通过循环来显示一个数字),而是用十六进制直接代表,以0为例见下表

595输出引脚 Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7
对接的数码管引脚 b a f g e d c DP

0

(数字)

0 0 0 1 0 0 0 1

0x11

(595输入数据,十六进制)

后续语句中Tab[n]就可以把对应的数字代码导入到595中,再控制数码管显示对应数字了,因为偷懒,只验证了4个数字,其他就不对了。
2.关于74HCFC95的使用就是代码最后数码管显示数字部分,核心语句就是

shiftOut(dataPin,clockPin,bitOrder,value)

第三个参数bitOrder表示输出位的顺序,可选LSBFIRST(最低位优先)或MSBFIRST(最高位优先),试验了一下,发现用LSBFIRST时,完全符号我的预期,即Q0~Q7输出刚好对应b->DP的顺序(因为我就是这样对应接线的),但如果用MSBFIRST,则会把字节顺序反过来投射到b->DP上,还是上面0的例子,我导入字节是0x11(其实预期就是00010001对应到b->DP上),但实际效果确是{10001000}导入到b->DP上了,看来这里并没有真正搞懂,考虑到实际接线,我感觉要么是压入弹仓的顺序,要么是从移位寄存器到存储寄存器转移的顺序,这两个顺序有什么低位和高位变化吧。

3.关于按钮功能,这里用while函数实现,一开始自己写,漏了里面state=digitalRead(buttonPin)这句,导致一直在这个循环里出不来(按下后state变为1从而进入循环,按钮松开后,由于循环里没有再次读取buttonPin的状态,所以state一直是1),后来通过串口才发现,还是【1】里面写地好,直接while(digitalRead(buttonPin)==HIGH){}

4.关于随机数,之前红外遥控数码管的时候总是不成功,这回照抄【1】的,用了randomSeed()和random()两个函数,虽然还是有点懵,但好歹成功了。

【1】Arduino教程中级 项目十三 数字骰子 - DF创客社区 - 分享创造的喜悦

【2】74HC595_百度百科

【3】单片机芯片之——图解74HC595(第一部分)_Vuko_Coding Zone-CSDN博客_74hc595

Arduino基础之十一 74HC595的使用------控制1位数码管相关推荐

  1. proteus仿真arduino控制两位数码管

    前面我们用arduino控制一位数码管,知道了控制数码管的原理.这里我们增加了一位,其显示的原理基本一样.只不过本质上不是两位同时点亮,而是轮换点亮.下面是原理图: 我们来看看代码的实现: int P ...

  2. protues用一片74hc595控制两位数码管

    前面的博文中我们介绍了一个arduino中用一片595来控制一位数码管,这里我们介绍一个595来控制两位数码管.两位数码管是应用最广泛的,如交通灯倒计时,计数器等都将用到两位数码管. 两位数码管的动态 ...

  3. arduino控制一位数码管、控制二位数码管动态显示(用不到中断程序)

    目的: 1.利用arduino控制一位共阳极数码管显示 2.利用arduino控制二位共阳极数码管显示 前言: 前段时间,在网上看到了一个视频,是关于二位数码管动态显示的视频,感觉很新奇,就想把它做出 ...

  4. C#+Arduino控制4位数码管

    上一篇介绍了如何控制1位数码管,接下来就是控制4位数码管,其实就是4个一位数码管拼起来构成的,但是4位数码管的引脚只比一位数码管多了2个.通过查找资料可知,4位数码管中的a.b.c.d.e.f.g.d ...

  5. 两个74HC595D驱动芯片控制三位数码管显示

    两个74HC595D驱动芯片控制三位数码管显示 概述 一.数码管引脚及使用概述 1.1位数码管显示方式 2.3位数码管 3.3位数码管电路图 二.74HC595D引脚及使用概述 1. 74HC595引 ...

  6. 物联网开发笔记(23)- 使用Micropython开发ESP32开发板之控制4位数码管

    上一节我们讲解了如何控制单个数码管,这一节我们来一起学一下如何控制4位数码管. 一.目的 使用MicroPython开发ESP32控制4位数码管 二.环境 ESP32+数码管+Thonny IDE+电 ...

  7. 8255总线实验 编写程序利用8255扩展单片机的IO口,控制8位数码管显示1-8。

    8255总线实验 编写程序利用8255扩展单片机的IO口,控制8位数码管显示1-8. 程序: #include<reg51.h> #include<absacc.h> #def ...

  8. 【单片机仿真项目】外部中断0和1控制两位数码管进行计数

    目录 1.外部中断0和1控制两位数码管进行计数 keil 代码 2.proteus 原理图 3.gif 动态图

  9. 单片机动态从00到99C语言,用51单片机控制 2位数码管动态显示 00 ~ 99

    ;用51单片机控制 2位数码管动态显示 00 ~ 99. ;从 00 开始显示,显示数字每隔一段时间加 1,一直到 99,然后回到 00. ;从 00 到 10 每隔 100ms 加 1: ;从 10 ...

最新文章

  1. 提升tomcat 性能的经验
  2. mysql报错3534_win7下安装MYSQL报错:MYSQL 服务无法启动的3534问题
  3. mysql触发器 生僻字_MySQL生僻字插入失败的处理方法(Incorrect string value)
  4. 采购杀毒软件,你说话能算数么?
  5. keepalived+nginx实现高可用
  6. 【NS2】在linux下安装低版本GGC
  7. Laravel 5.4: 特殊字段太长报错 420000 字段太长
  8. 【kafka】JMX 监控kafka FINER RMI TCP getConnectionId IOException
  9. 【图像特征提取1】方向梯度直方图HOG---从理论到实践------附带积分图像的解析
  10. ib什么意思_科普|听说邻居的孩子去了IB学校,IB具体是什么?
  11. docker:编排与部署小神器Compose
  12. 交叉熵反向求导计算过程
  13. Excel之数据透视表
  14. 学python必备的英语单词(终身受益)
  15. 智能交通运输(包括TOCC)精华主题汇总
  16. NOI题库答案(1.2 编程基础之变量定义、赋值及转换)
  17. MK808 vs Raspberry Pi
  18. 别让职场形象毁了你的职场前程
  19. apm软件仿真+QGC地面站 环境搭建
  20. 问题:浏览器自动填充input密码框

热门文章

  1. 基于AutoJs抖音极速版辅助App
  2. D2C-Net: A Dual-branch, Dual-guidance and Cross-refine Network for Camouflaged Object Detection阅读笔记
  3. 顺丰官网代码(自编)
  4. matlab 生成 word 表格,Matlab生成Word表格范例代码
  5. CodeForces - 710F String Set Queries
  6. 监控与日志的黄金法则
  7. 软文营销登顶销售奇迹的4U定律你知道吗?
  8. 带你认识什么是一级指针、二级指针、三级指针
  9. 网页采集器-八爪鱼采集器
  10. Kaggle(Gun Violence Data)—美国枪支暴力事件分析(1)和(2)