
74HC595是一个串行移位寄存器,两块芯片级联,芯片U1的串行输出引脚连接芯片U2的串行输入引脚。当串口输入8个镇戚比特数据data1时,数据data1在U1芯片中;当串口再次输入8个比特数据data2时,data1进入到芯片U2中,data2留在芯片U1中。
综上所述,Arduino单片机应该给数码管扩展板两个char形数据,data1是数码管显示的数字,data2是让哪个数码管亮的位置信息。两个Byte的数据串行发送完毕后,RCLK接口输出一个上升沿信号,所有的数据由寄存器传送到锁存器中。
顺便强调一下,下面电路图中的P2是连接单片机的接口,P1是多块扩展板的级联接口。不要把线接错了呦!
想要看74HC595原理的朋友,可以查看下面的链接:
https://wenku.baidu.com/view/d69cdbbc19e8b8f67c1cb977.html
扩展板的驱动函数可以用下面的程序:
https://github.com/supermfc/Tube595
程序应该没有问题,因为我的电路板接口接反了,所以被迫研究了扩展板和芯片的原理,全是泪水啊!
Arduino IDE中有一个库函数shiftOut,可以方便地实现串迟旅改并转换。顺便给IDE点个赞,reference功能很好用。
//设置控制各段的数字IO脚,具体几号引脚对应哪一段,梁宽脊来源为数码管官方引脚图。int a=7
int b=6
int c=5
int d=11
int e=10
int f=8
int g=9
int dp=4
//显示数字1
void digital_1(void)
{
unsigned char j
digitalWrite(c,LOW)//给数字5引脚低电平,点亮c段
digitalWrite(b,LOW)//点亮b段
for(j=7j<=11j++)//熄灭其余段
digitalWrite(j,HIGH)
digitalWrite(dp,HIGH)//熄灭小数点DP段
}
//显示数字2
void digital_2(void)
{
unsigned char j
digitalWrite(b,LOW)
digitalWrite(a,LOW)
for(j=9j<=11j++)
digitalWrite(j,LOW)
digitalWrite(dp,HIGH)
digitalWrite(c,HIGH)
digitalWrite(f,HIGH)
}
//显示数字3
void digital_3(void)
{
unsigned char j
digitalWrite(g,LOW)
digitalWrite(d,LOW)
for(j=5j<=7j++)
digitalWrite(j,LOW)
digitalWrite(dp,HIGH)
digitalWrite(f,HIGH)
digitalWrite(e,HIGH)
}
//显示数字4
void digital_4(void)
{
digitalWrite(c,LOW)
digitalWrite(b,LOW)
digitalWrite(f,LOW)
digitalWrite(g,LOW)
digitalWrite(dp,HIGH)
digitalWrite(a,HIGH)
digitalWrite(e,HIGH)
digitalWrite(d,HIGH)
}
//显示数字5
void digital_5(void)
{
unsigned char j
for(j=7j<=9j++)
digitalWrite(j,LOW)
digitalWrite(c,LOW)
digitalWrite(d,LOW)
digitalWrite(dp,HIGH)
digitalWrite(b,HIGH)
digitalWrite(e,HIGH)
}
//显示数字6
void digital_6(void)
{
unsigned char j
for(j=7j<=11j++)
digitalWrite(j,LOW)
digitalWrite(c,LOW)
digitalWrite(dp,HIGH)
digitalWrite(b,HIGH)
}
//显示数字7
void digital_7(void)
{
unsigned char j
for(j=5j<橡渗=7j++)
digitalWrite(j,LOW)
digitalWrite(dp,HIGH)
for(j=8j<=11j++)
digitalWrite(j,HIGH)
}
//显示数字8
void digital_8(void)
{
unsigned char j
for(j=5j<=11j++)
digitalWrite(j,LOW)
digitalWrite(dp,HIGH)
}
void setup()
{
int i//定义变量
for(i=4i<=11i++)
pinMode(i,OUTPUT)//设置4~11引脚为输出模式
}
void loop()
{
while(1)
{
digital_1()//数字1
delay(2000)//延巧轮时2s
digital_2()
delay(2000)
digital_3()
delay(2000)
digital_4()
delay(2000)
digital_5()
delay(2000)
digital_6()
delay(2000)
digital_7()
delay(2000)
digital_8()
delay(2000)
}
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)