使用STM32和MAX7219控制点阵屏及级联配置详解

本文仅仅针对如何使用STM32通过使用MAX7219对点阵屏的控制和级联,提供相应的程序说明和简单的芯片说明,具体的芯片说明请查找数据手册(找淘宝商家要最简单)

目录

一、芯片简单介绍

1.芯片管脚配置

1.1管脚描述

 2.时序图

2.1数据格式

二、 如何使用

 1.单字节写入函数

     2.芯片初始化

3.显示函数

三、级联说明


一、芯片简单介绍

1.芯片管脚配置

 

1.1管脚描述

管脚 名称 功能
1 DIN 串行数据输入端口。在时钟上升沿时数据被载入内部
的16 位寄存器。
2,3,5-8,10,11 DIG 0–DIG
7
八个数据驱动线路置显示器共阴极为低电平。关闭时
7219 此管脚输出高电平,7221 呈现高阻抗。
4,9 GND 地线(4 脚和9 脚必须同时接地)
12 LOAD
(MAX7219)
载入数据。连续数据的后16 位在LOAD 端的上升沿时
被锁定。
CS
(MAX7221)
片选端。该端为低电平时串行数据被载入移位寄存
器。连续数据的后16 位在cs 端的上升沿时被锁定。
13 CLK 时钟序列输入端。最大速率为10MHz.在时钟的上升
沿,数据移入内部移位寄存器。下降沿时,数据从DOUT
端输出。对MAX7221 来说,只有当cs 端为低电平时时
钟输入才有效。
14-17,20-23 SEG
A–SEG G,
DP
7 段和小数点驱动,为显示器提供电流。当一个段驱
动关闭时,7219 的此端呈低电平,7221 呈现高阻抗。
18 SET 通过一个电阻连接到VDD 来提高段电流。
19 V+ 正极电压输入,+5V
24 DOUT 串行数据输出端口,从DIN 输入的数据在16.5 个时
钟周期后在此端有效。当使用多个MAX7219/MAX7221
时用此端方便扩展。

 2.时序图

        通过三线控制,当CS拉低时开始传输数据,CLK由低变高时的DIN引脚的高低代表1和0。当CS由0变1时,数据将存入芯片内部。

2.1数据格式

        数据格式上图所示,一帧数据由2部分组成,高8位是地址,低8位是数据。地址由0到15,分别对应数据寄存器和控制寄存器如下图所示:

具体内容参考官方数据手册,关于芯片内部这里只做简单的描述,主要会用就行。

二、 如何使用

        我使用的是共阴极点阵屏,配合寄存器图可知,其实Digit0~7控制的就是点阵屏的第1~8行,当给Digit命令后,相当于拉低电平了,那么这一行都是低电平,只要列是高,那么灯就会亮,所以根据这个特性编写程序。

 1.单字节写入函数

编程的第一步便是通过时序图编写一个写入函数程序如下。

/*3个引脚的控制宏定低    位带操作*/
#define MAX7219_DIN PBout(5)
#define MAX7219_CS 	PBout(6)
#define MAX7219_CLK PBout(7)
void MAX7219_Write_byte(uint8_t data)//单字节写入
{
	uint8_t i=0;
	MAX7219_CS=0;//为了防止CS没有拉低,所以每次写都拉低
	for(i=8;i>0;i--)
	{
		MAX7219_CLK=0;
		if(data&0x80)//高位先行
		{
			MAX7219_DIN=1;
		}
		else
		{
			MAX7219_DIN=0;
		}
		data=data<<1;//最高位左移以为 次高位变最高位
		MAX7219_CLK=1;
	}
}

        基本单字节函数完成后,为了方便使用,所以利用单字节写入函数写一个写入命令函数,如下:

void MAX7219_Write_Command(uint8_t addr,uint8_t data)//写命令
{
	MAX7219_Write_byte(addr);//寄存器地址
	MAX7219_Write_byte(data);//需要写入的数据
}

     2.芯片初始化

        首先初始化芯片的几个控制寄存器,程序如下

