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: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);
}
}
Ansifa 发表于 2019-2-24 16:12
试一下
我上午自己解决了,主循环里边,delay值太大,导致每次刷新的间隔过大闪烁。因为每次循环只刷新一个部分的内容,必须要3~4次才能刷新所有的数据,这就导致闪烁了
不管如何,谢谢你呐 谢谢分享!
页:
[1]