单片机应用经常会用到液晶显示或者LED点阵屏,是用点阵的方式显示的,要显示汉字或字符的时候会用到字模,字模就是字在点阵上显示时对应的编码。以字模的方式存储图形或者文字,每一个点都需要一个bit位来存储,该位为0代表该像素点不显示,为1代表显示。这样,一个字节就可以存储8个像素点的显示情况。

一般采用宋体小四号的字符来做显示,这样一个英文字符刚好占8*16个像素;而汉字需要两倍,即16*16像素来显示一个汉字。这样,存储一个英文字符每行8个点需要1个字节存储,一共16行需要16个字节,

 同理一个汉字需要32个

所以如果M这个英文字符按从左到右从上到下的方式从高位到低位取模

C代码  
  1. 0 0 0 0 0 0 0 0
  2. 0 0 0 0 0 0 0 0
  3. 0 0 0 0 0 0 0 0
  4. 1 1 1 0 1 1 1 0
  5. 0 1 1 0 1 1 0 0
  6. 0 1 1 0 1 1 0 0
  7. 0 1 1 0 1 1 0 0
  8. 0 1 1 0 1 1 0 0
  9. 0 1 0 1 0 1 0 0
  10. 0 1 0 1 0 1 0 0
  11. 0 1 0 1 0 1 0 0
  12. 0 1 0 1 0 1 0 0
  13. 0 1 0 1 0 1 0 0
  14. 1 1 0 1 0 1 1 0
  15. 0 0 0 0 0 0 0 0
  16. 0 0 0 0 0 0 0 0

其中为1的地方画出了M的形状;如果把0换成空格,由1拼成的M就显示出来了:

C代码  
  1. 1 1 1   1 1 1
  2. 1 1   1 1
  3. 1 1   1 1
  4. 1 1   1 1
  5. 1 1   1 1
  6. 1   1   1
  7. 1   1   1
  8. 1   1   1
  9. 1   1   1
  10. 1   1   1
  11. 1 1   1   1 1

因此,我们要记录16行中每一行由0和1组成的一字节整数的值,就记录了这张位图;   
如第1,2,3行是00000000,它的值为0,第四行是11101110,用十六进制表示就是0xee;

以此类推,得到16个单字节整数:0x00,0x00,0x00,0xEE,0x6C,0x6C,0x6C,0x6C,0x54,0x54,0x54,0x54,0x54,0xD6,0x00,0x00

这些数组可以通过软件计算出来,我们只需要在单片机中通过代码读取这些数据就可以显示出来了,

解析过程与编码这些数据是刚好相反的。

C代码  
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. unsigned char am[] = {0x00,0x00,0x00,0xEE,0x6C,0x6C,0x6C,0x6C,0x54,0x54,0x54,0x54,0x54,0xD6,0x00,0x00}; //M
  4. void showM(){
  5. int i,j;
  6. unsigned char t;
  7. for (i = 0; i < 16; ++i) {   //对于每一行
  8. t = am[i];              //取出代表这一行点的数据
  9. for (j = 0; j < 8; ++j) {    //对于这行中的每个点
  10. if (0x80 & t) {     //从左到右如果最左位1,则显示
  11. printf("MM");
  12. }else{
  13. printf("  ");
  14. }
  15. t <<= 1;          //将右边的数据往左移动
  16. }
  17. printf("\n");
  18. }
  19. }
  20. int main(void) {
  21. showM();
  22. return EXIT_SUCCESS;
  23. }

然而,对于中文字符,每个汉字每行有16个像素,需要2个字节,所以每行需要对两个字节数据进行打印,所以要增加一个for循环:

C代码  
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. unsigned char ch[] = {
  4. /*--  文字:  播  --*/
  5. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  6. 0x20,0x3C,0x27,0xC0,0x22,0x48,0xF9,0x50,0x27,0xFE,0x20,0xE0,0x29,0x50,0x32,0x4E,
  7. 0x6F,0xFC,0xA2,0x48,0x22,0x48,0x23,0xF8,0x22,0x48,0x22,0x48,0xA3,0xF8,0x42,0x08
  8. };
  9. void showM()
  10. {
  11. int i, j;
  12. unsigned char t, u;     //分别表示一个汉字每行的左半边8像素和右半边8像素
  13. for (i = 0; i < 16; ++i)
  14. {   //对于每一行
  15. t = ch[i * 2];              //取出代表这一行点的数据
  16. u = ch[i * 2 + 1];
  17. for (j = 0; j < 8; ++j)//打印左半边像素
  18. {   //对于这行中的每个点
  19. if (0x80 & t)
  20. {       //从左到右如果最左位1,则显示
  21. printf("MM");
  22. }
  23. else
  24. {
  25. printf("  ");
  26. }
  27. t <<= 1;          //将右边的数据往左移动
  28. }
  29. for (j = 0; j < 8; ++j)//打印右半边像素
  30. {   //对于这行中的每个点
  31. if (0x80 & u)
  32. {       //从左到右如果最左位1,则显示
  33. printf("MM");
  34. }
  35. else
  36. {
  37. printf("  ");
  38. }
  39. u <<= 1;          //将右边的数据往左移动
  40. }
  41. printf("\n");
  42. }
  43. }
  44. int main(void) {
  45. showM();
  46. return EXIT_SUCCESS;
  47. }

