MAX7219芯片驱动基于51内核
MAX7219芯片驱动基于51内核
·
目录
MAX7219驱动函数模块(当前为级联的驱动,单片也可以使用)
(SPI协议)引脚定义:

DIN:数据传输引脚
CLK:时钟线引脚
LOAD(CS):也就是片选
BIG1-BIG8位选引脚
SEGA1-DP是数据引脚
示例测试电路是3块8x8的点阵级联显示
数据传输方式:
CS:拉低0
CLK:拉低
DIN:放入数据
CLK:拉高
(循环15次后)
CS:拉高
即完成一次传输
数据组成:
| NE | NE | NE | NE | D3 | D2 | D1 | D0 | DP | A | B | C | D | E | F | G |
由16位数据组成,前4位为无效位,后4位表示芯片各功能的寄存器地址,后8位为数据位
注意:在不使用BCD码解码工作方式时,数据位并不是A-DP而是DP然后A到G,所以需要进行循环移位后进行传输!
单片数据传输示例程序:
MAX7219驱动函数模块(当前为级联的驱动,单片也可以使用)
#include <REGX52.H>
/*功能寄存器定义*/
#define DECODE_MODE 0x09 //解码模式
#define INTENSITY 0x0A //亮度
#define SCAN_LIMIT 0x0B //扫描位数
#define SHUT_DOWN 0x0C //工作模式
#define DISPLAY_TEST 0x0F //显示器自检
/*位选寄存器地址定义*/
#define D_1 0x01
#define D_2 0x02
#define D_3 0x03
#define D_4 0x04
#define D_5 0x05
#define D_6 0x06
#define D_7 0x07
#define D_8 0x08
/*控制端口定义*/
sbit DIN=P1^0;
sbit CLK=P1^1;
sbit LOAD1=P1^2;
sbit LOAD2=P1^3;
sbit LOAD3=P1^4;
/**----------------------------------------------------------------------------------------------
* @brief 数据二进制循环移位数据
* @param biter 要转换的数据
* @retval dier 转换好的数据8位
---------------------------------------------------------------------------------*/
unsigned char biter_zuo(unsigned char biter)
{
static unsigned char diyi,dier;
diyi = biter << 7;
dier = biter >> 1;
dier = dier | diyi;
return dier;
}
/**----------------------------------------------------------------------------------------------
* @brief 基本函数,写入一个8位数据0xXX
* @param temp:写入的字节
* @retval 无
---------------------------------------------------------------------------------*/
void Max7219_Wbyte(unsigned char temp)
{
unsigned char i;
for (i=0;i<8;i++)
{
CLK = 0;
DIN = temp&(0x80>>i);
CLK = 1;
}
}
/**----------------------------------------------------------------------------------------------
* @brief 点阵驱动应用函数,可以将数据直接经过转换后正常显示
* @param pianxuan:片选 1-3
digit: 位选
Biters: 传的数据
* @retval 无
---------------------------------------------------------------------------------*/
void MAX7219_Digit(unsigned char pianxuan,digit,Biters)
{
Biters = biter_zuo(Biters);
if(pianxuan == 1)
{
LOAD1=0;
Max7219_Wbyte(digit);
Max7219_Wbyte(Biters);
LOAD1=1;
}
if(pianxuan == 2)
{
LOAD2=0;
Max7219_Wbyte(digit);
Max7219_Wbyte(Biters);
LOAD2=1;
}
if(pianxuan == 3)
{
LOAD3=0;
Max7219_Wbyte(digit);
Max7219_Wbyte(Biters);
LOAD3=1;
}
}
/**----------------------------------------------------------------------------------------------
* @brief 调试函数,传输原地址,数据
* @param pianxuan:片选,选择要写入的芯片序号1-3
digit: 功能命令地址
Biters: 要传的数据
* @retval 无
---------------------------------------------------------------------------------*/
void MAX7219_WInit(unsigned char pianxuan,digit,Biters)
{
if(pianxuan == 1)
{
LOAD1 = 0;
Max7219_Wbyte(digit);
Max7219_Wbyte(Biters);
LOAD1 = 1;
}
if(pianxuan == 2)
{
LOAD2 = 0;
Max7219_Wbyte(digit);
Max7219_Wbyte(Biters);
LOAD2 = 1;
}
if(pianxuan == 3)
{
LOAD3 = 0;
Max7219_Wbyte(digit);
Max7219_Wbyte(Biters);
LOAD3 = 1;
}
}
/**----------------------------------------------------------------------------------------------
* @brief MAX7219初始化
* @param 无
* @retval 无
---------------------------------------------------------------------------------*/
void MAX7019_Init(void)
{
DIN = 1;
CLK = 1;
LOAD1 = 1;
LOAD2 = 1;
LOAD3 = 1;
MAX7219_WInit(1,SHUT_DOWN, 0x01); //正常运行:0xx1 关机模式:0xx0
MAX7219_WInit(1,DISPLAY_TEST, 0x00); //正常运行:0xx0 显示测试模式:
MAX7219_WInit(1,DECODE_MODE, 0x00); //解码模式选择 BOS码
MAX7219_WInit(1,SCAN_LIMIT, 0x07); //扫描限制:0~7 0xX0~0xX7
MAX7219_WInit(1,INTENSITY, 0x03); //亮度选择0xX0~0xXF
MAX7219_WInit(2,SHUT_DOWN, 0x01); //正常运行:0xx1 关机模式:0xx0
MAX7219_WInit(2,DISPLAY_TEST, 0x00); //正常运行:0xx0 显示测试模式:
MAX7219_WInit(2,DECODE_MODE, 0x00); //解码模式选择 BOS码
MAX7219_WInit(2,SCAN_LIMIT, 0x07); //扫描限制:0~7 0xX0~0xX7
MAX7219_WInit(2,INTENSITY, 0x03); //亮度选择0xX0~0xXF
MAX7219_WInit(3,SHUT_DOWN, 0x01); //正常运行:0xx1 关机模式:0xx0
MAX7219_WInit(3,DISPLAY_TEST, 0x00); //正常运行:0xx0 显示测试模式:
MAX7219_WInit(3,DECODE_MODE, 0x00); //解码模式选择 BOS码
MAX7219_WInit(3,SCAN_LIMIT, 0x07); //扫描限制:0~7 0xX0~0xX7
MAX7219_WInit(3,INTENSITY, 0x03); //亮度选择0xX0~0xXF
}
MAX7219运行函数:
#include <REGX52.H>
#include "Delay.h"
#include "MAX7219.h"
unsigned char gImage_A[] = {0x07,0x1F,0x74,0xF4,0xF4,0x7C,0x1F,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
unsigned char gImage_B[8] = {0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00};
unsigned char gImage_C[8] = {0x08,0x3C,0xFE,0xFF,0xFF,0xFE,0x3C,0x08};
unsigned char i;
void main()
{
MAX7019_Init();
while(1)
{
for (i=0;i<8;i++)
{
MAX7219_Digit(1,i+1,gImage_A[i]);
}
Delay(30);
for (i=0;i<8;i++)
{
MAX7219_Digit(1,i+1,gImage_A[i+1]);
}
Delay(30);
for (i=0;i<8;i++)
{
MAX7219_Digit(1,i+1,gImage_A[i+2]);
}
Delay(30);
for (i=0;i<8;i++)
{
MAX7219_Digit(1,i+1,gImage_A[i+3]);
}
Delay(30);
for (i=0;i<8;i++)
{
MAX7219_Digit(1,i+1,gImage_A[i+4]);
}
Delay(30);
for (i=0;i<8;i++)
{
MAX7219_Digit(1,i+1,gImage_A[i+5]);
}
Delay(30);
for (i=0;i<8;i++)
{
MAX7219_Digit(1,i+1,gImage_A[i+6]);
}
Delay(30);
for (i=0;i<8;i++)
{
MAX7219_Digit(1,i+1,gImage_A[i+7]);
}
Delay(30);
}
}
仿真图:

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)