极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 20446|回复: 3

esp8266 for arduino 通过595驱动2位数码管的求助

[复制链接]
发表于 2019-2-22 18:29:17 | 显示全部楼层 |阅读模式
MCU:ESP8266
驱动:74hc595 x 2
电路连接:
8266通过spi总线驱动2个串联的595
第一个595的Q0~Q6接数码管的笔画引脚(小数点废弃),Q7接公共端1(共阳)
第二个595的Q0接一组6个蓝色LED的阳极(6个并联),Q1接一组6个红色LED的阳极(6个并联)
上面的红色LED和蓝色LED的阴极并联之后,接到数码管的笔画端
示意图:



写了一个功能测试代码:
  1. //  Serial.println("1th");
  2. //  byte data1 = B10000100;//Led数码管,Q7~Q0
  3. //  byte data2 = B10001111;//双色LED,Q7~Q0
  4. //  digitalWrite(loadPin, LOW);
  5. //  shiftOut(dataPin, clockPin, MSBFIRST, data2);//双色LED
  6. //  shiftOut(dataPin, clockPin, MSBFIRST, data1);//Led数码管
  7. //  digitalWrite(loadPin, HIGH);

  8. const int dataPin = 13; //数据
  9. const int loadPin = 14; //锁存
  10. const int clockPin = 0; //时钟
  11. const int enPin = 2;//en@
  12. const int mrPin = 15;//MR@
  13. unsigned char count[] = {0xC0, 0xFC, 0x92, 0x94, 0xAC, 0x85, 0x81, 0xDC, 0x80, 0x84, 0x88, 0xA1, 0xC3, 0xB0, 0x83, 0x8B}; //数码管0~9,A~F真值表

  14. //SMG定义:0=写数码管,1=写LED
  15. void write_data(unsigned int SMG, unsigned char data)
  16. {
  17.   switch (SMG) {
  18.     case 0: {
  19.         if (data < 10)
  20.         {
  21.           byte data2 = B01111111;//双色LED,Q7~Q0,关闭第二数码管显示
  22.           digitalWrite(loadPin, LOW);
  23.           shiftOut(dataPin, clockPin, MSBFIRST, data2);//双色LED
  24.           shiftOut(dataPin, clockPin, MSBFIRST, count[data]);//Led数码管
  25.           digitalWrite(loadPin, HIGH);
  26.         }
  27.         else
  28.         {
  29.           byte data2 = B11111111;//双色LED,Q7~Q0 显示十位
  30.           digitalWrite(loadPin, LOW);
  31.           shiftOut(dataPin, clockPin, MSBFIRST, data2);//双色LED
  32.           shiftOut(dataPin, clockPin, MSBFIRST, 0x7f & count[data / 10]);//Led数码管 关闭个位
  33.           digitalWrite(loadPin, HIGH);
  34.           delay(60);
  35.           data2 = B01111111;//双色LED,Q7~Q0,显示个位
  36.           digitalWrite(loadPin, LOW);
  37.           shiftOut(dataPin, clockPin, MSBFIRST, data2);//双色LED
  38.           shiftOut(dataPin, clockPin, MSBFIRST, count[data % 10]);//Led数码管
  39.           digitalWrite(loadPin, HIGH);
  40.           delay(60);
  41.         }
  42.         break;
  43.       }
  44.     case 1: {
  45.         byte data2 = B10001111;//双色LED,Q7~Q0
  46.         digitalWrite(loadPin, LOW);
  47.         shiftOut(dataPin, clockPin, MSBFIRST, data2);//双色LED
  48.         shiftOut(dataPin, clockPin, MSBFIRST, count[data]);//Led数码管
  49.         digitalWrite(loadPin, HIGH);
  50.         break;
  51.       }
  52.   }

  53. }

  54. void setup()
  55. {
  56.   pinMode(dataPin, OUTPUT);
  57.   pinMode(loadPin, OUTPUT);
  58.   pinMode(clockPin, OUTPUT);
  59.   pinMode(enPin, OUTPUT);
  60.   digitalWrite(enPin, LOW);//启用芯片
  61.   pinMode(mrPin, OUTPUT);
  62.   digitalWrite(mrPin, LOW);//复位
  63.   delay(500);
  64.   digitalWrite(mrPin, HIGH);
  65.   Serial.begin(115200);
  66. }

  67. void loop()
  68. {
  69.   for (unsigned char i = 0; i < 16; i++)
  70.   {
  71.     write_data(0, i);
  72.     delay(200);
  73.   }
  74. }
复制代码


