本帖最后由 jinglixixi 于 2023-7-11 12:38 编辑
#申请原创#
本打算先以I2C接口的OLED屏掌握第一个测试目标,无奈的是几经能力也没能成功,只好更换目的那点阵模块来测试一番。还别说,尽管它比OLED屏要多占用一个GPIO口,且它的能耗也比OLED屏要高,但它还是不负期待地被点亮了!
为了便于连接,所使用的引脚均由Arduino接口连接,点阵模块与开发板的具体连接关系为: sda---pb4 cs ---pb3 scl---pa15
图1 使用接口
为使所用引脚输出高低电平其定义语句为; #define DIN_SetHigh() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4,GPIO_PIN_SET) #define DIN_SetLow() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_RESET)
#define CS_SetHigh() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3,GPIO_PIN_SET) #define CS_SetLow() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3,GPIO_PIN_RESET)
#define CLK_SetHigh() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15,GPIO_PIN_SET)
#define CLK_SetLow() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15,GPIO_PIN_RESET)
该点阵模块所采用的芯片为Max7219,其所用引脚的配置函数为: void max7219_GPIO_Init(void)
{
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Pin = GPIO_PIN_4;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_3;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_15;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
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();
}
}
Max7219向指定寄存器发送数据的函数为: void Write_Max7219(char address,chardat)
{
CS_SetLow();
Write_Max7219_byte(address);
Write_Max7219_byte(dat);
CS_SetHigh();
}
Max7219的初始化函数为: void Init_MAX7219_D(void)
{
Write_Max7219(0x0b, 0x07);
Write_Max7219(0x0c, 0x01);
Write_Max7219(0x0f, 0x00);
}
为进行测试,其主程序为: int main(void)
{
unsigned int i,k,j=0;
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_ICACHE_Init();
max7219_GPIO_Init();
Init_MAX7219();
while(1)
{
for(j=0;j<38;j++)
{
for(i=1;i<9;i++)
{
Write_Max7219(i,disp[j][i-1]);
HAL_Delay(40);
}
HAL_Delay(200);
}
}
}
经程序的编译和下载,其显示效果如图2至图4所示。 图2 显示数字
图3 显示字符
图4 显示中文
视频演示:
|