#申请原创#
MAX7219是一种集成化的串行输入/输出共阴极显示驱动器,其片内配有一个B型BCD编码器、多路扫描回路,段字驱动器,而且还有一个8*8的静态RAM用来存储数据。有一个外部寄存器用来设置各个LED的段电流。同时它有限制回转电流的段驱动以减少EMI(电磁干扰)。 一个方便的四线串行接口可以联接所有通用的微处理器。每个数据可以寻址在更新时不需要改写所有的显示。MAX7219允许用户对每一个数据选择编码或者不编码。 芯片包含一个150μA的低功耗模式控制器,可进行模拟或数字式亮度控制,一个扫描限制寄存器允许用户显示1-8位数据,还有一个让所有LED发光的检测模式。 它只需3个GPIO口就可驱动8位数码管或8x8点阵模块,因此它相较于传统的并联式驱动基于硬件资源消耗少的特点。 本篇主要介绍以NuMaker--PFM--M487开发板来驱动MAX7219显示模块,并通过RT_Thread软件来实现。 1. 串行数码管显示模块 串行数码管显示模块的外观如图1所示,它具有输入端和输出端可多个模块级联起来使用,以显示更多位的数码值。 图1 串行数码管模块 串行数码管显示模块的电路原理图见图2所示,该模块采用5V电压来工作。 图2 原理图 在使用NuMaker--PFM--M487开发板驱动的情况下,其显示效果如图3所示。 图3 显示效果 该显示模块与开发板的连接关系为: CLK-- PA2 DIN-- PA1 CS --PA0 MAX7219模拟串行数据发送的函数为: void Write_Max7219_byte(unsigned char DATA)
{
unsigned char i;
rt_pin_write(CS_PIN, PIN_LOW);
for(i=8;i>=1;i--)
{
rt_pin_write(CLK_PIN, PIN_LOW);
if(DATA&0x80) rt_pin_write(DIN_PIN, PIN_HIGH);
else rt_pin_write(DIN_PIN, PIN_LOW);
DATA=DATA<<1;
rt_pin_write(CLK_PIN, PIN_HIGH);
}
}
MAX7219向芯片寄存器写入数据的函数为: void Write_Max7219(char address,char dat)
{
rt_pin_write(CS_PIN, PIN_LOW);
Write_Max7219_byte(address);
Write_Max7219_byte(dat);
rt_pin_write(CS_PIN, PIN_HIGH);
}
MAX7219的初始化函数为: void Init_MAX7219(void)
{
Write_Max7219(0x09, 0xff); //译码方式:BCD码
Write_Max7219(0x0a, 0x03); //亮度
Write_Max7219(0x0b, 0x07); //扫描界限;4个数码管显示
Write_Max7219(0x0c, 0x01); //掉电模式:0,普通模式:1
Write_Max7219(0x0f, 0x01); //显示测试:1;测试结束,正常显示:0
}
实现显示功能的主程序为: void main(void)
{
rt_pin_mode(CLK_PIN , PIN_MODE_OUTPUT);
rt_pin_mode(DIN_PIN, PIN_MODE_OUTPUT);
rt_pin_mode(CS_PIN, PIN_MODE_OUTPUT);
rt_thread_mdelay(50);
Init_MAX7219();
rt_thread_mdelay(2000);
Write_Max7219(0x0f, 0x00);
Write_Max7219(1,8);
Write_Max7219(2,7);
Write_Max7219(3,6);
Write_Max7219(4,5);
Write_Max7219(5,4);
Write_Max7219(6,3);
Write_Max7219(7,2);
Write_Max7219(8,1);
while(1);
}
经编译处理,其编译结果如图5所示。 由此可见,串行数码管显示模块的驱动是很容易实现的,也是十分方便。由于数码管基于亮度高的特点,故适于在工业现场来使用。 2. 串行点阵显示模块 串行点阵显示模块也是以MAX7219为控制芯片,在单级使用的情况下,一片MAX7219可控制一块8*8点阵的显示块,若采用级联的方式,则可驱动多个点阵块,以实现多个字符的同时显示,可达到点阵信息屏的显示效果。 该模块的电路原理图如图4所示,为节省空间,它是将MAX7219芯片置于点阵块的下方。 图4 模块电路图 点阵显示模块与开发板的连接关系为: CLK-- PA2 DIN-- PA1 CS --PA0 在使用NuMaker--PFM--M487开发板驱动的情况下,其显示效果如图5所示。 图5 显示效果 相较于串行数码管显示模块,该显示模块所显示的信息量要更丰富,故需要为它配置一个显示字模数组,其结构及内容如下: unsigned chardisp[38][8]={ {0x3C,0x42,0x42,0x42,0x42,0x42,0x42,0x3C},//0 {0x10,0x30,0x50,0x10,0x10,0x10,0x10,0x10},//1 {0x7E,0x2,0x2,0x7E,0x40,0x40,0x40,0x7E}, //2 ... {0x8,0x14,0x22,0x3E,0x22,0x22,0x22,0x22},//A {0x3C,0x22,0x22,0x3E,0x22,0x22,0x3C,0x0},//B {0x3C,0x40,0x40,0x40,0x40,0x40,0x3C,0x0},//C ... {0x8,0x7F,0x49,0x49,0x7F,0x8,0x8,0x8},//中 {0xFE,0xBA,0x92,0xBA,0x92,0x9A,0xBA,0xFE},//国 } 对于点阵显示模块的驱动,同样需要2个辅助函数Write_Max7219_byte()和Write_Max7219()的支持,其内容同前面的函数相一致,故从略。 但在MAX7219的初始化方面,由于2种功能模块有着较大的差异,故其初始化函数是不同的,其内容为: void Init_MAX7219(void)
{
Write_Max7219(0x0b, 0x07);
Write_Max7219(0x0c, 0x01);
Write_Max7219(0x0f, 0x00);
}
实现图5显示效果的主程序为: void main(void)
{
uint32_t i,j;
rt_pin_mode(CLK_PIN , PIN_MODE_OUTPUT);
rt_pin_mode(DIN_PIN, PIN_MODE_OUTPUT);
rt_pin_mode(CS_PIN, PIN_MODE_OUTPUT);
Init_MAX7219();
while(1)
{
for(j=0;j<38;j++)
{
for(i=1;i<9;i++)
Write_Max7219(i,disp[j][i-1]);
rt_thread_mdelay(1000);
}
}
}
其中,内层的循环是为了完成单个字符的显示,而外层的循环则是负责将字符库中的内容遍寻显示一轮。 在显示过程中,每显示完一个字符。 经编译下载,其显示如图6至图8所示。 图6 显示“0” 图7显示“1” 图8显示“2”
|
RT_Thread+NuMaker-PFM-M487强强联合,点亮串行数码管,有一定实际意义。