本文仅仅针对如何使用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);
/*亮度控制:0x00~0x0F 0是最暗 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;
MAX7219_CS=0;
for(i=0;i<LEDCOUNT;i++)
{
MAX7219_Write_Command(DISPLAYTEST,0X00);
/*显示寄存器:0普通模式 1测试模式*/
}
MAX7219_CS=1;
}
3.显示函数
初始化完成后就可以进行显示了,显示函数如下:文章来源:https://www.toymoban.com/news/detail-762475.html
/*字库定义的字库 */
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中,依此类推。文章来源地址https://www.toymoban.com/news/detail-762475.html
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 |
到了这里,关于STM32使用MAX7219控制点阵屏和点阵屏级联的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!