本部分2个工作:
① 向 AT25F4096 写入部分 HZK8x16 转化后的 “列行式” 数据
② 解码 GB2312 字符,根据码值,去 AT25F4096 中寻找对应的点阵数据,然后送入 OLED 显示

为OLED制作汉字字库_第4部分

  • 1 看看别人的字库怎么做的
    • 1.1 高通字库
    • 1.2 GB2312 部分区位码
    • 1.3 C语言文件操作
      • 1.3.1 生成每个区的字形码
      • 1.3.2 Keil 上编写代码测试
      • -------------------附录:乱七八糟的---------------------
  • 附录 C语言文件操作函数
    • 1.3.1.1 创建/打开文件
      • 打开/关闭文件测试代码
      • 创建/关闭文件测试代码
      • 创建/打开/读/关闭文件测试代码
      • 读写方式
    • 格式化读写
    • 1.3.1.2 关闭
    • 1.3.1.3 定位
    • 1.3.1.4 读取

1 看看别人的字库怎么做的

1.1 高通字库

先看看别人怎么做的:这方面的龙头大哥——“高通字库”
http://www.gaotongfont.cn/index.html

利用“高通字库”生成个超级大的“列行式”点阵数据数组:

总计
21657632=6768\frac{216576}{32} = 6768 32216576​=6768
问题:不是说 6763 个汉字吗?为啥这里算出来是 6768 个呢?多出来 5 个在哪里 ?
:在 55 区有 5 个空位

1.2 GB2312 部分区位码



1.3 C语言文件操作

用“高通字库”软件,生成了GB2312字库的点阵字形码,将这些字形码按照区生成一个个小文件,方便使用。考验“文件操作”功底的时候到了!!!

1.3.1 生成每个区的字形码

因为“高通字库”软件生成的原始数组太大了,系统处理不了这么大的数组,只能 “分成两半” 处理,定义偏移量 OFFSET == 16,汉字从16区开始,然后到 55 区时,(手动更改 OFFSET = 55) 再分割一次,劈成两半,系统就能够处理了!每次处理时,不用的另一半注释掉!!!
① 16 ~ 54 第一部分
② 55 ~ 87 第二部分