基本上能够实现数码管和led灯的点亮,上边代码能够分别点亮以及实现0~9的数码,A-F的字母显示。但是,两位数码管的显示完全不流畅,闪烁或者只能看清楚个位数或者十位。。。。

求修改指点代码!!!谢谢

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2019-2-24 16:12:34 | 显示全部楼层
本帖最后由 Ansifa 于 2019-2-24 16:13 编辑

试一下
  1. // Serial.println("1th");
  2. // byte data1 = B10000100;//Led数码管,Q7~Q0
  3. // byte data2 = B10001111;//双色LED,Q7~Q0
  4. // digitalWrite(loadPin, LOW);
  5. // shiftOut(dataPin, clockPin, MSBFIRST, data2);//双色LED
  6. // shiftOut(dataPin, clockPin, MSBFIRST, data1);//Led数码管
  7. // digitalWrite(loadPin, HIGH);

  8. const int dataPin = 13; //数据
  9. const int loadPin = 14; //锁存
  10. const int clockPin = 0; //时钟
  11. const int enPin = 2;//en@
  12. const int mrPin = 15;//MR@
  13. unsigned char count[] = {0xC0, 0xFC, 0x92, 0x94, 0xAC, 0x85, 0x81, 0xDC, 0x80, 0x84, 0x88, 0xA1, 0xC3, 0xB0, 0x83, 0x8B}; //数码管0~9,A~F真值表

  14. //SMG定义:0=写数码管,1=写LED
  15. void write_data(unsigned int SMG, unsigned char data)
  16. {
  17.         if (SMG == 0)
  18.         {
  19.                 if (data < 10)
  20.                 {
  21.                         byte data2 = B01111111;//双色LED,Q7~Q0,关闭第二数码管显示
  22.                         digitalWrite(loadPin, LOW);
  23.                         shiftOut(dataPin, clockPin, MSBFIRST, data2);//双色LED
  24.                         shiftOut(dataPin, clockPin, MSBFIRST, count[data]);//Led数码管
  25.                         digitalWrite(loadPin, HIGH);

  26.                 }
  27.                 else
  28.                 {
  29.                         byte data2 = B11111111;//双色LED,Q7~Q0 显示十位
  30.                         digitalWrite(loadPin, LOW);
  31.                         shiftOut(dataPin, clockPin, MSBFIRST, data2);//双色LED
  32.                         shiftOut(dataPin, clockPin, MSBFIRST, 0x7f & count[data / 10]);//Led数码管 关闭个位
  33.                         digitalWrite(loadPin, HIGH);
  34.                         delay(60);
  35.                         data2 = B01111111;//双色LED,Q7~Q0,显示个位
  36.                         digitalWrite(loadPin, LOW);
  37.                         shiftOut(dataPin, clockPin, MSBFIRST, data2);//双色LED
  38.                         shiftOut(dataPin, clockPin, MSBFIRST, count[data % 10]);//Led数码管
  39.                         digitalWrite(loadPin, HIGH);
  40.                         delay(60);
  41.                 }
  42.         }
  43.         if (SMG == 1)
  44.         {
  45.                 byte data2 = B10001111;//双色LED,Q7~Q0
  46.                 digitalWrite(loadPin, LOW);
  47.                 shiftOut(dataPin, clockPin, MSBFIRST, data2);//双色LED
  48.                 shiftOut(dataPin, clockPin, MSBFIRST, count[data]);//Led数码管
  49.                 digitalWrite(loadPin, HIGH);
  50.         }
  51. }



  52. void setup()
  53. {
  54.         pinMode(dataPin, OUTPUT);
  55.         pinMode(loadPin, OUTPUT);
  56.         pinMode(clockPin, OUTPUT);
  57.         pinMode(enPin, OUTPUT);
  58.         digitalWrite(enPin, LOW);//启用芯片
  59.         pinMode(mrPin, OUTPUT);
  60.         digitalWrite(mrPin, LOW);//复位
  61.         delay(500);
  62.         digitalWrite(mrPin, HIGH);
  63.         Serial.begin(115200);
  64. }

  65. void loop()
  66. {
  67.         for (unsigned char i = 0; i < 16; i++)
  68.         {
  69.                     write_data(0, i);
  70.                     delay(200);
  71.         }
  72. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-2-24 16:17:42 | 显示全部楼层


我上午自己解决了,主循环里边,delay值太大,导致每次刷新的间隔过大闪烁。因为每次循环只刷新一个部分的内容,必须要3~4次才能刷新所有的数据,这就导致闪烁了

不管如何,谢谢你呐
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-18 20:25 , Processed in 0.042218 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表