编程实验
本文主要介绍了max7219与arduino驱动设计例程。重点介绍了Arduino Uno 使用MAX7219驱动单个8*8点阵LED模块;WeMos D1制作的MAX7219八位数码管实时时钟以及Arduino和Max7219Led点阵模块制作一个属于你的表白神器。谁说理工男不懂浪漫?这才是浪漫的正确打开方式。
只占用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]);
}
}
这是一片ESP8266开发板,直接能连Wifi,这个测试项目是通过WIFI连接时间服务器,然后在八位数码管显示实时时间,开机初始化时会显示“Arduino”。开发板选WeMos D1(Retired),如图。
#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版的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
}
全部0条评论
快来发表一下你的评论吧 !