#define OFFSET   16
void generateRegionCode(int region){if(region < OFFSET){return;}char buf[64] = "./Font16_16/region_";sprintf(buf, "%s%d", buf, region);strcat(buf, ".c");// puts(buf);FILE *pf = fopen(buf, "w");if(pf == NULL){perror("file open failed:");return;}sprintf(buf, "const unsigned char region_%d_dat[%d] = {\n", region, 94 * 32);fputs(buf, pf);for(int n = 0; n < 94; n++){fprintf(pf, "// GB2312[%02d%02d][0x%.2X%.2X][0x%.2X%.2X]\n", region, n + 1, region, n + 1, region + 0xA0, n + 1 + 0xA0);for(int k = 0; k < 2; k++){ // One character HZK16x16, 32 bytesfprintf(pf, "    ");for(int j = 0; j < 16; j++){fprintf(pf, "0x%.2x,", bin_data[(region - OFFSET) * 94 * 32 + n * 32 + k * 16 + j]);if((j + 1) % 8 == 0){fprintf(pf, "  ");}}fputs("\n", pf);} // One character}fputs("}", pf);fclose(pf);
}
void splitFontArray(int region_begin, int region_end){if(region_begin > region_end){int tmp = region_begin;region_begin = region_end;region_end = tmp;}for(int i = region_begin; i < region_end + 1; i++){ // Chinese character is from region 16generateRegionCode(i);}
}
int main(int argc, char *argv[]){printf("There are %d bytes int bin_data[]\r\n", sizeof(bin_data) / sizeof(bin_data[0]));printf("There are %lld font. \r\n", sizeof(bin_data) / sizeof(bin_data[0]) / 32);splitFontArray(16, 54);return 0;
}

1.3.2 Keil 上编写代码测试

uint8_t const code chinese[32] = {//    0xfe,0x02,0x02,0xfe,0x00,0xfe,0x32,0xce,0x00,0xf2,0x12,0xf2,0x02,0xfe,0x02,0x00,
//    0x07,0x02,0x02,0x07,0x00,0xff,0x04,0x07,0x00,0x07,0x04,0x47,0x80,0x7f,0x00,0x00,0x00,0x00,0x80,0xbe,0xab,0xaa,0xaa,0xbe,  0x80,0x24,0x94,0x8c,0xbf,0x8c,0x94,0x24,  0x00,0x20,0xaf,0x6a,0x2a,0x2f,0x2a,0xea,  0x2f,0x60,0x5f,0x4a,0x4a,0x4a,0x5f,0x40,
};
void oled_show_chanese16x16(void){uint8_t i = 0;uint8_t j = 0;for(j = 0; j < 2; j++){// Set GDDRAM Page Start Address(PAGE0~PAGE7) for Page Addressing Mode by X[2:0].oled_write_cmd(0xB0 | j); // 0xB0|X[2:0]oled_write_cmd(0x00); // 0c00|X[3:0], Set Lower Column Start Address for Page Addressing Modeoled_write_cmd(0x10); // 0x10|X[3:0], Set Higher Column Start Address for Page Addressing Modefor(i = 0; i < 16; i++){oled_write_dat(chinese[j * 16 + i]);}}
}
int main(void){oled_init();delay_ms(500);oled_show_chanese16x16();while(1){}
//    return 0;
}

-------------------附录:乱七八糟的---------------------

附录 C语言文件操作函数

1.3.1.1 创建/打开文件

FILE *fopen(const char *filename,const char *mode
);
FILE *_wfopen(const wchar_t *filename,const wchar_t *mode
);

size_t fwrite(const void *buffer,size_t size,size_t count,FILE *stream
);

打开/关闭文件测试代码

打开文件

void fileCreate(){FILE *pf = fopen("./helloFile.txt", "w");if(pf == NULL){perror("open file failed:");return;}fclose(pf);
}

创建/关闭文件测试代码
void fileCreate(){FILE *pf = fopen("./helloFile.txt", "w");if(pf == NULL){perror("open file failed:");return;}
}
创建/打开/读/关闭文件测试代码
int main(int argc, char *argv[]){fileCreate();fileRead();return 0;
}
void fileCreate(){FILE *pf = fopen("./helloFile.txt", "w");if(pf == NULL){perror("open file failed:");return;}fwrite("hello, file!", 1, strlen("hello, file!"), pf);fclose(pf);
}
void fileRead(){FILE *pf = fopen("./helloFile.txt", "r");if(pf == NULL){perror("open file failed:");return;}char ch;// while(ch != EOF){//     ch = fgetc(pf);//  printf("%c", ch);// }while(!feof(pf)){ch = fgetc(pf);printf("%c", ch);}fclose(pf);
}
读写方式
void fileReadWrite(){FILE *pf = fopen("./helloFile.txt", "w+"); // w+ a+ r+if(pf == NULL){perror("open file failed:");return;}int retVal = fputs("read and write mode\r\n", pf);printf("return value of fputs() is %d\r\n", retVal);fputs("鸡腿", pf);fputs("鸭腿", pf);fputs("兔腿", pf);rewind(pf); // Position pointer relocationchar buf[128] = {0};while(!feof(pf)){fgets(buf, sizeof(buf), pf);printf("%s\r\n", buf);}fclose(pf);
}

格式化读写

1.3.1.2 关闭

1.3.1.3 定位

1.3.1.4 读取

单片机作业1_为OLED制作汉字字库_第4部分相关推荐

  1. 单片机作业1_为OLED制作汉字字库_第3部分

    OLED12864 显示英文字符 1 PC端生成列行式点阵数据 1.1 控制台仿真显示逐行式8x16字符 1.1.1 打印显示1个字节的位模式 1.1.2 控制台仿真显示"逐行式" ...

  2. stm32汉字字库显示实验与OLED的使用(开始于2021-09-01)

    stm32汉字字库显示实验与OLED的使用 1.字库的使用 GBK字库的简介: GBK库的由两部分组成,如下图: 高位从0x81开始是为了兼容ASII字符,因为未扩展的ASII字符是从0-128,即0 ...

  3. LittleVGL (LVGL)干货入门教程四之制作和使用中文汉字字库

    LittleVGL (LVGL)干货入门教程四之制作和使用中文汉字字库 前言: 阅读前,请确保你至少拥有以下条件: 已实现显示API(教程一已实现, 链接:LittleVGL (LVGL)入门教程一之 ...

  4. 单片机 怎调用显示屏字库_单片机巧用Windows矢量字库

    1 引 言本文引用地址:http://www.eepw.com.cn/article/172177.htm 单片机控制的LED.LCD显示屏均涉及到各种字体的汉字显示.建立单片机汉字字库的传统方法有使 ...

  5. 0.96吋 OLED 12864 汉字 显示 优化

    辅助舍友做毕业设计中的显示部分,优化了OLED的汉字显示,简化了函数的调用方式,略有小得,留做记录.程序在最后面. 未经授权,不得转载!_(:з)∠)_ 前言 中景园的给的例程中的汉字显示函数调用方式 ...

  6. LCD / OLED显示汉字,取模软件PCtoLCD2002完美版

    一.LCD显示汉字结果展示: 二.取模软件的使用(PCtoLCD2002完美版) 1. 打开软件,模式为(字符模式) 点击菜单栏[选项],打开字模选项 勾选[阴码点阵].逐列式取模.顺向(高位在前,低 ...

  7. 0.96寸OLED显示汉字,数字,英文,图片,GIF动画+取模软件使用+代码解析

    前言 本次我们学习一下STM32F103关于OLED显示汉字,数字,英文,图片,GIF动画,和介绍各种取模软件的使用,主要教会大家使用和修改OLED驱动的代码,对汉字大小,图片分辨率进行代码修改并显示 ...

  8. c语言oled p14x16str,OLED显示汉字

    OLED显示汉字 工具:OLED 芯片:K60,XS128等 取模软件:PCtoLCD2002完美版 显示汉字需要几个条件: 汉字索引表, const byte F14x16_Idx[] = { &q ...

  9. .net 数字转汉字_[原创工具] 小熊汉字笔顺学习软件,查笔顺、学拼音、制作汉字英文数字字贴...

    点击右上角"设为星标"每日精彩内容,第一时间送达! 前言 今天带来的是原创软件.家里有上一二年级的小朋友有福了!家里有打印机的可以把设置好的字帖打印出来,小朋友即可临摹.赶紧下载使 ...

最新文章

  1. java 建树源码_Java实现的二叉树常用操作【前序建树,前中后递归非递归遍历及层序遍历】...
  2. Xilinx网站资源导读
  3. 虫趣:BAD POOL CALLER (par1: 0x20)
  4. C++ 用new 动态创建多维数组
  5. java名称服务_java – UnknownHostException:名称或服务未知
  6. 笔记本电脑内网、外网一起使用
  7. 智能一代云平台(三十一):mybatis加入分页
  8. HEVC官方代码下载及码流分析软件使用
  9. android 创建文件夹,文件需要注意的格式
  10. MySQL · 特性分析 · 执行计划缓存设计与实现
  11. 给Silverlight三十分钟
  12. win10 安装 HP LaserJet P1108 教程
  13. 关于csv文件最大行数和最大列数
  14. 沉没成本谬误(一):你是如何被“套牢”的?(二):吃饱撑着也要把东西吃完
  15. c语言程序规定必须用main作为,C语言学习必须清楚的事情,这就是C语言的开始...
  16. linux lzma 函数 调用,Lzma(7-zip)和zlib
  17. 134. 加油站(JS实现)
  18. RANSAC Spline Fitting
  19. 【5】依赖注入DI(Dependency Injection)
  20. RK3568平台开发系列讲解(摄像头篇)使用 Camera 的步骤

热门文章

  1. 如何低成本实现远程控制PLC与采集PLC数据?
  2. MATLAB中生成随机数方法总结
  3. 数据分析之“设立标准、判断分类”
  4. 基于ai的预测_基于AI的预测性维护可增强战备状态,减少飞行故障
  5. 中望3D2022 鼠标应用
  6. 以面向对象方式编写一个计算电话费的程序
  7. 华住酒店泄露数据的暗网出售情况剖析
  8. 华为hcnp综合实验--基于园区网的真实案例
  9. 63岁工程师的退休生活:开发一款双计算器应用,仅上线22天获56800次下载量!...
  10. Win10桌面图标设置:计算机 回收站 控制面板 添加/隐藏