LOCAL S32 led_screen_get_asc_code(wchar_t ch, U8 *buff) { FILE *font_lib = NULL; if((font_lib = fopen(LED_SCREEN_DISPLAY_ASCII_FONT_LIB, "rb")) == NULL) { LSD_ERROR("open %s failed!", LED_SCREEN_DISPLAY_ASCII_FONT_LIB); return ERROR; } fseek(font_lib, ch * 16 + 1, SEEK_SET); fread(buff, 16, 1, font_lib); fclose(font_lib); font_lib = NULL; return OK; }这个是led_screen_get_asc_code()函数,帮我修改一下
时间: 2024-02-12 12:06:00 浏览: 90
下面是修改后的 `led_screen_get_asc_code()` 函数,将ASCII字符的点阵数据升级为16列点阵,即每行点阵数据重复一遍,使其和中文字符的点阵数据一致:
```c
LOCAL S32 led_screen_get_asc_code(wchar_t ch, U8 *buff) {
FILE *font_lib = NULL;
if((font_lib = fopen(LED_SCREEN_DISPLAY_ASCII_FONT_LIB, "rb")) == NULL)
{
LSD_ERROR("open %s failed!", LED_SCREEN_DISPLAY_ASCII_FONT_LIB);
return ERROR;
}
fseek(font_lib, ch * 16 + 1, SEEK_SET);
fread(buff, 8, 1, font_lib); // 读取8列点阵数据
for (int i = 8; i < 16; i++) { // 将点阵数据复制到后面8列
memcpy(buff + i * 2, buff + (i - 8) * 2, 2);
}
fclose(font_lib);
font_lib = NULL;
return OK;
}
```
修改后的函数首先读取ASCII字符的点阵数据,读取的列数从原来的8列改为16列,即每行点阵数据重复一遍。然后使用 `memcpy()` 函数将前8列点阵数据复制到后8列,从而得到一个完整的16列点阵数据。最后关闭字库文件并返回点阵数据。
需要注意的是,修改ASCII字符的点阵数据可能会影响其他部分的代码,特别是在显示时需要考虑到原来占用8列的ASCII字符现在占用16列,可能需要对显示代码进行相应的修改。
阅读全文