这两天重新来玩74HC595,因为前一段时间为了点亮led 像素屏用了查理复用,但是查理复用的GPIO占用实在太高,而且接线其实也非常不方便;因此打算重新用74HC595来点灯,毕竟595的价格喜人啊。

之前一直不愿意用595的原因是它的文档实在看起来头疼的很,什么sclk,rclk,sclr,stcp ,shcp,ds,si 等等,同样是595 芯片,不同文档介绍的时候,pin的名称是两套,不论是那一套都让人容易晕头转向。

同时为了更深入理解595的运行机制,加上前端时间用了tm1637,学习了异或和对应的二进制转换,所以打算手工来驱动595 ,不使用shiftout函数。

布线如下:

代码如下:


int latchPin = D8;  //Pin connected to ST_CP(pin 12) of 74HC595 //ST
int clockPin = D6; //Pin connected to SH_CP(pin 11) of 74HC595  //这个pin居然可以没有 SH
int dataPin = D7;  //Pin connected to DS(pin 14) of 74HC595
int r = 8;
unsigned char sequence[8] = {B00000001, B00000010, B00000100, B00001000, B00010000, B00100000, B01000000, B10000000,};void setup() {Serial.begin(115200);pinMode(latchPin, OUTPUT);pinMode(clockPin, OUTPUT);pinMode(dataPin, OUTPUT);
}
uint8_t cur = 0;
void loop() {for (int a = 0; a < 8; a++) {cur = sequence[a];digitalWrite(latchPin, LOW);for (int c = 0; c < 8; c++) {digitalWrite(clockPin, LOW);if (cur & 0x01)digitalWrite(dataPin, HIGH);else digitalWrite(dataPin, LOW);digitalWrite(clockPin, HIGH);cur >>= 1;}digitalWrite(latchPin, HIGH);delay(800);}delay(2000);
}

这样的代码就是从8->1输出流水灯,结果8->2都运行起来正常,但是2->1的时候出了问题,本来应该是2灭1亮,结果2和1 一期亮了,如下图:

代码问题找了无数遍找不出原因,各种测试和尝试,找不出原因。

按照595的手册:

1、SI(DS)输入数据;

2、CLK(SHCP)上升沿,输入数据到移位寄存器;

3、重复上面过程到数据输入结v束;

4、RCLK(STCP) 上升沿,移入数据到锁存器并行输出Q0-Q8并行输出;

所以上面的代码是没有错的,网上搜到过由于电压不对,导致输出不对的情况,595 的电压是5V,SI(DS)的电压是3.3V这种情况导致输出不对,于是就试了一下,结果在3.3V 的情况下,8->1确实输出正常。

由于3.3V 下,LED不够亮,重新回到了5V折腾,于是开始怀疑是不是各种接线不对,于是把MR接到了GND,之前没有接,如下图

这次调整后,MR接了GND, 5.5V下8-1输出正常,这其实已经是最标准的做法,因为之前没有接MR.

然而这件事并没有完,后来在MR没有接入GND的情况下,为了对比一下效果,使用了shiftout函数,发觉MR没有接入GND,同样意图8->1输出,我自己的代码2->1 同时亮,而shiftout函数又是完全正常的,代码如下:


int latchPin = D8;  //Pin connected to ST_CP(pin 12) of 74HC595 //ST
int clockPin = D6; //Pin connected to SH_CP(pin 11) of 74HC595  //这个pin居然可以没有 SH
int dataPin = D7;  //Pin connected to DS(pin 14) of 74HC595
int r = 8;
unsigned char sequence[8] = {B00000001, B00000010, B00000100, B00001000, B00010000, B00100000, B01000000, B10000000,};void setup() {Serial.begin(115200);pinMode(latchPin, OUTPUT);pinMode(clockPin, OUTPUT);pinMode(dataPin, OUTPUT);
}
uint8_t cur = 0;
void loop() {for (int a = 0; a < 8; a++) {cur = sequence[a];digitalWrite(latchPin, LOW);for (int c = 0; c < 8; c++) {digitalWrite(clockPin, LOW);if (cur & 0x01)digitalWrite(dataPin, HIGH);else digitalWrite(dataPin, LOW);digitalWrite(clockPin, HIGH);cur >>= 1;}digitalWrite(latchPin, HIGH);delay(800);}for (int m = r - 1; m >= 0; m--) {digitalWrite(latchPin, LOW);shiftOut(dataPin, clockPin, MSBFIRST, sequence[m]);digitalWrite(latchPin, HIGH); delay(800);}delay(2000);
}

视频对比如下:

WeChat_20221108223820

于是又各种找原因,怀疑是不是各种上升沿出了问题,各种怀疑,各种调试,反正就是觉得奇怪:

1、在MR接入GND的情况下,都正常;

2、在MR没有GND的情况下,3.3V电压 一切正常;5V电压,为啥shiftout函数亮灯正常,而我自己的函数亮灯前面正常,最后两位出了问题,如果说我的代码有问题,那么为啥有的情况下工作正常,有的不正常?

一直到最后实在不行,祭出了终极大法,查看shiftout的源代码:

void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val) {uint8_t i;for(i = 0; i < 8; i++) {if(bitOrder == LSBFIRST)digitalWrite(dataPin, !!(val & (1 << i)));elsedigitalWrite(dataPin, !!(val & (1 << (7 - i))));digitalWrite(clockPin, HIGH);digitalWrite(clockPin, LOW);}
}

这一下就对比出来了,shiftout对于时钟线的上升沿用的是:

digitalWrite(clockPin, HIGH);
digitalWrite(clockPin, LOW);

而我自己用的是:

      digitalWrite(clockPin, LOW);digitalWrite(clockPin, HIGH);

当把代码重新修改后,在MR不接GND的情况下,5V电压,从8->1 shiftout和我自己的代码都工作正常。