打印结果:

C代码  
  1. MM              MMMMMMMM
  2. MM    MMMMMMMMMM
  3. MM      MM    MM    MM
  4. MMMMMMMMMM    MM  MM  MM
  5. MM    MMMMMMMMMMMMMMMMMMMM
  6. MM          MMMMMM
  7. MM  MM    MM  MM  MM
  8. MMMM    MM    MM    MMMMMM
  9. MMMM  MMMMMMMMMMMMMMMMMMMM
  10. MM  MM      MM    MM    MM
  11. MM      MM    MM    MM
  12. MM      MMMMMMMMMMMMMM
  13. MM      MM    MM    MM
  14. MM      MM    MM    MM
  15. MM  MM      MMMMMMMMMMMMMM
  16. MM        MM          MM

这样就显示了一个汉字。

  • 字模提取2.2.zip (256.6 KB)
  • 下载次数: 16
public class en {public static char am[] = {0x00,0x00,0x00,0xEE,0x6C,0x6C,0x6C,0x6C,0x54,0x54,0x54,0x54,0x54,0xD6,0x00,0x00}; //M public static void showM(){  int i,j;  char t;  for (i = 0; i < 16; ++i) {   //对于每一行  t = am[i];              //取出代表这一行点的数据  for (j = 0; j < 8; ++j) {    //对于这行中的每个点  if ((0x80&t)>0) {     //从左到右如果最左位1,则显示  System.out.print("MM");  }else{System.out.print("  ");  }t <<= 1;//将右边的数据往左移动  }  System.out.println();  }  }  public static void main(String[] args) {showM();  }}public class cn {public static char ch[] = {/*--  文字:  播  --*//*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/0x20, 0x3C, 0x27, 0xC0, 0x22, 0x48, 0xF9, 0x50, 0x27, 0xFE, 0x20, 0xE0, 0x29, 0x50, 0x32, 0x4E, 0x6F, 0xFC,0xA2, 0x48, 0x22, 0x48, 0x23, 0xF8, 0x22, 0x48, 0x22, 0x48, 0xA3, 0xF8, 0x42, 0x08 };public static void showM() {int i, j;char t, u; //分别表示一个汉字每行的左半边8像素和右半边8像素for (i = 0; i < 16; ++i) { // 对于每一行t = ch[i * 2]; // 取出代表这一行点的数据u = ch[i * 2 + 1];for (j = 0; j < 8; ++j)// 打印左半边像素{ // 对于这行中的每个点if ((0x80 & t) > 1) { // 从左到右如果最左位1,则显示System.out.print("MM");} else {System.out.print("  ");}t <<= 1; // 将右边的数据往左移动}for (j = 0; j < 8; ++j)// 打印右半边像素{ // 对于这行中的每个点if ((0x80 & u) > 1) { // 从左到右如果最左位1,则显示System.out.print("MM");} else {System.out.print("  ");}u <<= 1; // 将右边的数据往左移动}System.out.println();}}public static void main(String[] args) {showM();}
}

