前面我们已经做过了针脚LED点阵的小实验,但针脚LED接线太多,让人感觉很乱,现在我们用MAX7219来驱动8X8LED点阵,只需要5根线就能控制原来需要16根线的8x8点阵。
零知标准板(点击购买)
MAX7219 LED点阵(点击购买)
面包板+若干跳线(点击购买)
MAX7219 LED点阵上的CLK,CS,DIN脚分别连接零知标准板的11,12,13号引脚,VCC接标准板的5V,GND接标准板的GND
实物连线如图所示:
/**********************************************************
* 文件: heart.ino by 零知实验室([url=http://www.lingzhilab.com]www.lingzhilab.com[/url])
* -^^- 零知开源,让电子制作变得更简单! -^^-
* 时间: 2019/07/23 15:47
* 说明:
************************************************************/
int CLK = 11;
int CS = 12;
int DIN = 13; //这里定义了那三个脚
unsigned char disp1[6][8]={
{0x20,0x20,0x20,0x20,0x20,0x20,0x3C,0x00},//L 这里的0x表示十六进制,将其转换成二进制,其中的1即组成想要的图案
{0x3C,0x42,0x42,0x42,0x42,0x42,0x3C,0x00},//O 例如L: 0x20 0 0 1 0 0 0 0 0
//{0x00,0x00,0x18,0x24,0x24,0x24,0x18,0x00},//o 0x20 0 0 1 0 0 0 0 0
{0x42,0x42,0x42,0x42,0x42,0x24,0x18,0x00},//V 0x20 0 0 1 0 0 0 0 0
//{0x00,0x00,0x00,0x24,0x24,0x24,0x18,0x00},//v 0x20 0 0 1 0 0 0 0 0
{0x3C,0x20,0x20,0x3C,0x20,0x20,0x3C,0x00},//E 0x20 0 0 1 0 0 0 0 0
//{0x00,0x00,0x18,0x24,0x38,0x20,0x18,0x00},//e 0x20 0 0 1 0 0 0 0 0
{0x00,0x24,0x7E,0x7E,0x3C,0x18,0x00,0x00},//小❤ 0x3c 0 0 1 1 1 1 0 0
// 0x00 0 0 0 0 0 0 0 0
{0x66,0xFF,0xFF,0xFF,0x7E,0x3C,0x18,0x00} //大❤
};
void setup() {
// put your setup code here, to run once:
pinMode(CLK,OUTPUT);
pinMode(CS,OUTPUT);
pinMode(DIN,OUTPUT); //让三个脚都是输出状态
Init_MAX7219();
}
unsigned char i,j;
void displayHeart(int time)
{
for(j=4;j<6;j++)
{
for(i=1;i<9;i++)
Write_Max7219(i,disp1[j][i-1]);
delay(time);
}
}
void loop() {
for(j=0;j<4;j++) //显示LOVE
{
for(i=1;i<9;i++)
Write_Max7219(i,disp1[j][i-1]);
delay(800);
}
int x=0;
while(x++<4) //显示心形
{
displayHeart(150);
displayHeart(100);
displayHeart(150);
displayHeart(300);
}
}
void Write_Max7219_byte(unsigned char DATA)
{
unsigned char i;
digitalWrite(CS,LOW);
for(i=8;i>=1;i--)
{
digitalWrite(CLK,LOW);
if(DATA&0X80)
digitalWrite(DIN,HIGH);
else
digitalWrite(DIN,LOW);
DATA<<=1;
digitalWrite(CLK,HIGH);
}
}
void Write_Max7219(unsigned char address,unsigned char dat)
{
digitalWrite(CS,LOW);
Write_Max7219_byte(address); //写入地址,即数码管编号
Write_Max7219_byte(dat); //写入数据,即数码管显示数字
digitalWrite(CS,HIGH);
}
void Init_MAX7219(void)
{
Write_Max7219(0x09, 0x00); //译码方式:BCD码
Write_Max7219(0x0a, 0x03); //亮度
Write_Max7219(0x0b, 0x07); //扫描界限,4个数码管显示
Write_Max7219(0x0c, 0x01); //掉电模式:0,普通模式:1
Write_Max7219(0x0f, 0x00); //显示测试:1,测试结束,正常显示:0
}
然后验证,上传到零知标准板上
四、效果展示
上面步骤成功完成后,我们就可以看到预期的结果了(这里因为录制动图的原因,帧率略低)