前面介绍过在pcDuino上运行LED Matrix Kit,这个套件中有MAX7219芯片,它是串行输入/输出共阴极数码管显示驱动芯片,它的操作很简单,MCU只需通过模拟SPI三线接口就可以将相关的指令写入MAX7219的内部指令和数据寄存器,而且它还支持多片7219串联,即可以通过3根线控制更多的数码管显示。
封装引脚图:
在Arduino下级联三片LED Matrix 点阵屏
CLK –> arduino D8
CS –> arduino D9
DIN –> arduino D10
每片LED显示频率在驱动程序里可以设置,程序代码如下
#define uchar unsigned char
int Max7219_CLK = 8;
int Max7219_CS = 9;
int Max7219_DIN = 10;
uchar num[16][8] = {
{0x1C,0x22,0x22,0x22,0x22,0x22,0x22,0x1C},//0
{0x08,0x18,0x28,0x08,0x08,0x08,0x08,0x3E},//1
{0x3E,0x02,0x02,0x3E,0x20,0x20,0x20,0x3E},//2
{0x3E,0x02,0x02,0x3E,0x02,0x02,0x02,0x3E},//3
{0x0C,0x14,0x24,0x3E,0x04,0x04,0x04,0x04},//4
{0x3E,0x20,0x20,0x3E,0x02,0x02,0x02,0x3E},//5
{0x3E,0x20,0x20,0x3E,0x22,0x22,0x22,0x3E},//6
{0x3E,0x02,0x04,0x08,0x08,0x08,0x08,0x08},//7
{0x1C,0x22,0x22,0x1C,0x22,0x22,0x22,0x1C},//8
{0x3E,0x22,0x22,0x3E,0x02,0x02,0x02,0x3E},//9
{0x08,0x14,0x22,0x22,0x3E,0x22,0x22,0x22},//A
{0x3C,0x22,0x22,0x3C,0x22,0x22,0x22,0x3C},//B
{0x1C,0x22,0x20,0x20,0x20,0x20,0x22,0x1C},//C
{0x38,0x24,0x22,0x22,0x22,0x22,0x24,0x38},//D
{0x3E,0x20,0x20,0x3E,0x20,0x20,0x20,0x3E},//E
{0x3E,0x20,0x20,0x3E,0x20,0x20,0x20,0x20},//F
};
void write_byte(uchar DATA)
{
uchar i;
digitalWrite(Max7219_CS,LOW);
for(i=8;i>=1;i--)
{
digitalWrite(Max7219_CLK,LOW);
digitalWrite(Max7219_DIN,DATA&0x80);//提取Data的高一位数据 DATA = DATA<<1;
digitalWrite(Max7219_CLK,HIGH);
}
}
void write_first(uchar address,uchar dat)
{
digitalWrite(Max7219_CS,LOW);
write_byte(address); //写入地址,即数码管编号 write_byte(dat); //写入数据,即数码管显示数字 digitalWrite(Max7219_CS,HIGH);
}
void write_second(char address,char dat)
{
digitalWrite(Max7219_CS,LOW);
write_byte(address); //写入地址,即数码管编号 write_byte(dat); //写入数据,即数码管显示数字 write_byte(0);
write_byte(0);
digitalWrite(Max7219_CS,HIGH);
}
void write_third(char address,char dat)
{
digitalWrite(Max7219_CS,LOW);
write_byte(address); //写入地址,即数码管编号 write_byte(dat); //写入数据,即数码管显示数字 write_byte(0);
write_byte(0);
write_byte(0);
write_byte(0);
digitalWrite(Max7219_CS,HIGH);
}
void max7219_init(void)
{
write_first(0x09, 0x00); //译码方式:BCD码 write_first(0x0a, 0x03); //亮度 write_first(0x0b, 0x07); //扫描界限;8个数码管显示 write_first(0x0c, 0x01); //掉电模式:0,普通模式:1 write_first(0x0f, 0x00); //显示测试:1;测试结束,正常显示:0 write_second(0x09, 0x00); //译码方式:BCD码 write_second(0x0a, 0x03); //亮度 write_second(0x0b, 0x07); //扫描界限;8个数码管显示 write_second(0x0c, 0x01); //掉电模式:0,普通模式:1 write_second(0x0f, 0x00); //显示测试:1;测试结束,正常显示:0 write_third(0x09, 0x00); //译码方式:BCD码 write_third(0x0a, 0x03); //亮度 write_third(0x0b, 0x07); //扫描界限;8个数码管显示 write_third(0x0c, 0x01); //掉电模式:0,普通模式:1 write_third(0x0f, 0x00); //显示测试:1;测试结束,正常显示:0 }
void setup()
{
pinMode(Max7219_CLK,OUTPUT);
pinMode(Max7219_CS,OUTPUT);
pinMode(Max7219_DIN,OUTPUT);
max7219_init();
}
void loop()
{
uchar i,count;
while(1)
{
for(i=1;i<9;i++)
{
write_first(i,num[count/100][i-1]);
write_second(i,num[count%100/10][i-1]);
write_third(i,num[count%10][i-1]);
}
delay(200);
count++;
}
}