串行数码管显示模块是一种以串行方式发送数据,以并行方式输出数据的显示模块,其特点是输入引脚少,可较好地节省引脚资源。此外,在数据不需要刷新的情况下,它无需MCU的干预即可维持显示。

图1 串行数码管显示模块
该串行数码管显示模块与开发板的连接关系为:
SCL---PA9
SDA--- PA8
CS --- PA3
对所用引脚进行配置的函数为:
void MAX7219_Configure(void)复制代码
{
GPIO_InitTypeDefGPIO_InitStruct;
RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOA, ENABLE);
GPIO_StructInit(&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_8 | GPIO_Pin_9;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode =GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStruct);
}
为便于所用引脚的高低电平输出,所作的语句定义为:#define DIN_SetHigh() GPIO_WriteBit(GPIOA, GPIO_Pin_8 ,1)#define DIN_SetLow() GPIO_WriteBit(GPIOA, GPIO_Pin_8 ,0)#define CLK_SetHigh() GPIO_WriteBit(GPIOA, GPIO_Pin_9 ,1)#define CLK_SetLow() GPIO_WriteBit(GPIOA, GPIO_Pin_9 ,0)#define CS_SetHigh() GPIO_WriteBit(GPIOA, GPIO_Pin_3 ,1)#define CS_SetLow() GPIO_WriteBit(GPIOA, GPIO_Pin_3 ,0)
由于该显示模块所使用的芯片为MAX7219,因此为它配置了一个串行发送字节数据的函数,其内容为:void Write_Max7219_byte(char DATA)复制代码
{
char i;
CS_SetLow();
for(i=8;i>=1;i--)
{
CLK_SetLow();
if(DATA&0x80)
DIN_SetHigh();
else
DIN_SetLow();
DATA=DATA<<1;
CLK_SetHigh();
}
}
以函数Write_Max7219_byte()为基础,向指定地址发送数据的函数为:void Write_Max7219(char address,chardat)复制代码
{
CS_SetLow();
Write_Max7219_byte(address);
Write_Max7219_byte(dat);
CS_SetHigh();
}
对于串行数码管显示模块,其初始化函数为:void Init_MAX7219(void)复制代码
{
Write_Max7219(0x09, 0xff);
Write_Max7219(0x0a, 0x02);
Write_Max7219(0x0b, 0x07);
Write_Max7219(0x0c, 0x01);
Write_Max7219(0x0f, 0x00);
}
要实现串行数码管显示模块的测试,相应的设置函数和循环函数为:int main(void)复制代码
{
chari,j;
unsignedint k;
PLATFORM_Init();
MAX7219_Configure();
Init_MAX7219();
Write_Max7219(1,1);
Write_Max7219(2,2);
Write_Max7219(3,3);
Write_Max7219(4,4);
Write_Max7219(5,5);
Write_Max7219(6,6);
Write_Max7219(7,7);
Write_Max7219(8,8);
while (1)
{
}
}
经程序的上传,其测试效果如图2所示。
图2 显示效果