MAX7219基本驱动程序
点阵屏驱动程序(MAX7219)
Write_Max7219_byte(0);
Write_Max7219_byte(0);
Max7219_pinCS=1;
Write_Max7219(0,0); //清除缓冲区数据,消除显示误差
}
}
void Display_4(uchar dat)
{
uchar i;
{0x00,0x70,0x88,0x80,0x80,0x80,0x88,0x70},//C16
};
//--------------------------------------------
//功能:向MAX7219(U3)写入字节
//入口参数:DATA
//出口参数:无
//说明:
void Write_Max7219_byte(uchar DATA)
Write_Max7219_byte(0);
Write_Max7219_byte(0);
Write_Max7219_byte(0);
Write_Max7219_byte(0);
Write_Max7219_byte(0);
Max7219_pinCS=1;
Write_Max7219(0,0); //清除缓冲区数据,消除显示误差
Write_Max7219(7,0);//清除缓冲区数据,消除显示误差
Write_Max7219(8,0);//清除缓冲区数据,消除显示误差
}
/***************************************************/
void Display_1(uchar dat)
{
Write_Max7219_byte(0);
MAX7219
多功能LED译码显示驱动IC PS7219 1 引言PS7219是由力源公司自行研制、开发的一款新型多功能8位LED显示驱动IC。
接口采用三线SPI方式,用户只需简单修改内部相关的控制或数字RAM,便可很容易地实现多位LED显示。
在性能上PS7219与MAXIM 公司的MAX7219完全兼容,并增加了位闪等功能。
PS7219具有多个级联特性,为大屏幕LED显示提供了方便。
在理论上,只需三根用户I/O口控制线,便可以实现无穷多的LED级联显示。
在实际应用中,已实现了149片PS7219级联,可以控制1192位LED 显示。
2 PS7219特点与引脚说明PS7219的特点:★ 串行接口(16位控制字);★ 8位共阴级LED显示驱动;★ 显示位数1~8,可数字调节;★ 按位进行BCD译码/不译码数字制;★ 16级亮度数字控制;★ 上电LED全熄;★ 提供位闪功能;★ 多个PS7219级联可实现任意多的LED显示;★ 宽24脚双列直插模块封装。
PS7219引脚图如图1所示。
引脚功能说明见表1。
3 PS7219内部结构如图2 所示,PS7219由六部分组成。
图2 PS7219内部组成框图图1 PS7219引脚排列3.1 串行输入缓冲部分主要功能是与外部控制信号接口,将控制命令串行读入,并进行串并转换,供控制器读取。
3.2 控制器是整个IC的核心部分。
它先将输入缓冲部分的控制字读入处理,根据其地址值送到相应的控制RAM或数字RAM,同时将数据送入串行同步输出部分,以便在下一个控制字输入周期,将其串行输出。
3.3 控制RAM数据RAM这两部分一起控制LED译码显示部分,实现不同功能及字符的显示。
控制RAM包括:空操作寄存器,译码模式控制寄存器,亮度控制寄存器,掉电控制寄存器,闪烁控制寄存器,测试控制寄存器和扫描界线寄存器。
数据RAM包括:数据1—8寄存器。
3.4 LED译码显示根据控制RAM和数据RAM的不同值,来实现相应的显示功能。
MAX7219单片以及级联驱动程序
MAX7219单片以及级联驱动程序2011-03-20 09:40说明一下:这个word版式是从百度上下载的,在原版中,作者只是写了驱动一片MAX7219的程序。
本人作为菜鸟,第一次使用MAX7219就用了两片级联来驱动15个数码管,按照原版程序驱动一片MAX7219是没有问题的,但是,驱动两片MAX7219就不行了。
自己先认真看了MAX7219的DataSsheet,因为英语是个二把刀,看的迷迷糊糊,似懂非懂(可见英语还是很重要的),又在网上搜索也没发现有正确的程序(都是有点儿问题,上网贴出来请教各位大虾的),没办法只能自力更生了,终于调出来了。
将原版增删修改,传上来共享,希望对以后某位菜鸟第一次使用MAX7219时有所帮助啦,嘿嘿!/**************************************************************** *常用符号定义******************************************************************/#define uchar unsigned char/**************************************************************** *定义MAX7219寄存器******************************************************************/#define REG_NO_OP 0x00 //定义空操作register#define DIG_1 0x01 // 定义数码管1 register#define DIG_2 0x02 // 定义数码管2 register#define DIG_3 0x03 // 定义数码管3 register#define DIG_4 0x04 // 定义数码管4 register#define DIG_5 0x05 // 定义数码管5 register#define DIG_6 0x06 // 定义数码管6 register#define DIG_7 0x07 // 定义数码管7 register#define DIG_8 0x08 // 定义数码管8 register#define REG_DECODE 0x09 // 定义解码控制register#define REG_INTENSITY 0x0a // 定义显示亮度register#define REG_SCAN_LIMIT 0x0b // 定义扫描限制register#define REG_SHUTDOWN 0x0c // 定义"shutdown"模式register#define REG_DISPLAY_TEST 0x0f // 定义"display test"模式register#define INTENSITY_MIN 0x00 // 定义最低显示亮度#define INTENSITY_MAX 0x0f // 定义最高显示亮度/****************************************************************** * 定义硬件引脚连接******************************************************************/#define DATA P2^3; //定义P3_5连接MAX7219 DATA引脚#define CLK P2^5; //定义P3_4连接MAX7219 CLK 引脚#define CS P2^4; //定义P3_3连接MAX7219 CS 引脚/***************************************************************** * 共阴极七段数码管显示对应段查询表(数字0-9分别对应code_table[0]-[9])***********************************************************/uchar code code_table[10]={0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b}; /*采用数组*//****************************************************************** * MAX7219_Send()描述: 向MAX7219传送一字节数据Arguments : dataout = data to sendReturns : none******************************************************************/ void send (uchar datain){char I,temp;for (i=8; i>0; i--){CLK=0; // CLK 置低temp=datain&0x80;if (temp==0x80) // 判断并输出一位DATA=1; // 输出"1"else // 或DATA=0; // 输出"0"datain<<=1; //datain左移位,以便再次与0x80按位与CLK=1; // CLK 置高}}/**************************************************************** * MAX7219_Write()/MAX7219_Write_1()描述: 向 MAX7219 写命令Arguments : reg_number = register to write todataout = data to write to MAX7219Returns : none************************************************************** */ void MAX7219_Write (uchar add1, uchar dat1) //向第一片MAX7219写数据{CS=0; // CS置低选通MAX7219send(add1); // 写register number 到MAX7219send(dat1); // 写data 到MAX7219CS=1; // 利用CS上升沿锁存以上移位进输入的16位数据}void MAX7219_Write_1(uchar add2,uchar dat2) //向第二片MAX7219写数据{CS=0;sent(add2);sent(dat2);CLK=1; // 第16.5个时钟周期,数据从第一片MAX7219的DOUT端开始输出sent(REG_NO_OP); //对第一片MAX7219进行空操作,sent(0x00);CS=1;}/******************************************************************** MAX7219_DisplayChar()描述: 使某一位显示一个数字Arguments : digit = digit number (0-7)character = character to display (0-9, A-Z)Returns : none****************************************************************/void MAX7219_DisplayChar (char digit, char character){MAX7219_Write(digit, character);}PS:这个函数可以不要,直接调用写数据函数就可以了(原版)/******************************************************************** MAX7219_Clear()/MAX7219_clear_1()描述: 清除所有位的显示Arguments : noneReturns : none*****************************************************************/ void MAX7219_Clear (){uchar i;for (i=0; i < 8; i++)MAX7219_Write(i, 0x00); // 清除第一片MAX7219所有位的显示}void MAX7219_Clear_1(){uchar i;for(i=1;i<=8;i++)MAX7219_Write_1(i,0x00); //清除第二片MAX7219所有位的显示}PS:可以两片一起清楚数据,但建议分开较好。
MAX7219中文资料-附有程序
MAX7219是MAXIM公司生产的串行输入/输出共阴极数码管显示驱动芯片,一片MAX7219可驱动8个7段(包括小数点共8段)数字LED、LED条线图形显示器、或64个分立的LED发光二级管。
该芯片具有10MHz传输率的三线串行接口可与任何微处理器相连,只需一个外接电阻即可设置所有LED的段电流。
它的操作很简单,MCU只需通过模拟SPI三线接口就可以将相关的指令写入MAX721 9的内部指令和数据寄存器,同时它还允许用户选择多种译码方式和译码位。
此外它还支持多片7219串联方式,这样MCU就可以通过3根线(即串行数据线、串行时钟线和芯片选通线)控制更多的数码管显示。
MAX7219的外部引脚分配如图1所示及内部结构如图2所示。
图1 MAX7219的外部引脚分配图2 MAX7219的内部引脚分配各引脚的功能为:DIN:串行数据输入端DOUT:串行数据输出端,用于级连扩展LOAD:装载数据输入CLK:串行时钟输入DIG0~DIG7:8位LED位选线,从共阴极LED中吸入电流SEG A~SEG G DP 7段驱动和小数点驱动ISET:通过一个10k电阻和Vcc相连,设置段电流MAX7219有下列几组寄存器:(如图3)MAX7219内部的寄存器如图3,主要有:译码控制寄存器、亮度控制寄存器、扫描界限寄存器、关断模式寄存器、测试控制寄存器。
编程时只有正确操作这些寄存器,MAX7219才可工作。
图 3 MAX7219内部的相关寄存器分别介绍如下:(1)译码控制寄存器(X9H)如图4所示,MAX7219有两种译码方式:B译码方式和不译码方式。
当选择不译码时,8个数据为分别一一对应7个段和小数点位;B译码方式是BCD译码,直接送数据就可以显示。
实际应用中可以按位设置选择B译码或是不译码方式。
图4 MAX7219的译码控制寄存器(2)扫描界限寄存器(XBH)如图5所示,此寄存器用于设置显示的LED的个数(1~8),比如当设置为0xX4时,LED 0~5显示。
max7219驱动程序。doc
MAX7219驱动程序2007-04-27 10:21/***************************************************************** * 常用符号定义******************************************************************/#define uchar unsigned char/****************************************************************** * 定义MAX7219寄存器*******************************************************************/ #define REG_NO_OP 0x00 // 定义空操作 register #define DIG_1 0x01 // 定义数码管1 register #define DIG_2 0x02 // 定义数码管2 register #define DIG_3 0x03 // 定义数码管3 register #define DIG_4 0x04 // 定义数码管4 register #define DIG_5 0x05 // 定义数码管5 register #define DIG_6 0x06 // 定义数码管6 register #define DIG_7 0x07 // 定义数码管7 register#define DIG_8 0x08 // 定义数码管8 register #define REG_DECODE 0x09 // 定义解码控制 register #define REG_INTENSITY 0x0a // 定义显示亮度register #define REG_SCAN_LIMIT 0x0b // 定义扫描限制 register #define REG_SHUTDOWN 0x0c // 定义"shutdown"模式 register #defineREG_DISPLAY_TEST 0x0f // 定义"display test"模式 register #define INTENSITY_MIN 0x00 // 定义最低显示亮度 #define INTENSITY_MAX 0x0f // 定义最高显示亮度/******************************************************************** * * 定义硬件引脚连接********************************************************************* */ #define DATA P2^3; //定义P3_5连接MAX7219 DATA引脚 #define CLK P2^5; //定义P3_4连接MAX7219 CLK 引脚 #define CS P2^4; //定义P3_3连接MAX7219 CS 引脚(实际按7221设)/******************************************************************** *** * 共阴极七段数码管显示对应段查询表(数字0-9分别对应code_table[0]-[9])********************************************************************* **/ uchar code code_table[10]={0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b}; /*采用数组*//******************************************************************** *** * MAX7219_SendByte() * * 描述: 向MAX7219传送一字节数据 * Arguments : dataout = data to send * Returns : none********************************************************************* ****/ void MAX7219_SendByte (uchar dataout) { char i; for (i=8; i>0; i--) { uchar mask = 1 << (i - 1); // 设置掩码 CLK=0; // CLK 置低 if (dataout & mask) // 判断并输出一位 DATA=1; // 输出"1" else // 或 DATA=0; // "0" CLK=1; // CLK 置高 } }/******************************************************************** *** * MAX7219_Write() * * 描述: 向 MAX7219 写命令 * Arguments :reg_number = register to write to * dataout = data to write to MAX7219* Returns : none********************************************************************* ****** */ void MAX7219_Write (uchar reg_number, uchar dataout) { CS=0; // CS置低选通 MAX7219 MAX7219_SendByte(reg_number); // 写 register number 到 MAX7219 MAX7219_SendByte(dataout); // 写 data 到 MAX7219 CS=1; // 利用CS上升沿锁存以上移位进输入的16位数据 }/******************************************************************** ****** * MAX7219_DisplayChar() * * 描述: 使某一位显示一个数字 * Arguments : digit = digit number (0-7) * character = character to display (0-9, A-Z) * Returns : none********************************************************************* *****/ void MAX7219_DisplayChar (char digit, char character){ MAX7219_Write(digit, character); }/******************************************************************** ****** * MAX7219_Clear() * * 描述: 清除所有位的显示 * Arguments : none * Returns : none********************************************************************* ******/ void MAX7219_Clear (void) { uchar i; for (i=0; i < 8; i++) MAX7219_Write(i, 0x00); // 清除所有位的显示 }/******************************************************************** ****** * MAX7219_SetBrightness() * * 描述: 设置数码管显示亮度 * Arguments : brightness (0-15) * Returns : none********************************************************************* ******/ void MAX7219_SetBrightness (char brightness) { brightness &= 0x0f; // 屏蔽高位字节 MAX7219_Write(REG_INTENSITY, brightness); // 设置数码管显示亮度 }/******************************************************************** ****** * MAX7219_DisplayTestStart() * * 描述: 进入 test 模式 * Arguments : none * Returns : none********************************************************************* ******/ void MAX7219_DisplayTestStart (void){ MAX7219_Write(REG_DISPLAY_TEST, 1); // 置 MAX7219 为 test 模式 }/******************************************************************** ****** * MAX7219_DisplayTestStop() * * 描述: 退出 test 模式 * Arguments : none * Returns : none********************************************************************* ******/ void MAX7219_DisplayTestStop (void){ MAX7219_Write(REG_DISPLAY_TEST, 0); // 置 MAX7219 为正常显示模式 } /******************************************************************** ****** * MAX7219_ShutdownStart() * * 描述: 进入 shutdown 模式 * Arguments : none * Returns : none********************************************************************* ******/ void MAX7219_ShutdownStart (void) { MAX7219_Write(REG_SHUTDOWN, 0); // 置 MAX7219 为 shutdown 模式 }/******************************************************************** ****** * MAX7219_ShutdownStop() * * 描述: 退出 shutdown 模式 * Arguments : none * Returns : none********************************************************************* ******/ void MAX7219_ShutdownStop (void) { MAX7219_Write(REG_SHUTDOWN, 1); // 置 MAX7219 为正常显示模式 }/******************************************************************** ****** * MAX7219_Init() * * Des cription: MAX7219初始化模块; 应该先于其他MAX7219函数而被调用 * Arguments : none * Returns : none********************************************************************* ******/ void MAX7219_Init (void) { DATA=1; // 置DATA为1 CLK=1; // 置CLK 为1 CS=1; // 置CS 为1 MAX7219_Write(REG_SCAN_LIMIT, 7); // 设置为全显示 MAX7219_Write(REG_DECODE, 0x00); // 所有位设置为非解码方式MAX7219_ShutdownStop(); // 置 MAX7219 为正常显示模式 (非shutdown模式) MAX7219_DisplayTestStop(); // 置 MAX7219 为正常显示模式 (非test模式) MAX7219_Clear(); // 清除所有位的显示MAX7219_SetBrightness(INTENSITY_MAX); // 置最大亮度 }。
MAX7219工作原理简介
MAX7219工作原理简介MAX7219是一个采用3线串行接口的8位共阴极7段LED显示驱动器。
本文分析了MAX7219各个寄存器的功能,并结合MAX7219的工作时序,给出了MAX7219在Motorola MC68HC908单片机系统中的一个应用实例。
关键词: MCU;MAX7219;LED Motorola MC68HC908MAX7219工作时序及其寄存器MAX7219是一个高性能的多位LED显示驱动器,可同时驱动8位共阴极LED或64个独立的LED。
其内部结构框图如图1所示,主要包括移位寄存器、控制寄存器、译码器、数位与段驱动器以及亮度调节和多路扫描电路等。
MAX7219 采用串行接口方式,只需LOAD、DIN、CLK三个管脚便可实现数据传送。
DIN管脚上的16位串行数据包不受LOAD状态的影响,在每个CLK的上升沿被移入到内部16位移位寄存器中。
然后,在LOAD的上升沿数据被锁存到数字或控制寄存器中。
LOAD必须在第16个时钟上降沿或之后,但在下一个时钟上升沿之前变高,否则数据将会丢失。
DIN端的数据通过移位寄存器传送,并在16.5个时钟周期后出现在DOUT端,随CLK 的下降沿输出。
MAX7219的操作时序如图2所示。
MAX7219的串行数据标记为D15~D0,其中低8位表示显示数据本身,最高的4位D15~D12未使用,寻址内部寄存器的地址位占用D11~D8,选择14个内部寄存器,见表1。
图1 MAX7219内部结构框图图2 MAX7219的数据传送时序MAX7219 内部具有14个可寻址数字和控制寄存器。
其中的8个数字寄存器由一个片内8×8双端口SRAM实现。
它们可直接寻址,因此可对单个数进行更新并且通常只要 V+超过2V数据就可保留下去。
除8个数位寄存器之外,还有无操作、译码方式、亮度调整、扫描位数、睡眠模式和显示器测试6个控制寄存器。
无操作寄存器用于多片MAX7219级联,在不改变显示或不影响任意控制寄存器条件下,它允许数据从DIN传送到DOUT。
max7219驱动
//#define N_NOP _nop_();//_nop_();_nop_();
///////////////////////////////////////////////////////
//MAX7219
write_one_8279(Limit_addr,Set_Limit); //8位显示方式;
write_one_8279(Shutd_addr,Set_Shutd); //进入正常工作方式
}
void Init_7219(void)
{//MAX7219正常工作时的初始化;
////////////////////////////////////////////////////////////////////
//管脚,变量和常数定义;DEFINE
#define Model_addr 0x09 // X9 H
#define Bright_addr 0x0a // XA H
#define Set_Halt 0x00 //进入停机工作方式?
#define Set_Model 0xff //将BCD码译成B码;
#define Set_Bright 0x04 //占空比为15/32;
#define Set_Limit 0x07 //8位显示方式;
}
�
{
_nop_();
CLK=0; //-\_
if(addr & 0x80)
DIN=1;
else
DIN=0;
_nop_();
CLK=1; //_/-
addr=addr<<1;
max7219数码管驱动程序库函数
函数说明:初始化MAX7219芯片,MAX7219芯片按照顺序级联,
测试模式显示寄存器没有配置,若希望配置,应在max7219.h中将MAX7219_TestModeDisp_EN预定义为1,
并注意配置测试模式显示的时间,
若时间太短,将较难看到显示效果。
输入参数:n-----初始化芯片个数(n>=1,注意:第1个为第0号芯片,显示函数中有具体描述;
for(i=0;i<8;i++);//短延时
MAX7219_LOAD=0;
for(i=0;i<n;i++)//初始化几个MAX7219芯片,做几次设置操作
MAX7219_WriteAddrData (0x09,MAX7219_InitStructure.DecodeMode);//设置译码模式
MAX7219_LOAD=1;//LOAD上升沿锁存数据
*/
//#define DecodeMode0x09 //译码模式寄存器
//#define Intensity0x0a //亮度寄存器
//#define ScanLimit0x0b //扫描位数寄存器
//#define ShutDown0x0c //关机模式寄存器
//#define DisplayTest0x0f //显示测试寄存器
sbit MAX7219_DIN= P0^3; //串行数据输入
sbit MAX7219_CLK= P0^4; //串行时钟
sbit MAX7219_LOAD= P0^5; //显示数据锁存控制
/*****************************************************************
max7219驱动数码管程序(51单片机+STM32 MAX7219数码管程序案例)
SPI1_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB; //高位MSB在先
SPI1_InitStructure.SPI_CPOL = SPI_CPOL_High; //选择了串行时钟的稳态,时钟悬空高
*功能:STM32_SPI1硬件配置初始化
*入口参数:无
*出口参数:无
*说明:STM32_SPI1硬件配置初始化,使用3V3
****************************************************************************/
void SPI1_Init(void)
SPI1_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;//数据捕获于第二个时钟沿
SPI1_InitStructure.SPI_NSS = SPI_NSS_Soft;CPolynomial = 7;//CRC值计算的多项式
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOA,GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;//SPI1相关引脚
max7219使用详解
Max7219驱动程序一般的MCU因IO脚驱动能力不够,再加之MCU IO口资源有限,产品开发中通常是通过专门的驱动IC来驱动数码管。
7.1 学会看DatasheetMAX7219就是一款可以同时驱动8个数码管的IC。
下图是其引脚图及典型应用电路:我们的CPU只须三根线就可以控制MAX7219,这三根线是:DIN(第一脚),CS(第12脚),CLK(第13脚)。
DIN是数据输入脚,我们要显示的数据就是通过这根线发送到MAX7219的;CS是片选脚,MCU通过把该脚电平拉低来选中MAX7219,或者说MAX7219通过判断该引脚是否为低电平来使能该芯片。
CLK是时钟引脚,该时钟频率是MCU给到MAX7219的,MCU与7219之间的通信频率就根据该信号做基准。
7.2 MAX7219数据格式我们要让8个数码管显示"12345678",这个过程是怎么实现的呢?首先,要搞清楚MAX7219的数据格式,看图:MAX7219是以16位数据接收和发送的,也就是MCU传给MAX7219的数据必须是16位。
下面分析这16位数据格式:D15~D12为X:表示可以为任意值,因为这四位MAX7219目前还用不到。
D11~D8为ADDRESS:表示MAX7219的地址。
D7~D0为DATA,并且位7为高位(最先发送),位0位低位(最后发送)。
也就是当MCU向MAX7219发送一个16位数据时,其中的D11~D8表示选择MAX7219哪个地址,即数据D7~D0是送到该地址的。
7.3 地址译码MAX7219可以挂8个数码管,MCU是怎么把数据显示到指定的数码管的呢?这就要理解MAX7219的地址译码原理。
下图为MAX7219的地址映射图:D15~12以X表示,代表可为0,也可为1。
Digit0~7对应到8个数码管的地址。
Decode Mode:解码模式寄存器,其地址用16进制表示为0x09;Intensity:亮度调节寄存器,其地址用16进制表示为0x0A;Scan Limit:扫描范围寄存器,其地址用16进制表示为0x0B;Shutdown:省电模式,其地址用16进制表示为0x0C;Display Test:测试寄存器,其地址用16进制表示为0x0F;如果,我们要让第一个数码管显示,那么我们这里送到MAX7219的16位数据中的D11~8应该为0001。
MAX7219点阵屏驱动程序(ching2221详细解说)
{
Max7219_pinCLK=0; //时钟开
Max7219_pinDIN=DATA&0x80; //取出DATA的最高位(实参数据位与0X80即10000000相与)
}
}
}
//程序编制:ching2221@
{
for(i=t;i<t+9;i++)
{
Write_Max7219(j,disp1[i]);
j++;
if(j==9) j=0;
Delay_xms(35);
}
if(t==15) t=0;
void Delay_xms(uint x)
{
uint i,j;
for(i=0;i<x;i++)
for(j=0;j<112;j++);
}
void Write_Max7219_byte(uchar DATA)
{
Write_Max7219(0x0b, 0x07); //0X0b为扫描界限寄存器地址 //0x07为八位模式数据
Write_Max7219(0x0c, 0x01); //0X0C为关断模式寄存器地址 //0x01为正常工作模式数据
Write_Max7219(0x0f, 0x00); //0X0F为显示模式寄存器地址 //0x00为正常工作模式数据
}
void Init_MAX7219(void)
{
Write_Max7219(0x09, 0x00); //0X09为译码控制寄存器地址 //0x00为不译码模式数据//01为译码模式
MAX7219驱动数码管显示程序
}
/*-------------------------------------------------
主函数
-------------------------------------------------*/
#define DisplayTest 0x0f /*显示测试*/
#define ShutdownMode 0x00 /*掉电方式工作*/
#define NormalOperation 0x01 /*正常操作方式*/
#define DecodeDigit 0xff /*译码位数设置*/
#define IntensityGrade 0x01 /*显示亮度级别设置*/ //0-10
#define ScanDigit 0x07 /*扫描位数设置*/
#define TestMode 0x01 /*显示测试方式*/
#define TextEnd 0x00 /*显示测试结束,正常工作*/
void InitDis (void)
{
WriteWord (ScanLimit,ScanDigit); /*设置扫描界限*/
WriteWord (DecodeMode,DecodeDigit); /*设置译码模式*/
WriteWord (Intensity,IntensityGrade); /*设置亮度*/
void WriteWord (unsigned char addr,unsigned char num)
{
dis_LOAD=0;
_nop_();
MAX7219共阴极LED驱动器程序
MAX7219共阴极 LED数码管显示驱动(一)、 MAX7219MAX7219是一种串入、并出的共阴极LED数码管显示驱动器,每片可驱动8 位 LED数码管显示,与单片机的接口只要 3 根线,内带BCD译码器,及显示测试、移位、锁存器等,输出电流达40mA,外头只要一只亮度调整电阻。
MAX7219引脚图1、引脚功能说明DIN:串行数据输入端,CLK的上涨沿时数据被载入内部16 位移位存放器中CLK:串行时钟输入端,最高工作频次可达10MHzLOAD:片选端,低电平接收DIN 端的数据,高电平常数据被所存DIG0~7: LED的位控制端A~DP:LED的端控制端DOUT:串行数据输出端,用于芯片的级联ISET:硬件亮度调整端,在该引脚与VCC之间跨接一个电阻,LED的亮度即可经过该电阻来调理,流过LED的段驱动均匀电流为流过此电阻电流的100 倍, 此电阻值范围为:10~80K 之间。
2、内部存放器说明A、译码方式选择存放器地点:09H赋值: FFH表示使用MAX7219内部的BCD译码器00H表示不使用MAX7219内部的 BCD译码器B、亮度调理存放器地点:0AH赋值:00H~0FH 可改变MAX7219所驱动的LED的亮度,其变化范围在1/32~31/32之间C、扫描位数设定存放器地点:0BH赋值: 00H所有位不显示01H~07H挨次对应于1~8 位及前方位所有显示(即需显示的位应为“1”)D、待机模式开关存放器地点:0CH赋值: 00H LED全灭01H LED正常显示E、显示器测试存放器地点: 0FH赋值: 00H LED为正常显示状态01H LED测试状态,即LED全亮F、8 位LED显示数据存放器地点: 01H~08H对这些存放器赋值(即需显示的内容),就会在对应的1~8 位LED数码管上显示出来3、使用注意事项因为电源中杂波或邻近的电磁等扰乱信号,使MAX7219在上电后不显示或乱显示;为了除去这类现象应在 MAX7219的 VCC端与地之间接一只104pf 的瓷片电容,在LOAD端于地之间接一只10K 的电阻。
MAX7219多级联驱动程序
MAX7219多级联驱动程序在使用多个7219级联时,只要在写入最后一片7219时作一特殊处理就可以了。
/*----------------显示模块----------------------*///级连的四个7219模块,以引出线在右边为准,自左至右为位3,2,1,0。
每一个7219模块,自上至下,为a,b,..g,h段// 字符表的排列为CharMap_X[a , b, c, d,e, f,g,h],//模板的排列model_xxxx[char3[a , b, c, d,e, f,g,h],char2[a , b, c, d,e, f,g,h],char1[a , b, c, d,e, f,g,h],char0[a , b, c, d,e, f,g,h]]//段数据的排列Seg_data的排列与模板的排列相同。
//7219控制寄存器#define ScanLimit 0x0b //扫描界限地址#define ScanDigit 7 //0-7,7全扫#define DecodeMode 0x09 //译码模式地址#define DecodeDigit 0x00 //0x00 不译码0x01 只译字0 0x0f 译字0-3 0xff 全译码#define Intensity 0x0a // 亮度地址#define IntensityGrade 0x00 //0-f 16个档次#define ShutDown 0x0c //电源工作模式地址#define NormalOperation 1 //1 正常0 掉电#define DisplayTest 0x0f //测试模式地址#define TestMode 1 //0 正常 1 测试#define TestEnd 0 //0 正常 1 测试#define No_op 0 //无操作寄存器#define num_7219 4延时子程序***********************************************************////////////////// 延时=6.6*x +9.6 usvoid delay(unsigned int x) //22.1184Mhz x=1时16.2us ,x=2 23us, x=3 29.6usx=150 ~~=1ms{uint i;for(i=0;i<x;i++);}///////////延迟Xmsvoid delay_xms(uchar x) //22Mhz xms{int i,set;set=0;for(i=0;i<x;i++){delay(150); //150}}void InitMain (void){TMOD=0x20;TH0=0xff;TL0=0xf4;EA=1;ES=1;TR1=1;}//max7219的驱动LED显示/************************** ******************************** */ /*-------------------------------------------------向MAX7219写入字节(8位)--------------------------------------------------*/void SendChar7219 (uchar ch){uchar i,temp;nop;for (i=0;i<8;i++){ps7219_pin_CLK=0;temp=ch&0x80;ch=ch<<1;if(temp){ps7219_pin_DIN=1;}else{ps7219_pin_DIN=0;}ps7219_pin_CLK=1;_nop_();}}////////////向MAX7219写入字(16位)void WriteWord7219 (uchar addr,uchar num){ps7219_pin_LOAD=0;_nop_();SendChar7219 (addr);_nop_();SendChar7219 (num);_nop_();}/*-------------------------------------------------写一行(4个字节到4个7219芯片的同一地址)/*-------------------------------------------------*/void WriteLine7219(uchar Addr) //, uchar Seg_data{char i,j;for (i=1;i<=3;i++) //写第一、二、三片7219{j=(i+1)*8-Addr;WriteWord7219 (Addr,Seg_data[j]);ps7219_pin_LOAD=1; //锁存操作}//写第四片7219ps7219_pin_LOAD=0; //封锁第一片锁存操作WriteWord7219 (Addr,Seg_data[8-Addr]); //写第四片ps7219_pin_CLK=1;WriteWord7219 (No_op,0); //跳过第一、二、三片7219WriteWord7219 (No_op,0);WriteWord7219 (No_op,0);ps7219_pin_LOAD=1; // 锁存操作}/*-------------------------------------------------写一屏/*-------------------------------------------------*/void WriteOneScreen7219( ){char i;for (i=7;i>=0;i--){WriteLine7219 (i+1);}}/*-------------------------------------------------MAX7219初始化-------------------------------------------------*/void InitDis7219 (void){char i;for (i=num_7219; i>=0; i--){WriteWord7219(ShutDown,NormalOperation); /*设置电源工作模式*/ps7219_pin_LOAD=1; //锁存操作WriteWord7219(ScanLimit,ScanDigit); /*设置扫描界限*/ps7219_pin_LOAD=1; //锁存操作WriteWord7219(DecodeMode,DecodeDigit); /*设置译码模式*/ps7219_pin_LOAD=1; //锁存操作WriteWord7219(Intensity,IntensityGrade); /*设置亮度*/ps7219_pin_LOAD=1; //锁存操作delay_xms(10); //延迟10msWriteWord7219 (DisplayTest,TestEnd); //正常工作ps7219_pin_LOAD=1; //锁存操作}}void main(){InitDis7219 ();delay_xms(50);}(略)。
串行LED显示驱动器MAX7219及其应用
沿出现的同时或之后,但在下一个CI。K上升沿之前 变为高电平,否则移人的数据将丢失。
表l引脚说明
引脚号
l 2。3.5~ 8.10.11 4.9 12
13
14~17 20~23 18 19
24
名称
功能说明
D。 DIG0~
串行数据输入端。在CLK的上升沿数 据被锁人芯片内部16位移位寄存器 8位LED位选线.从共阴极LED中吸
等教育出版社,1991 4 谢嘉奎.电子线路(第4版).北京:高等教育出
版社,1999
The Calculating of the Power Factor for Switching Power Supply
I。i Tin鲥un Mi Yulin Jiang Zhongshan Ren Jiancun I。i Xin
Key words non—sine waveform,power factor,switching power supply,fourier analysis
万方数据
D15 D14 D13 D12 D1l D10 D9
D8 D7 D6 D5 D4
RESS
MSB
DATA
LSB
万方数据
第5期
胡奕明:串行I。ED显示驱动器MAX7219及其应用
29
+5V
图l典型应用电路 其中:D7~DO:8位数据位,D7最高位,
Do为最底位; D11~D8:4位地址位; D15~D12:无关位,通常全取1。 MAX7219通过D11~D8 4位地址位译码,可 寻址14个内部寄存器,分别是8个LED显示位寄 存器,5个控制寄存器和1个空操作寄存器。LED显 示寄存器由内部8×8静态RAM构成,操作者可直 接对位寄存器进行个别寻址,以刷新和保持数据,只 要V+超过2 V(一般为+5 V)。 控制寄存器包括:译码模式,显示亮度调节,扫 描限制(选择扫描位数),关断和显示测试寄存器。
MAX7219级联教程
河南工业大学爬山虎工作室
DIN=1; else DIN=0; Dat <<= 1; CLK = 1; _nop_(); _nop_(); CLK = 0; } for(i=0;i<Num_Addr;i++) { for(j=0;j<16;j++) { CLK = 0; DIN = 0; CLK = 1; _nop_(); _nop_(); CLK = 0; } } LOAD = 1; } void Initialise7219()//初始化 { //第 0 个 7219 初始化 Write(0x00,0x09,0xff); //编码模式 Write(0x00,0x0b,0x07); //全部扫描 Write(0x00,0x0c,0x01); //正常模式:1,掉电模式:0 Write(0x00,0x0a,0x07); //消隐时间设为 T/2 //第 1 个 7219 初始化 Write(0x01,0x09,0xff); //编码模式 Write(0x01,0x0b,0x07); //全部扫描 Write(0x01,0x0c,0x01); //正常模式 Write(0x01,0x0a,0x07); //消隐时间设为 T/2 } void main() { u8 i; Initialise7219(); DelayMS(1); for(i=0;i<8;i++) {
河南工业大学爬山虎工作室
MAX7219 级联教程,附驱动源码
一、电路原理图
河南工业大学爬山虎工作室
二、 级联程序
#include <reg52.h> #include <intrins.h> #define u8 unsigned char #define uint unsigned int sbit DIN = P2^0; sbit LOAD = P2^1; sbit CLK = P2^2; u8 Disp_Buffer[8]={2,0,0,9,10,8,10,9}; //软件延时函数,延时 xms void DelayMS(uint x) { u8 t; while(x--) { for(t=120;t>0;t--); } } //向第 Num_Addr 片 7219 的 Addr 寄存器写入一个 Dat 数据 //Num_Addr:7219 地址(0~255) //Addr:7219 数显寄存器地址(1~8) //Dat:要显示的数据(0~15)(含字母) void Write(u8 Num_Addr,u8 Addr,u8 Dat) { u8 i,j; LOAD = 0; for(i=0;i<8;i++) { CLK = 0; if(Addr&0x80) DIN=1; else DIN=0; Addr <<= 1; CLK = 1; _nop_(); _nop_(); CLK = 0; } for(i=0;i<8;i++) { CLK = 0; if(Dat&0x80)
MAX7219级联教程
河南工业大学爬山虎工作室
DIN=1; else DIN=0; Dat <<= 1; CLK = 1; _nop_(); _nop_(); CLK = 0; } for(i=0;i<Num_Addr;i++) { for(j=0;j<16;j++) { CLK = 0; DIN = 0; CLK = 1; _nop_(); _nop_(); CLK = 0; } } LOAD = 1; } void Initialise7219()//初始化 { //第 0 个 7219 初始化 Write(0x00,0x09,0xff); //编码模式 Write(0x00,0x0b,0x07); //全部扫描 Write(0x00,0x0c,0x01); //正常模式:1,掉电模式:0 Write(0x00,0x0a,0x07); //消隐时间设为 T/2 //第 1 个 7219 初始化 Write(0x01,0x09,0xff); //编码模式 Write(0x01,0x0b,0x07); //全部扫描 Write(0x01,0x0c,0x01); //正常模式 Write(0x01,0x0a,0x07); //消隐时间设为 T/2 } void main() { u8 i; Initialise7219(); DelayMS(1); for(i=0;i<8;i++) {
更多资源和知识请关注微信公共号 河爬山虎工作室。 分享资源、拒绝技术封锁。 快来加入我们吧。
河南工业大学爬山虎工作室
二、 级联程序
#include <reg52.h> #include <intrins.h> #define u8 unsigned char #define uint unsigned int sbit DIN = P2^0; sbit LOAD = P2^1; sbit CLK = P2^2; u8 Disp_Buffer[8]={2,0,0,9,10,8,10,9}; //软件延时函数,延时 xms void DelayMS(uint x) { u8 t; while(x--) { for(t=120;t>0;t--); } } //向第 Num_Addr 片 7219 的 Addr 寄存器写入一个 Dat 数据 //Num_Addr:7219 地址(0~255) //Addr:7219 数显寄存器地址(1~8) //Dat:要显示的数据(0~15)(含字母) void Write(u8 Num_Addr,u8 Addr,u8 Dat) { u8 i,j; LOAD = 0; for(i=0;i<8;i++) { CLK = 0; if(Addr&0x80) DIN=1; else DIN=0; Addr <<= 1; CLK = 1; _nop_(); _nop_(); CLK = 0; } for(i=0;i<8;i++) { CLK = 0; if(Dat&0x80)
max7219点阵屏工作原理
max7219点阵屏工作原理MAX7219是一种数字电路芯片,用于驱动点阵屏,起源于MAXIM公司。
MAX7219的主要特点是在使用少量的I/O管脚的情况下,就能够驱动8×8的点阵屏甚至16×16的点阵屏。
MAX7219芯片采用了数字方式控制,有多个控制模式,主要有:1、不带显示存储器,仅驱动数字显示寄存器法下面我们来具体介绍一下MAX7219点阵屏的工作原理。
一、接线原理MAX7219有两个重要的管脚,一个是数字输出管脚,一个是列选择管脚。
数字输出管脚把数据发给点阵屏,列选择管脚则决定了需要显示的是哪一列的数据。
因为点阵屏是由多行、多列的 LED 灯组成的,它们通过多个引脚与 MAX7219 进行连接。
这个连接方式是以级联的方式连接的,也就是前一个屏幕的 data pin 与后一个屏幕的 input pin 连在一起,最后一个屏幕的 output pin 连接与控制芯片的 data pin , 所有点阵屏的共同管脚,比如chip select(片选)、load(装载)、clk(时钟)连接到了MAX7219的3、2、1管脚。
二、数据格式MAX7219点阵屏与单片机通信的数据有三个,一个是地址,一个是数据,一个是控制字。
其中地址是指向MAX7219内部寄存器,数据用于寄存器内部的信息,操作码是控制MAX7219的操作命令。
寄存器地址:MAX7219芯片内置有多个数据寄存器,比如:CODE_B,CODE_A,SHTDWN,TEST,DIG3-0,SCAN_DIG, INTEN ,DECODE_MODE。
各寄存器的功能就不再多赘述了。
在数据通信中,最重要的就是数据格式,如何格式化数据才能让MAX7219芯片理解?数据格式分两种:普通数据格式和控制字数据格式。
MAX7219内部有8个数字显示寄存器,用于显示8位数码或字符。
以将编号为0的数字显示寄存器的信息显示在LED上时为例,我们要按照一下方式进行数据输入:1、向控制器发送选通这名(chip select)信号。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MAX7219基本驱动程序2015.07.26Q群:沈阳理工大学电子爱好者Note:仅仅是基本驱动程序,那你可以根据自己的需要去修改本程序验证单片机型号:STC15W系列单片机编译软件:Keil3编程语言:C程序组成文件:STC15W.H MAX7219.H MAX7219.CSTC15W.H:把宏晶STC官网烧录软件的15系列头文件更名为STC15WMAX7219.H:/***************************************************文件名称:MAX7219.H功能:MAX7219的驱动四位数码管的函数修改时间:2015.06.28***************************************************/#ifndef_MAX7219_H_#define_MAX7219_H_#include"STC15W.H"#include"intrins.h"//这里的有关单片机的头文件用户可以改成自己的名字#define MAX7219_DIN P10//数据输入,CLK上升沿时数据读入#define MAX7219_CLK P11//时钟信号输入端#define MAX7219_LOAD P12//锁定最近的16位数据为有效数据并载入//用户可以根据自己的需求改变引脚//一条指令的传输:LOAD低-数据-CLK上升沿-数据-CLK上升沿。
LOAD上升沿数据载入#define LOW0#define HIGH1/**************/static void MAX7219_WOnebyte(unsigned char x,unsigned char y); //向MAX7219的X地址写入参数Yvoid MAX7219_Init(unsigned char seg_limit);//MAX7219功能初始化void MAX7219_WData(unsigned long seg_data);//向MAX7219写入需要显示的数据#endifMAX7219.H:/***************************************************文件名称:MAX7219.C功能:MAX7219的驱动四位数码管的函数修改时间:2015.06.28***************************************************/#include"MAX7219.H"unsigned char max7219_segnum=0;//这个参数用来表示当前数码管一共显示几位(1~8)enum MAX7219_ADD{MAX7219_ADD_Nop=0x50,MAX7219_ADD_Digit0,MAX7219_ADD_Digit1,MAX7219_ADD_Digit2,MAX7219_ADD_Digit3,MAX7219_ADD_Digit4,MAX7219_ADD_Digit5,MAX7219_ADD_Digit6,MAX7219_ADD_Digit7,MAX7219_ADD_Mode,MAX7219_ADD_Intensity,MAX7219_ADD_ScanLimit,MAX7219_ADD_ShutDown,MAX7219_ADD_Nouse1,MAX7219_ADD_Nouse2,MAX7219_ADD_DisplayTest,};//这个枚举类型MAX7219_ADD表示MAX7219的寄存器地址/***************************************************函数名称:MAX7219_WOnebyte功能:向MAX7219的X地址写入参数Y输入:X:地址Y:数据输出:无作用范围:局部MAX7219.C***************************************************/ static void MAX7219_WOnebyte(unsigned char x,unsigned char y) {unsigned char i,z=0;for(i=0;i<8;i++){z=(x<<i);if(z&0x80)MAX7219_DIN=HIGH;else MAX7219_DIN=LOW;_nop_();_nop_();MAX7219_CLK=HIGH;_nop_();_nop_();MAX7219_CLK=LOW;}for(i=0;i<8;i++){z=(y<<i);if(z&0x80)MAX7219_DIN=HIGH;else MAX7219_DIN=LOW;_nop_();_nop_();MAX7219_CLK=HIGH;_nop_();_nop_();MAX7219_CLK=LOW;}_nop_();_nop_();MAX7219_LOAD=HIGH;_nop_();_nop_();MAX7219_LOAD=LOW;}/***************************************************函数名称:MAX7219_Init功能:MAX7219功能初始化输入:seg_limit表示显示数码管的位数输出:无作用范围:全局***************************************************/ void MAX7219_Init(unsigned char seg_limit){max7219_segnum=seg_limit;//将设置的显示数码管个数保存MAX7219_LOAD=LOW;_nop_();_nop_();MAX7219_LOAD=HIGH;_nop_();_nop_();MAX7219_LOAD=LOW;MAX7219_WOnebyte(MAX7219_ADD_Mode,0xFF);//MAX7219为译码模式MAX7219_WOnebyte(MAX7219_ADD_Intensity,0x02);//MAX7219的显示亮度为最亮MAX7219_WOnebyte(MAX7219_ADD_ScanLimit,seg_limit);//MAX7219的显示4个数码光(0,1,2,3)MAX7219_WOnebyte(MAX7219_ADD_DisplayTest,0X00);//MAX7219正常工作模式,非测试MAX7219_WOnebyte(MAX7219_ADD_ShutDown,0X01);//MAX7219正常工作模式,非掉电MAX7219_DIN=LOW;MAX7219_CLK=LOW;MAX7219_LOAD=LOW;}/***************************************************函数名称:MAX7219_WData功能:向MAX7219写入需要显示的数据输入:seg_data表示数码管将要显示的数据输出:无作用范围:全局***************************************************/ void MAX7219_WData(unsigned long seg_data){unsigned char x0,x1,x2,x3,x4,x5,x6,x7,a=max7219_segnum;if(seg_data<99999999){x7=(seg_data/10000000);x6=(seg_data/1000000)%10;x5=(seg_data/100000)%10;x4=(seg_data/10000)%10;x3=(seg_data/1000)%10;x2=(seg_data/100)%10;x1=(seg_data/10)%10;x0=(seg_data%10);//将要显示的数据分位MAX7219_WOnebyte(MAX7219_ADD_Digit0,x0);if(a){MAX7219_WOnebyte(MAX7219_ADD_Digit1,x1);a--;}if(a){MAX7219_WOnebyte(MAX7219_ADD_Digit2,x2);a--;}if(a){MAX7219_WOnebyte(MAX7219_ADD_Digit3,x3);a--;}if(a){MAX7219_WOnebyte(MAX7219_ADD_Digit4,x4);a--;}if(a){MAX7219_WOnebyte(MAX7219_ADD_Digit5,x5);a--;}if(a){MAX7219_WOnebyte(MAX7219_ADD_Digit6,x6);a--;}if(a){MAX7219_WOnebyte(MAX7219_ADD_Digit7,x7);}}}验证电路:以上程序本人亲测可用,原版!!更多资讯请加入扣扣群:沈阳理工大学电子爱好者。