点阵结构
对于判断共阴极或者共阳极的判断通过第一个二极管的方向的来判断,
如果ROW连接的是二极管正极则为共阳极,
反之则为共阴极。
对于点阵控制,由于二极管的特性是单向导通,
所以如果是共阳极,则ROW9因设为高电平,COL13因设为低电平,此时第一个灯珠会亮;
如果是共阴极则正好相反,ROW9因设为低电平,COL13因设为高电平,此时第一个灯珠会亮;
不使用芯片控制
如果不使用类似7219之类的芯片,则需要16个引脚,
由于Arduino数字引脚只有13个,所以需要借用模拟端口A0-A3
byte bigHeart[] = {
B01100110,
B01111110,
B11111111,
B11111111,
B01111110,
B00111100,
B00011000,
B00000000};
byte smallHeart[]={
B00000000,
B00000000,
B00010100,
B00111110,
B00111110,
B00011100,
B00001000,
B00000000};
byte shizi[]={
B00000000,
B00011000,
B00011000,
B01111110,
B01111110,
B00011000,
B00011000,
B00000000};
const int columnPins[] = {2,3,4,5,6,7,8,9};
const int rowPins[] = {10,11,12,13,14,15,16,17,18,19};
void setup() {
// put your setup code here, to run once:
for(int i=0;i<8;i++){
//所有LED都设为输出
pinMode(rowPins[i], OUTPUT);
pinMode(columnPins[i], OUTPUT);
//共阳极将row设为高电平,共阳极将col设为高电平
digitalWrite(columnPins[i],HIGH);
}
}
void loop() {
//两个心跳之间的毫秒数
int pulseDelay=800;
//显示小心脏
show(smallHeart,80);
//显示大心脏
show(bigHeart,160);
//显示十字
show(shizi,240);
//心跳之间不显示(清除余辉效应)
delay(pulseDelay);
}
//逐行扫描
void show(byte*image,unsigned long duration){
unsigned long start = millis(); //开始计时动画
while(start + duration > millis()) //循环直到持续实际结束
{
for(int row=0;row<8;row++){
digitalWrite(rowPins[row],HIGH); //连接行至5V 共阳极时columnPins
for(int column = 0;column<8;column++){
boolean pixel = bitRead(image[row],column);
if(pixel==1){
digitalWrite(columnPins[column],LOW); //将列接地 共阳极时rowPins
}
delayMicroseconds(300);//为每个LED设置延时
digitalWrite(columnPins[column],HIGH); //断开列接地 共阳极时rowPins
}
digitalWrite(rowPins[row],LOW); //断开LED 共阳极时columnPins
}
}
}
MAX7219
MAX7219 引脚 | Arduino 引脚 |
GND | GND |
VCC | VCC |
DIN | 11 |
CS | 10 |
CLK | 13 |
MAX7219是串行输入输出 共阴极 显示驱动器
需要使用 LedControl 库
#include 《LedControl.h》
int DIN = 11;
int CS = 10;
int CLK = 13;
//上箭头 2进制
byte FrontBIN[8] = {B00001000,
B10011101,
B00111110,
B01111111,
B00011100,
B00011100,
B00011100,
B00011100};
//下箭头 16进制
byte back[8] = {0x1c, 0x1c, 0x1c, 0x1c, 0x7f, 0x3e, 0x1c, 0x08};
LedControl lc = LedControl(DIN, CLK, CS, 0);//新建一个类对象
void setup()
{
lc.shutdown(0, false); //初始化时设置点阵为正常使用模式
lc.setIntensity(0, 1); //设置亮度值,范围0~15
lc.clearDisplay(0); //点阵清屏
}
void loop()
{
//显示图像
printByte(FrontBIN);
delay(2000);
printByte(back);
delay(2000);
}
void printByte(byte character [])
{
int i = 0;
for (i = 0; i < 8; i++)
{
lc.setRow(0, i, character[i]);//设置点阵单行8个LED状态
}
}
正文完