单片机应用经常会用到液晶显示或者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. Android开发之Buidler模式初探结合AlertDialog.Builder解说
  2. redis bind多个ip_Spring Boot 中 Redis 的使用
  3. Linq to xml API中 XName 的奇怪实现
  4. Python 33(1) UDP协议 数据报协议 socketsever模块
  5. r语言的逻辑回归分类
  6. boost::function_types::result_type用法的测试程序
  7. OpenCV ASIFT的实例(附完整代码)
  8. 15.8.2 泛型数组
  9. 谷歌guava_Google Guava BiMaps
  10. Java——网络编程三要素
  11. java mvc 菜鸟_【java框架】SpringMVC(1)--SpringMVC入门
  12. 面试:Java线程有哪几种状态,它们之间是如何切换的
  13. 你关注什么,输出什么
  14. .net工具类 获取枚举类型的描述
  15. java中solr的面试题_【索引服务器面试题】面试问题:Solr索引文… - 看准网
  16. 超级美女抽出滤镜抠图
  17. 计算机显示器黑屏首先检查,电脑显示器黑屏怎么回事?教你处理方案
  18. [置顶] 程序员面试之道(《程序员面试笔试宝典》)之程序员如何保持身心健康?
  19. 实习总结第七谈-----------vue中element-ui的表格行高怎么控制
  20. 译:Two-stream convolutional networks for action recognition in videos

热门文章

  1. 最热BMS可直接下载!!
  2. 几何画板椭圆九种画法_详解椭圆的五种画法,很全面!!!
  3. 十套精美个人博客网站模板
  4. 山科大离散数学期末考试_西安电子科技大学网络与继续教育学院 2020 学年上学期 《离散数学》期末考试试题...
  5. 关于OBS无法捕获图像的解决方案
  6. 去除wmv等视频认证的方法
  7. AppFuse 3.0
  8. tiny6410裸机实验第0章--------------开发环境的搭建(USB转串口)
  9. 精品软件试用及分享 屏幕录像专家注册版 附下载地址
  10. js控制Windows Media Player