用Arduino操控STM32控制通常在51上才用的六脚8*8LED矩阵
如何用Arduino控制STM32
这个我不想说,能来搜这个的通常都已经把BootLoader烧进去了,并且点了灯。但如果留言有5条以上我就说。 但我说一句我用的是STM32F103c8t6最小系统板。
如何用STM32控制六脚8*8LED矩阵
在操作之前可以先看看Arduino如何操作74HC595N和操作88LED矩阵的视频,虽然有88LED但网上我没见有那个用这个集成6脚的,而且那么闲还上STM32不上Arduino开发板。
如何操控六脚8*8LED矩阵
这个LED矩阵,里面有两个74HC595N模块。通过链接主要的3针脚发送数据。我这里使用的是清翔,的1088BS。通过他的原理图知道它主要的几个引脚,DI,LE,CLK是操控74HC595N的引脚。我在从清翔在B站的视频里了解了,51单片机是如何控制这个8*8的点阵的。这里附上主要的代码,方便对比。
sbit DIO = P3^4; //串行数据口
sbit S_CLK = P3^5;//移位寄存器时钟
sbit R_CLK = P3^6;//输出锁存器时钟
void main()
{
//ROW 0x80 , COL 0xfe
unsigned char i, dat;//i循环次数 dat需要发送的数据
dat = 0xfe;//发送列值
for(i=0; i<8; i++)//循环8次
{
S_CLK = 0;//拉低移位寄存器时钟
R_CLK = 0;//拉低输出锁存器时钟
if(dat & 0x01)//发送1
DIO = 1;
else //发送0
DIO = 0;
S_CLK = 1;//拉高移位寄存器时钟,数据移位
dat >>= 1;//数据右移
}
dat = 0x80;//发送行值
for(i=0; i<8; i++)//循环8次
{
S_CLK = 0;//拉低移位寄存器时钟
R_CLK = 0;//拉低输出锁存器时钟
if(dat & 0x01)//发送1
DIO = 1;
else //发送0
DIO = 0;
S_CLK = 1;//拉高移位寄存器时钟,数据移位
dat >>= 1;//数据右移
}
R_CLK = 1;//拉高输出锁存器时钟,并行输出数据
while(1);
}
这里需要注意一下在51单片机里的视频中也说了,这个LED点阵的特点,我总结了一下
- 发送列值,哪列电位高哪列不亮,最高位在左边
- 发送行值,哪行电位低哪行不亮,最高位在下面
接线
我的接线是乱接的我没有系统的学习过单片机,只是我的同学在假期的时候乱弄,将STM32跑了起来。我这里接的是PA7(DI),PA5(LE),PA6(CLK)。GND和NC我都是接的GND,VCC接3.3V,也可以不接不过会暗一些。
代码
通过51的代码,在通过我之前的Arduino学习的LED模块和74HC595N,这里提一下B站的https://www.bilibili.com/video/BV1YW411Z76E?from=search&seid=14304970661507979329虽然讲的非常简单但是十分有用。
#define DIO PA7 //DI
#define S_CLK PA6 //CLK
#define R_CLK PA5 //LE
void setup() {
// put your setup code here, to run once:
pinMode(DIO, OUTPUT);
pinMode(S_CLK, OUTPUT);
pinMode(R_CLK, OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
//ROW 0x80 , COL 0xfe
unsigned char i, dat;//i循环次数 dat需要发送的数据
dat = 0xfe;//发送列值
for(i=0; i<8; i++)//循环8次
{
//S_CLK = 0;//拉低移位寄存器时钟
//R_CLK = 0;//拉低输出锁存器时钟
digitalWrite(S_CLK, LOW);
digitalWrite(R_CLK, LOW);
if(dat & 0x01)//发送1
{ //DIO = 1;
digitalWrite(DIO, HIGH);
}
else //发送0
{ //DIO = 0;
digitalWrite(DIO, LOW);
}
//S_CLK = 1;//拉高移位寄存器时钟,数据移位
digitalWrite(S_CLK, HIGH);
dat >>= 1;//数据右移
}
dat = 0x80;//发送行值
for(i=0; i<8; i++)//循环8次
{
//S_CLK = 0;//拉低移位寄存器时钟
//R_CLK = 0;//拉低输出锁存器时钟
digitalWrite(S_CLK, LOW);
digitalWrite(R_CLK, LOW);
if(dat & 0x01)//发送1
{ //DIO = 1;
digitalWrite(DIO, HIGH);
}
else //发送0
{ //DIO = 0;
digitalWrite(DIO, LOW);
}
//S_CLK = 1;//拉高移位寄存器时钟,数据移位
digitalWrite(S_CLK, HIGH);
dat >>= 1;//数据右移
}
//R_CLK = 1;//拉高输出锁存器时钟,并行输出数据
digitalWrite(R_CLK, HIGH);
}
这样灯就亮了。
有疑问下方留言。