maxims 发表于 2019-2-22 18:29:17

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

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的阴极并联之后,接到数码管的笔画端
示意图:



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

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

//SMG定义:0=写数码管,1=写LED
void write_data(unsigned int SMG, unsigned char data)
{
switch (SMG) {
    case 0: {
      if (data < 10)
      {
          byte data2 = B01111111;//双色LED,Q7~Q0,关闭第二数码管显示
          digitalWrite(loadPin, LOW);
          shiftOut(dataPin, clockPin, MSBFIRST, data2);//双色LED
          shiftOut(dataPin, clockPin, MSBFIRST, count);//Led数码管
          digitalWrite(loadPin, HIGH);
      }
      else
      {
          byte data2 = B11111111;//双色LED,Q7~Q0 显示十位
          digitalWrite(loadPin, LOW);
          shiftOut(dataPin, clockPin, MSBFIRST, data2);//双色LED
          shiftOut(dataPin, clockPin, MSBFIRST, 0x7f & count);//Led数码管 关闭个位
          digitalWrite(loadPin, HIGH);
          delay(60);
          data2 = B01111111;//双色LED,Q7~Q0,显示个位
          digitalWrite(loadPin, LOW);
          shiftOut(dataPin, clockPin, MSBFIRST, data2);//双色LED
          shiftOut(dataPin, clockPin, MSBFIRST, count);//Led数码管
          digitalWrite(loadPin, HIGH);
          delay(60);
      }
      break;
      }
    case 1: {
      byte data2 = B10001111;//双色LED,Q7~Q0
      digitalWrite(loadPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, data2);//双色LED
      shiftOut(dataPin, clockPin, MSBFIRST, count);//Led数码管
      digitalWrite(loadPin, HIGH);
      break;
      }
}

}

void setup()
{
pinMode(dataPin, OUTPUT);
pinMode(loadPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(enPin, OUTPUT);
digitalWrite(enPin, LOW);//启用芯片
pinMode(mrPin, OUTPUT);
digitalWrite(mrPin, LOW);//复位
delay(500);
digitalWrite(mrPin, HIGH);
Serial.begin(115200);
}

void loop()
{
for (unsigned char i = 0; i < 16; i++)
{
    write_data(0, i);
    delay(200);
}
}


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

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

Ansifa 发表于 2019-2-24 16:12:34

本帖最后由 Ansifa 于 2019-2-24 16:13 编辑

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

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

//SMG定义:0=写数码管,1=写LED
void write_data(unsigned int SMG, unsigned char data)
{
        if (SMG == 0)
        {
                if (data < 10)
                {
                        byte data2 = B01111111;//双色LED,Q7~Q0,关闭第二数码管显示
                        digitalWrite(loadPin, LOW);
                        shiftOut(dataPin, clockPin, MSBFIRST, data2);//双色LED
                        shiftOut(dataPin, clockPin, MSBFIRST, count);//Led数码管
                        digitalWrite(loadPin, HIGH);

                }
                else
                {
                        byte data2 = B11111111;//双色LED,Q7~Q0 显示十位
                        digitalWrite(loadPin, LOW);
                        shiftOut(dataPin, clockPin, MSBFIRST, data2);//双色LED
                        shiftOut(dataPin, clockPin, MSBFIRST, 0x7f & count);//Led数码管 关闭个位
                        digitalWrite(loadPin, HIGH);
                        delay(60);
                        data2 = B01111111;//双色LED,Q7~Q0,显示个位
                        digitalWrite(loadPin, LOW);
                        shiftOut(dataPin, clockPin, MSBFIRST, data2);//双色LED
                        shiftOut(dataPin, clockPin, MSBFIRST, count);//Led数码管
                        digitalWrite(loadPin, HIGH);
                        delay(60);
                }
        }
        if (SMG == 1)
        {
                byte data2 = B10001111;//双色LED,Q7~Q0
                digitalWrite(loadPin, LOW);
                shiftOut(dataPin, clockPin, MSBFIRST, data2);//双色LED
                shiftOut(dataPin, clockPin, MSBFIRST, count);//Led数码管
                digitalWrite(loadPin, HIGH);
        }
}



void setup()
{
        pinMode(dataPin, OUTPUT);
        pinMode(loadPin, OUTPUT);
        pinMode(clockPin, OUTPUT);
        pinMode(enPin, OUTPUT);
        digitalWrite(enPin, LOW);//启用芯片
        pinMode(mrPin, OUTPUT);
        digitalWrite(mrPin, LOW);//复位
        delay(500);
        digitalWrite(mrPin, HIGH);
        Serial.begin(115200);
}

void loop()
{
        for (unsigned char i = 0; i < 16; i++)
        {
                    write_data(0, i);
                    delay(200);
        }
}

maxims 发表于 2019-2-24 16:17:42

Ansifa 发表于 2019-2-24 16:12
试一下

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

不管如何,谢谢你呐

lisxi 发表于 2019-12-25 15:38:04

谢谢分享!
页: [1]
查看完整版本: esp8266 for arduino 通过595驱动2位数码管的求助