本帖最后由 jinglixixi 于 2023-5-6 09:31 编辑
有了GPIO口的支持,就可以拿点阵模块来试一试手了。
所用的点阵模块是一块8*8点阵的显示模块,共有5个引脚,除电源引脚外,另外3个引脚与开发板的连接关系为:
SCL ---PB8
SDA ---PB4
CS ---PB5
对所用引脚的工作模式配置函数为:
void MAX7219_Init(void)
{
GPIO_InitType GPIO_InitStructure;
RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOB, ENABLE);
GPIO_InitStruct(&GPIO_InitStructure);
GPIO_InitStructure.Pin = GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_8;
GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitPeripheral(GPIOB, &GPIO_InitStructure);
}
Max7219发送字节数据的函数为:
void Write_Max7219_byte(char DATA)
{
char i;
GPIO_ResetBits(GPIOB, GPIO_PIN_5); //CS
for(i=8;i>=1;i--)
{
GPIO_ResetBits(GPIOB, GPIO_PIN_8); //SCL
if(DATA&0x80)
{
GPIO_SetBits(GPIOB, GPIO_PIN_4); // SDA;
}
else
{
GPIO_ResetBits(GPIOB, GPIO_PIN_4);
}
DATA=DATA<<1;
GPIO_SetBits(GPIOB, GPIO_PIN_8);
}
}
Max7219向指定地址发送数据的函数为:
void Write_Max7219(char address,char dat)
{
GPIO_ResetBits(GPIOB, GPIO_PIN_5);
Write_Max7219_byte(address);
Write_Max7219_byte(dat);
GPIO_SetBits(GPIOB, GPIO_PIN_5);
}
对Max7219进行初始化的函数为:
void Init_MAX7219_D(void)
{
Write_Max7219(0x0b, 0x07);
Write_Max7219(0x0c, 0x01);
Write_Max7219(0x0f, 0x00);
}
以此为基础,实现点阵模块显示的主程序为:
int main(void)
{
unsigned char i,j;
MAX7219_Init();
Init_MAX7219_D();
while(1)
{
for(j=0;j<38;j++)
{
for(i=1;i<9;i++)
{
Write_Max7219(i,disp[j][i-1]);
}
Delay(0x28FFFF);
}
}
}
经程序的编译与下载,其运行的效果如图1至图3所示。
图1 显示数字
图2 显示字符
图3 显示汉字
显示这些内容的字库结构为:
const unsigned char disp[38][8]={
{0x3C,0x42,0x42,0x42,0x42,0x42,0x42,0x3C},//0
{0x10,0x30,0x50,0x10,0x10,0x10,0x10,0x10},//1
...
{0x8,0x14,0x22,0x3E,0x22,0x22,0x22,0x22},//A
{0x3C,0x22,0x22,0x3E,0x22,0x22,0x3C,0x0},//B
...
{0x8,0x7F,0x49,0x49,0x7F,0x8,0x8,0x8},//?
{0xFE,0xBA,0x92,0xBA,0x92,0x9A,0xBA,0xFE},//?
};
由于该点阵模块是可以级联来使用,故为了同时可以显示出更多的内容,可将几个同样的点阵模块串联起来来使用。