本文主要介紹了max7219與arduino驅動設計例程。重點介紹了Arduino Uno 使用MAX7219驅動單個8*8點陣LED模塊;WeMos D1制作的MAX7219八位數碼管實時時鐘以及Arduino和Max7219Led點陣模塊制作一個屬于你的表白神器。誰說理工男不懂浪漫?這才是浪漫的正確打開方式。
實例一:Arduino Uno 使用MAX7219驅動單個8*8點陣LED模塊3
只占用3個IO口,就可以控制8*8點陣的顯示,非常實用,簡單。
問題注意:
① 接線的時候,注意方向,在IN的方向接線(輸入)
② LED的方向也要注意,如果顯示不正常,請轉變下安插的方向。
實驗效果
接線方式
在IN方向的針腳
Arduino Uno --- MAX7219
5V 《---》 VCC
GND 《---》 GND
12 《---》 DIN
11 《---》 CS
10 《---》 CLK
程序:
#include 《LedControl.h》
int DIN = 12;
int CS = 11;
int CLK = 10;
byte e[8]= {0x7C,0x7C,0x60,0x7C,0x7C,0x60,0x7C,0x7C}; //E
byte d[8]= {0x78,0x7C,0x66,0x66,0x66,0x66,0x7C,0x78}; //D
byte u[8]= {0x66,0x66,0x66,0x66,0x66,0x66,0x7E,0x7E}; //U
byte c[8]= {0x7E,0x7E,0x60,0x60,0x60,0x60,0x7E,0x7E}; //C
byte eight[8]= {0x7E,0x7E,0x66,0x7E,0x7E,0x66,0x7E,0x7E}; //8
byte s[8]= {0x7E,0x7C,0x60,0x7C,0x3E,0x06,0x3E,0x7E}; //S
byte dot[8]= {0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18}; //。
byte o[8]= {0x7E,0x7E,0x66,0x66,0x66,0x66,0x7E,0x7E}; //O
byte m[8]= {0xE7,0xFF,0xFF,0xDB,0xDB,0xDB,0xC3,0xC3}; //M
LedControl lc=LedControl(DIN,CLK,CS,4);
void setup(){
lc.shutdown(0,false); //啟動時,MAX72XX處于省電模式
lc.setIntensity(0,8); //將亮度設置為最大值
lc.clearDisplay(0); //清除顯示
}
void loop(){
byte smile[8]= {0x3C,0x42,0xA5,0x81,0xA5,0x99,0x42,0x3C};//笑臉
byte neutral[8]= {0x3C,0x42,0xA5,0x81,0xBD,0x81,0x42,0x3C};//標準臉
printByte(eight);//顯示8
delay(1000);//延時1秒
printByte(neutral);//顯示標準臉
delay(1000);
}
//點陣顯示函數
void printByte(byte character [])
{
int i = 0;
for(i=0;i《8;i++)
{
lc.setRow(0,i,character[i]);
}
}
實例二 :WeMos D1制作的MAX7219八位數碼管實時時鐘
這是一片ESP8266開發板,直接能連Wifi,這個測試項目是通過WIFI連接時間服務器,然后在八位數碼管顯示實時時間,開機初始化時會顯示“Arduino”。開發板選WeMos D1(Retired),如圖。
開機顯示Arduino
顯示實時時間
#include 《LedControl.h》
#include《ESP8266WiFi.h》
#include《ESP8266WiFiMulti.h》
#include 《time.h》
#define timezone 8
const char* ssid = “TP-LINK_****”; //Wifi名稱
const char* password = “********”; //Wifi密碼
unsigned long MS_TIMER = 0;
unsigned long timer,lasttime=0;
char *time_str;
char H1,H2,M1,M2,S1,S2;
LedControl lc=LedControl(D12,D11,D10,1); // D12 -》DIN,D11-》CLK,D10-》CS,1片MAX7219
void WriteArduino() {
lc.setChar(0,7,‘a’,false);
lc.setRow(0,6,0x05);
lc.setChar(0,5,‘d’,false);
lc.setRow(0,4,0x1c);
lc.setRow(0,3,B00010000);
lc.setRow(0,2,0x15);
lc.setRow(0,1,0x1D);
}
void DispTime(){
lc.setChar(0,7,H1,false);
lc.setChar(0,6,H2,false);
lc.setRow(0,5,B00000001); //橫線
lc.setChar(0,4,M1,false);
lc.setChar(0,3,M2,false);
lc.setRow(0,2,B00000001); //橫線
lc.setChar(0,1,S1,false);
lc.setChar(0,0,S2,false);
}
void setup() {
delay(50);
Serial.begin(115200);
lc.shutdown(0,false); //屏初始化
lc.setIntensity(0,15); //亮度(0~15)
lc.clearDisplay(0); //清屏
WriteArduino(); //屏顯“Arduino”
WiFi.disconnect();
WiFi.mode(WIFI_STA);//設置模式為STA
Serial.print(“Is connection routing, please wait”);
WiFi.begin(ssid, password); //Wifi接入到網絡
Serial.println(“\nConnecting to WiFi”);
//如果Wifi狀態不是WL_CONNECTED,則表示連接失敗
while (WiFi.status() != WL_CONNECTED) {
Serial.print(“。”);
delay(1000); //延時等待接入網絡
}
//設置時間格式以及時間服務器的網址
configTime(timezone * 3600, 0, “pool.ntp.org”, “time.nist.gov”);
Serial.println(“\nWaiting for time”);
while (!time(nullptr)) {
Serial.print(“。”);
delay(1000);
}
Serial.println(“”);
}
void loop() {
timer = millis();
if ((timer - lasttime)》=1000){
time_t now = time(nullptr); //獲取當前時間
time_str = ctime(&now);
H1 = time_str[11];
H2 = time_str[12];
M1 = time_str[14];
M2 = time_str[15];
S1 = time_str[17];
S2 = time_str[18];
Serial.printf(“%s%c%c:%c%c:%c%c\n”,time_str,H1,H2,M1,M2,S1,S2);
DispTime();
lasttime = timer;
}
}
實例三:Arduino和Max7219Led點陣模塊制作一個屬于你的表白神器
前三行的代碼要根據你自己的arduino版的Max7219的引腳來定的,這三個引腳是自定義的。
以下是Ascii碼對照表,大家可以根據這個表來設計你喜歡的圖案和文字
下面給大家看效果圖:
程序:
int CLK = 2;
int CS = 1;
int DIN = 0; //這里定義了那三個腳
unsigned char disp1[38][8]={
{0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7E},//L
{0x3C,0x42,0x42,0x42,0x42,0x42,0x42,0x3C},//O
{0x42,0x42,0x42,0x42,0x42,0x24,0x18,0x18},//V
{0x7E,0x40,0x40,0x7E,0x40,0x40,0x40,0x7E},//E
{0x66,0xFF,0xFF,0xFF,0xFF,0x7E,0x3C,0x18},//TX
};
void Delay(double x)
{
double i;
for(i=0;i《x;i++);
}
void setup() {
// put your setup code here, to run once:
pinMode(CLK,OUTPUT);
pinMode(CS,OUTPUT);
pinMode(DIN,OUTPUT); //讓三個腳都是輸出狀態
}
void loop() {
// put your main code here, to run repeatedly:
unsigned char i,j;
Delay_xms(50);
Init_MAX7219();
while(1)
{
for(j=0;j《38;j++)
{
for(i=1;i《9;i++)
Write_Max7219(i,disp1[j][i-1]);
Delay(80000);
}
}
}
void Delay_xms(unsigned int x)
{
unsigned int i,j;
for(i=0;i《x;i++)
for(j=0;j《112;j++);
}
//--------------------------------------------
//功能:向MAX7219(U3)寫入字節
//入口參數:DATA
//出口參數:無
//說明:
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);
}
}
//-------------------------------------------
//功能:向MAX7219寫入數據
//入口參數:address、dat
//出口參數:無
//說明:
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
}
評論