在网上其他人的代码也是同我最初的情况一样:

应该说很多人都是这么写的,先low后high.

一般情况下,MR接入GND,这段代码都会工作正常,但是我上面的经历说明了某些情况下如果不按照shiftout所示的先high后low,会存在难以找到原因的异常,包括网上流传的5V电压74HC595不稳定要用到3.3V电压的谣传大概也是因为这个原因。

不过最后还是没有搞明白为啥是先high后low,而不是先low和high呢?

arduino(esp8266)驱动74hc595进行流水灯异常一例相关推荐

  1. Arduino程序设计(一) 流水灯+呼吸灯

    LED灯程序设计 前言 一.LED灯的程序设计1 -- 频闪灯 二.LED灯的程序设计2 -- 流水灯 三.LED灯的程序设计3 -- 呼吸灯 总结 参考文献 前言 本文主要介绍三种LED灯的程序设计 ...

  2. HC32F460驱动ws2812及流水灯灯效实现方法

    文章目录 前言 一.WS2812是什么? 二.通过SPI控制WS2812 1.原理 2.功能实现 总结 前言 最近公司打算引进新的平台(华大)来做产品开发,板子到手后,老大让我先点个流水灯看看效果.本 ...

  3. Arduino+ESP8266驱动DS3231

    1.DS3231是Dallas/Maxim生产的RTC芯片,I2C总线,工作电压2.3-5.5V,器件地址0x68,丝印"I2C Pi RTC V1.0 IOTMCU"模块所用电池 ...

  4. ZYNQ Z-TURN BOARD 学习笔记1-Ubuntu上的流水灯实验

    前言 之前一直都在学习传统的FPGA,学习和使用过Altera的Cyclone系列以及Xilinx的Spartan系列芯片.对于赛灵思的软硬件全面可编程器件ZYNQ很有兴趣,但苦于手头没有zynq的板 ...

  5. proteus8 Professional和keil4联调流水灯程序

    一.软件准备 (软件安装教程请自行百度安装教程,本文不做叙述) 1. 下载安装keil4 2. 下载安装Proteus8 Professional 3. 下载安装vdmagdi.exe 链接:http ...

  6. K_A02_005 基于单片机驱动数码管 LED 按键模块(TM1638) 流水灯 0-7 按键值显示

    目录 一.资源说明 二.基本参数 1.参数 2.引脚说明 三.通信协议说明 1.写数据 时序: 程序: 2.读数据 时序: 程序: 四.部分代码说明 1.接线说明 1.1.STC89C52RC+按键数 ...

  7. Arduino+ESP8266手机控制小灯亮灭及常见问题

    最近在接触Arduino和ESP8266模块,比较基础的就是运用Arduino IDE软件.ESP8266模块和一款手机软件来控制8266测试板上的小灯亮灭. 项目软件: Arduino IDE软件 ...

  8. 【黑金原创教程】【FPGA那些事儿-驱动篇I 】【实验一】流水灯模块

    实验一:流水灯模块 对于发展商而言,动土仪式无疑是最重要的任务.为此,流水灯实验作为低级建模II的动土仪式再适合不过了.废话少说,我们还是开始实验吧. 图1.1 实验一建模图. 如图1.1 所示,实验 ...

  9. 2018.9.15,Arduino—流水灯实验报告

    实验任务和目的 通过Arduino控制LED形成流水灯效果 实验条件 Arduino UNO,面包板,6个LED,6个220Ω电阻 实验过程和结果 实验详细步骤: 在各LED正极和Arduino引脚之 ...

最新文章

  1. 笔记工具这么多,但这款有点不一样
  2. hibernate 三种查询方式源码跟踪及总结
  3. termux怎么安装python库_Python termux-apt-repo包_程序模块 - PyPI - Python中文网
  4. make工具和Makefile基础语法(含有交叉编译、pthread_create()的处理)
  5. selenide_使用Selenide进行有效的UI测试
  6. 如何在虚拟机上安装wsus服务器,如何在Hyper-V虚拟机上安装WSUS服务器技巧
  7. 性能测量工具类——TimeMeasureUtil TimeMeasureProxy
  8. python selenium 关闭窗口_Selenium快速上手实战 | 上篇
  9. python画画用哪库好_学Python画画:应用Turtle库画一个蠢萌的小黄人
  10. NLP任务增强:通过引入外部知识来提供额外信息
  11. nginx 1.12基础知识
  12. 手把手教你获取一年免费通配符泛域名SSL证书
  13. mysql的四大特性(AICD)
  14. 微信小程序定制开发的几大类型
  15. 如何阻止事件冒泡与默认事件?
  16. ABS故障使用计算机仿真,车辆ABS系统的计算机仿真研究
  17. jQuery动画练习
  18. proxy代理报错: Uncaught (in promise) Error: Request failed with status code 500
  19. 为什么 Redis 单线程却能支撑高并发?
  20. 脚手架--------Yeoman基本使用

热门文章

  1. 思科交换机:vtp协议
  2. 为什么要学C语言及C语言存在的意义,有人经常犹豫学不学C语言
  3. 数值优化-信赖域方法
  4. 【科普/汇总】最全面的笔记本电脑验机指南,保证电脑到手小白开荒不踩坑
  5. 贝塞尔曲线工具css,贝塞尔曲线以及css动画 | Soo Smart!
  6. 计算机天才楼天城回母校杭十四中
  7. 代金券制作小程序秒代金券_免费的微信电子代金券制作(模板、设计)工具
  8. oracle 在中国的合作伙伴名单(一)
  9. SCUT - 249 - A piece of Cake - 组合数学
  10. 最新数据恢复软件EasyRecovery易恢复2023汉化中文版下载,以及如何恢复照片恢复