单片机控制点阵字符显示及字模提取原理
单片机应用经常会用到液晶显示或者LED点阵屏,是用点阵的方式显示的,要显示汉字或字符的时候会用到字模,字模就是字在点阵上显示时对应的编码。以字模的方式存储图形或者文字,每一个点都需要一个bit位来存储,该位为0代表该像素点不显示,为1代表显示。这样,一个字节就可以存储8个像素点的显示情况。
一般采用宋体小四号的字符来做显示,这样一个英文字符刚好占8*16个像素;而汉字需要两倍,即16*16像素来显示一个汉字。这样,存储一个英文字符每行8个点需要1个字节存储,一共16行需要16个字节,
同理一个汉字需要32个
所以如果M这个英文字符按从左到右从上到下的方式从高位到低位取模
![](http://hzy3774.iteye.com/images/icon_star.png)
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 1 1 1 0 1 1 1 0
- 0 1 1 0 1 1 0 0
- 0 1 1 0 1 1 0 0
- 0 1 1 0 1 1 0 0
- 0 1 1 0 1 1 0 0
- 0 1 0 1 0 1 0 0
- 0 1 0 1 0 1 0 0
- 0 1 0 1 0 1 0 0
- 0 1 0 1 0 1 0 0
- 0 1 0 1 0 1 0 0
- 1 1 0 1 0 1 1 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
其中为1的地方画出了M的形状;如果把0换成空格,由1拼成的M就显示出来了:
![](http://hzy3774.iteye.com/images/icon_star.png)
- 1 1 1 1 1 1
- 1 1 1 1
- 1 1 1 1
- 1 1 1 1
- 1 1 1 1
- 1 1 1
- 1 1 1
- 1 1 1
- 1 1 1
- 1 1 1
- 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
这些数组可以通过软件计算出来,我们只需要在单片机中通过代码读取这些数据就可以显示出来了,
解析过程与编码这些数据是刚好相反的。
![](http://hzy3774.iteye.com/images/icon_star.png)
- #include <stdio.h>
- #include <stdlib.h>
- unsigned char am[] = {0x00,0x00,0x00,0xEE,0x6C,0x6C,0x6C,0x6C,0x54,0x54,0x54,0x54,0x54,0xD6,0x00,0x00}; //M
- void showM(){
- int i,j;
- unsigned char t;
- for (i = 0; i < 16; ++i) { //对于每一行
- t = am[i]; //取出代表这一行点的数据
- for (j = 0; j < 8; ++j) { //对于这行中的每个点
- if (0x80 & t) { //从左到右如果最左位1,则显示
- printf("MM");
- }else{
- printf(" ");
- }
- t <<= 1; //将右边的数据往左移动
- }
- printf("\n");
- }
- }
- int main(void) {
- showM();
- return EXIT_SUCCESS;
- }
然而,对于中文字符,每个汉字每行有16个像素,需要2个字节,所以每行需要对两个字节数据进行打印,所以要增加一个for循环:
![](http://hzy3774.iteye.com/images/icon_star.png)
- #include <stdio.h>
- #include <stdlib.h>
- unsigned 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
- };
- void showM()
- {
- int i, j;
- unsigned 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,则显示
- printf("MM");
- }
- else
- {
- printf(" ");
- }
- t <<= 1; //将右边的数据往左移动
- }
- for (j = 0; j < 8; ++j)//打印右半边像素
- { //对于这行中的每个点
- if (0x80 & u)
- { //从左到右如果最左位1,则显示
- printf("MM");
- }
- else
- {
- printf(" ");
- }
- u <<= 1; //将右边的数据往左移动
- }
- printf("\n");
- }
- }
- int main(void) {
- showM();
- return EXIT_SUCCESS;
- }
打印结果:
![](http://hzy3774.iteye.com/images/icon_star.png)
- MM MMMMMMMM
- MM MMMMMMMMMM
- MM MM MM MM
- MMMMMMMMMM MM MM MM
- MM MMMMMMMMMMMMMMMMMMMM
- MM MMMMMM
- MM MM MM MM MM
- MMMM MM MM MMMMMM
- MMMM MMMMMMMMMMMMMMMMMMMM
- MM MM MM MM MM
- MM MM MM MM
- MM MMMMMMMMMMMMMM
- MM MM MM MM
- MM MM MM MM
- MM MM MMMMMMMMMMMMMM
- 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();}
}
单片机控制点阵字符显示及字模提取原理相关推荐
- 单片机控制步进电机T型加速实现原理
单片机控制步进电机是通过时钟计数器计算次数产生脉冲 T型加速转换到数学计算 计数器每秒钟计数c=1000000次 脉冲频率从 v0 = 4K 到v = 40K次 v0时每个脉冲需要计数 m0 ...
- 51单片机LED点阵控制原理、74HC595工作原理和字母和滚动显示实验代码
目录 1. 74HC595工作原理图解 2.LED点阵控制原理 3.点阵LED实验 3.1 配置74HC595代码 3.2 D点阵LED显示H 3.3 滚动LED (1) 滚动扫描图示 (2)程序代码 ...
- 51单片机控制彩色点阵制作沙漏型交通灯
本文介绍了彩色点阵的使用,以及利用51单片机控制点阵制作的沙漏型交通灯,希望对打算用点阵做课程设计的同学有点帮助. 一.效果展示 二.彩色点阵的使用 彩色点阵有32个引脚,这里以背面图来讲 ...
- 单片机原理及其应用——单片机控制按键依次点亮8只发光二极管
目录 一.实验要求 二.Proteus仿真软件画原理图 三.Keil编程软件编写程序 四.实验结果 (一)仿真结果 (二)连接电路 (三)烧录并观察实验现象 结语 一.实验要求 [实验目的] 1.了解 ...
- 单片机原理及其应用——单片机控制按键点亮发光二极管
目录 一.实验要求 二.分析 (一)电路原理 (二)机械式按键的抖动时间与解决方法 三.Proteus仿真软件画原理图 四.Keil编程软件编写程序 五.实验结果 (一)仿真结果 (二)连接电路烧录 ...
- 单片机原理及其应用——单片机控制8只发光二极管交替闪烁
目录 一.实验要求 二.分析 三.利用Proteus仿真软件画原理图 四.Keil编程软件编写程序 五.实验结果 一.实验要求 [实验内容] 1.用Proteus绘制硬件原理图,并设置元件参数. 2. ...
- 使用51单片机和MAX7219控制点阵滚动显示
最近玩MAX7129控制点阵,弄了一个用51和MAX7219控制两个1088AS点阵滚动显示.此文章作为总结.方便自己日后需要时回顾,也方便他人借鉴参考.文中如果有地方不准确,有错误,欢迎指正. 这次 ...
- 了解这些原理,实践到用单片机控制LED时,就没想象中那么难理解
全新的五号电池的电压为1.5V,而废旧的五号电池的电压接近1V,对于旧电池,我们一般选择报废处理,其实呢,废旧的电池内部还有一些能量,那怎么榨干电池的最后这一点能量? 焦耳小偷电路便是一个不错的选择, ...
- led version 2.0 摇摇棒编程软件c 语言,基于单片机控制LED摇摇棒的解决方案 - 全文...
摇摇棒本为开发套件,全部采用直插的器件.显示的LED采用了5mm超高亮30度聚光发光二极管,共 32只.控制芯片采用宏晶单片机STC11F03E,其内部有3K的程序存储空间,256字节的数据存储空间, ...
- 51单片机 | LED点阵实验 | 点亮一个点 | 显示数字 | 显示图像
文章目录 一.LED点阵介绍 二.硬件设计 三.软件设计 1.LED点阵(点亮一个点) 2.LED点阵(显示数字) 3.LED点阵(显示图像) 四.实验现象 1.LED 点阵(点亮一个点) 2. LE ...
最新文章
- python采用Basemap绘制完美中国地图(包括绘制边界框,随机点等)
- Oracle创建用户设置权限
- windows 下搭建Web服务器
- innerhtml js执行_JS 中 DOM 操作
- 看小说有广告?不可能的,分分钟教你爬取小说
- mxnet基础到提高(35)-ndarray
- @requestparam @param @pathvariable @requestbody的区别
- OnClientClick的window.confirm无效
- python 换页_Python之路【第十九篇】自定义分页实现(模块化)
- php返回图片二进制字节数组,获取图片文件的二进制数组
- 探秘Win7计算器,这货不只是计算器
- 使用DataSet Datatable 更新数据库的三种方式及DataTable不同状态的取值
- vue学习笔记-8-循环结构
- 20210311 plecs to file 功能
- 利用身体记忆GRE词汇
- virtualbox安装.img文件
- 华为手机摄影入门到精通pdf_华为手机摄影从入门到精通
- 识别括号或花括号嵌套
- win10网络诊断为DNS服务器未响应,Win10系统下电脑无法连接网络诊断提示DNS服务器未响应解决方法...
- 先选价、再叫车 高德打车首创上线“比价叫车”
热门文章
- JAVA ME游戏----个人移植:9688雷霆战机
- VS2008安装失败,组件安装失败的解决办法
- Linux常用软件包(常用命令)
- Android 10.0 PackageManagerService(四)APK安装流程-[Android取经之路]
- 手机 android.downloader病毒,Android手机出现史上最强木马 感染后无法删除
- element ui html编辑器,vue+element-ui 使用富文本编辑器
- onlyoffice源码编译环境搭建破解
- MySQL8安装详细步骤
- java日志文件采集,日志收集十大技术细节
- 《学习笔记》使用AngularJS模板来创建视图