/************宏定义方便修改和观察*******************/
#define LEDCOUNT 	4///点阵屏的个数  我用的4连屏
#define DECODEMODE 		0X09	//编码模式
#define INTENSITY  		0X0A	//亮度
#define SCANLIMT		0x0B	//扫描寄存器个数
#define SHUTDOWN   		0X0C	//关闭寄存器
#define DISPLAYTEST		0X0F	//显示测试
/*************************************************/
void MAX7219_INIT(void)
{
	uint8_t i=0;
	GPIO_Config();
	MAX7219_CS=0;
	for(i=0;i<LEDCOUNT;i++)
	{
		MAX7219_Write_Command(DECODEMODE,0X00);
        /*译码寄存器:1使用BCD码   0不使用(数码管的话建议用BCD码)*/
	}
	MAX7219_CS=1;//这里发送4次后CS拉高,那么4个点阵屏都收到数据,然后加载到寄存器中
	MAX7219_CS=0;
	for(i=0;i<LEDCOUNT;i++)
	{
		MAX7219_Write_Command(INTENSITY,0X01);
        /*亮度控制:0x01~0x0F  1是最暗  0xFs是最亮*/
	}
	MAX7219_CS=1;
	MAX7219_CS=0;
	for(i=0;i<LEDCOUNT;i++)
	{
		MAX7219_Write_Command(SCANLIMT,0X07);
        /*点阵屏的行数  数码管的段位  0是1行,7是8行*/
	}
	MAX7219_CS=1;
	MAX7219_CS=0;
	for(i=0;i<LEDCOUNT;i++)
	{
		MAX7219_Write_Command(SHUTDOWN,0X01);
        /*掉电模式:0掉电模式  1正常模式*/
	}
	MAX7219_CS=1;
	
		for(i=0;i<LEDCOUNT;i++)
	{
		MAX7219_Write_Command(DISPLAYTEST,0X00);
        /*显示寄存器:0普通模式   1测试模式*/
	}
	MAX7219_CS=1;
	
}

3.显示函数

        初始化完成后就可以进行显示了,显示函数如下:

/*字库定义的字库 */
 const u8 _4x7Num[10][8]={
	 {0x0f,0x09,0x09,0x09,0x09,0x09,0x0f,0x00},//0
	 {0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00},//1
	 {0x0f,0x01,0x01,0x0f,0x08,0x08,0x0f,0x00},//2
	 {0x0f,0x01,0x01,0x0f,0x01,0x01,0x0f,0x00},//3
	 {0x09,0x09,0x09,0x0f,0x01,0x01,0x01,0x00},//4
	 {0x0f,0x08,0x08,0x0f,0x01,0x01,0x0f,0x00},//5
	 {0x0f,0x08,0x08,0x0f,0x09,0x09,0x0f,0x00},//6
	 {0x0f,0x01,0x01,0x01,0x01,0x01,0x01,0x00},//7
	 {0x0f,0x09,0x09,0x0f,0x09,0x09,0x0f,0x00},//8
	 {0x0f,0x09,0x09,0x0f,0x01,0x01,0x0f,0x00}//9
 };
for(i=1;i<9;i++)//点阵屏的第1行到第8行
{
	MAX7219_CS=0;   
	for(j=0 ; j< 4; j++)//因为有4个点阵屏,所以同一行需要发4次
	{   
		switch(j)//用switch只是为了方便看而已
		 {
		  case 0:
		       MAX7219_Write_byte(i);            
		       MAX7219_Write_byte(_4x7Num[5][i-1]);
               //控制列的高低电平,行为低电平了,所以列为1时灯亮,如数据为
               //0xF0 那么这一行就是4个亮4个灭
		       break;
		   case 1:
			    MAX7219_Write_byte(i);			  
				MAX7219_Write_byte(_4x7Num[6][i-1]);
		        break;
		    case 2:
				MAX7219_Write_byte(i);			  
				MAX7219_Write_byte(_4x7Num[7][i-1]);
		        break;
		     case 3:
				MAX7219_Write_byte(i);			  
				MAX7219_Write_byte(_4x7Num[8][i-1]);
		        break;         
		   }
	   }
   	 MAX7219_CS=1;
}

三、级联说明

        MAX7219的芯片有一个特点就是当CS产生上升沿后,才会将数据保存到寄存器中,而已当超过16位后,再传输一位的时候就会从OUT那溢出以为到下一个点阵屏的max7219的IN中,下表为示意图,第一次发送数据,此时数据在MAX7219①中,如表格中①所示此时CS不拉高继续发送数据,当在发送一个位时,比如0,此时的数据如表格中②所示,那么第一次发送的最高位就会溢出到max7219②中,依此类推,当再发送一个位,比如1,那么如表格中③所示。即当方法第一个16位数据时,数据会在第一个MAX7219中,如果CS拉高,那么寄存器将保存数据,如果没有拉高,当再发送2个字节的数据时,第一个2个字节的数据将被推到第二个MAX7219中,依此类推。

MAX7219① MAX7219②
bit0 1 2~13 14 bit15 bit0 1 2~13 14 bit15
1 0 1 0 1 1 0 1 0 1 1 1 0 1 0 1
0 1 0 1 0 1 1 0 1 0 1 1 1 0 1 0 1
1 0 1 0 1 0 1 1 0 1 0 1 1 1 0 1 0 1
物联沃分享整理
物联沃-IOTWORD物联网 » 使用STM32和MAX7219控制点阵屏及级联配置详解

发表回复