| 
#申请原创#   
 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”  
 
 
 
 
 
  |