STM32嵌入式开发:如何使用点阵工具数据在屏幕绘制点阵?
STM32点阵文字显示:点阵数据使用指南
我是嵌入式开发初学者,目前用STM32和C语言实现文字显示,但不知道怎么用点阵工具生成的点阵数据。我的尝试是把数据存入二维数组const uint8_t data[8][16],代码如下:
if (__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_13) != RESET) { LCD_Clear (0, 0, 240, 320, BACKGROUND); //data uint8_t ucTemp, ucPage, ucColumn; //ucRelativePositon = cChar - ' '; LCD_OpenWindow ( 100, 100, 32, 32 ); LCD_Write_Cmd ( CMD_SetPixel ); for ( ucPage = 0; ucPage < 16; ucPage ++ ) { for ( ucColumn = 0; ucColumn < 8; ucColumn ++) { ucTemp = data [ucPage][ucColumn]; if ( ucTemp & 0x01 ) LCD_Write_Data ( 0x001F ); else LCD_Write_Data ( 0xFFFF ); ucTemp >>= 1; } } }
代码问题分析与修正
- 数组维度与循环不匹配
原数组定义为data[8][16],但循环中ucPage遍历0到15(共16次),访问data[ucPage][ucColumn]时,当ucPage >=8会触发数组越界,导致数据错误或程序崩溃。需根据点阵尺寸调整数组:
- 若为8列×16行的点阵(常用ASCII字符规格),数组应定义为
const uint8_t data[16](每行1个字节,存储8个像素); - 若为16列×8行的点阵,数组定义为
const uint8_t data[8][2](每行2个字节,对应16个像素)。
- 像素遍历逻辑缺失
原代码仅处理了每个字节的最低位,剩余7个像素未写入。需遍历字节的每一位来输出对应像素:
修正后的示例代码(以8×16点阵为例)
if (__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_13) != RESET) { LCD_Clear(0, 0, 240, 320, BACKGROUND); uint8_t ucTemp, ucPage, ucBit; // 打开与点阵尺寸匹配的窗口:宽8,高16 LCD_OpenWindow(100, 100, 8, 16); LCD_Write_Cmd(CMD_SetPixel); // 点阵数据:替换为工具生成的8×16点阵字节 const uint8_t data[16] = {0x00, 0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C, 0x00, 0x00, 0x7E, 0x41, 0x41, 0x41, 0x41, 0x7E, 0x00}; for (ucPage = 0; ucPage < 16; ucPage++) { ucTemp = data[ucPage]; // 遍历字节的8个像素位(从高位到低位对应左到右像素) for (ucBit = 0; ucBit < 8; ucBit++) { if (ucTemp & 0x80) LCD_Write_Data(0x001F); // 前景色 else LCD_Write_Data(0xFFFF); // 背景色 ucTemp <<= 1; // 左移处理下一位 } } __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_13); // 必须清除中断标志,避免重复触发 }
关键注意事项
- 位序匹配:部分点阵工具生成的是低位对应左侧像素,此时需改为
ucTemp & 0x01判断,再通过ucTemp >>=1遍历; - 窗口尺寸:
LCD_OpenWindow的宽高需与点阵尺寸严格对应,避免写入多余区域; - 中断标志清除:处理完中断后必须调用
__HAL_GPIO_EXTI_CLEAR_IT,否则会持续触发中断。
内容的提问来源于stack exchange,提问作者David47yu yu
相关产品推荐
相关产品推荐