单片机控制点阵字符显示及字模提取原理相关推荐

  1. 单片机控制步进电机T型加速实现原理

     单片机控制步进电机是通过时钟计数器计算次数产生脉冲 T型加速转换到数学计算 计数器每秒钟计数c=1000000次 脉冲频率从 v0 = 4K 到v = 40K次  v0时每个脉冲需要计数 m0 ...

  2. 51单片机LED点阵控制原理、74HC595工作原理和字母和滚动显示实验代码

    目录 1. 74HC595工作原理图解 2.LED点阵控制原理 3.点阵LED实验 3.1 配置74HC595代码 3.2 D点阵LED显示H 3.3 滚动LED (1) 滚动扫描图示 (2)程序代码 ...

  3. 51单片机控制彩色点阵制作沙漏型交通灯

    本文介绍了彩色点阵的使用,以及利用51单片机控制点阵制作的沙漏型交通灯,希望对打算用点阵做课程设计的同学有点帮助. 一.效果展示       二.彩色点阵的使用 彩色点阵有32个引脚,这里以背面图来讲 ...

  4. 单片机原理及其应用——单片机控制按键依次点亮8只发光二极管

    目录 一.实验要求 二.Proteus仿真软件画原理图 三.Keil编程软件编写程序 四.实验结果 (一)仿真结果 (二)连接电路 (三)烧录并观察实验现象 结语 一.实验要求 [实验目的] 1.了解 ...

  5. 单片机原理及其应用——单片机控制按键点亮发光二极管

    目录 一.实验要求 二.分析 (一)电路原理 (二)机械式按键的抖动时间与解决方法 三.Proteus仿真软件画原理图 四.Keil编程软件编写程序 五.实验结果 (一)仿真结果 (二)连接电路烧录 ...

  6. 单片机原理及其应用——单片机控制8只发光二极管交替闪烁

    目录 一.实验要求 二.分析 三.利用Proteus仿真软件画原理图 四.Keil编程软件编写程序 五.实验结果 一.实验要求 [实验内容] 1.用Proteus绘制硬件原理图,并设置元件参数. 2. ...

  7. 使用51单片机和MAX7219控制点阵滚动显示

    最近玩MAX7129控制点阵,弄了一个用51和MAX7219控制两个1088AS点阵滚动显示.此文章作为总结.方便自己日后需要时回顾,也方便他人借鉴参考.文中如果有地方不准确,有错误,欢迎指正. 这次 ...

  8. 了解这些原理,实践到用单片机控制LED时,就没想象中那么难理解

    全新的五号电池的电压为1.5V,而废旧的五号电池的电压接近1V,对于旧电池,我们一般选择报废处理,其实呢,废旧的电池内部还有一些能量,那怎么榨干电池的最后这一点能量? 焦耳小偷电路便是一个不错的选择, ...

  9. led version 2.0 摇摇棒编程软件c 语言,基于单片机控制LED摇摇棒的解决方案 - 全文...

    摇摇棒本为开发套件,全部采用直插的器件.显示的LED采用了5mm超高亮30度聚光发光二极管,共 32只.控制芯片采用宏晶单片机STC11F03E,其内部有3K的程序存储空间,256字节的数据存储空间, ...

  10. 51单片机 | LED点阵实验 | 点亮一个点 | 显示数字 | 显示图像

    文章目录 一.LED点阵介绍 二.硬件设计 三.软件设计 1.LED点阵(点亮一个点) 2.LED点阵(显示数字) 3.LED点阵(显示图像) 四.实验现象 1.LED 点阵(点亮一个点) 2. LE ...

最新文章

  1. python采用Basemap绘制完美中国地图(包括绘制边界框,随机点等)
  2. Oracle创建用户设置权限
  3. windows 下搭建Web服务器
  4. innerhtml js执行_JS 中 DOM 操作
  5. 看小说有广告?不可能的,分分钟教你爬取小说
  6. mxnet基础到提高(35)-ndarray
  7. @requestparam @param @pathvariable @requestbody的区别
  8. OnClientClick的window.confirm无效
  9. python 换页_Python之路【第十九篇】自定义分页实现(模块化)
  10. php返回图片二进制字节数组,获取图片文件的二进制数组
  11. 探秘Win7计算器,这货不只是计算器
  12. 使用DataSet Datatable 更新数据库的三种方式及DataTable不同状态的取值
  13. vue学习笔记-8-循环结构
  14. 20210311 plecs to file 功能
  15. 利用身体记忆GRE词汇
  16. virtualbox安装.img文件
  17. 华为手机摄影入门到精通pdf_华为手机摄影从入门到精通
  18. 识别括号或花括号嵌套
  19. win10网络诊断为DNS服务器未响应,Win10系统下电脑无法连接网络诊断提示DNS服务器未响应解决方法...
  20. 先选价、再叫车 高德打车首创上线“比价叫车”

热门文章

  1. JAVA ME游戏----个人移植:9688雷霆战机
  2. VS2008安装失败,组件安装失败的解决办法
  3. Linux常用软件包(常用命令)
  4. Android 10.0 PackageManagerService(四)APK安装流程-[Android取经之路]
  5. 手机 android.downloader病毒,Android手机出现史上最强木马 感染后无法删除
  6. element ui html编辑器,vue+element-ui 使用富文本编辑器
  7. onlyoffice源码编译环境搭建破解
  8. MySQL8安装详细步骤
  9. java日志文件采集,日志收集十大技术细节
  10. 《学习笔记》使用AngularJS模板来创建视图