单片机控制点阵字符显示及字模提取原理
单片机应用经常会用到液晶显示或者LED点阵屏,是用点阵的方式显示的,要显示汉字或字符的时候会用到字模,字模就是字在点阵上显示时对应的编码。以字模的方式存储图形或者文字,每一个点都需要一个bit位来存储,该位为0代表该像素点不显示,为1代表显示。这样,一个字节就可以存储8个像素点的显示情况。
一般采用宋体小四号的字符来做显示,这样一个英文字符刚好占8*16个像素;而汉字需要两倍,即16*16像素来显示一个汉字。这样,存储一个英文字符每行8个点需要1个字节存储,一共16行需要16个字节,
同理一个汉字需要32个
所以如果M这个英文字符按从左到右从上到下的方式从高位到低位取模
- 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就显示出来了:
- 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
这些数组可以通过软件计算出来,我们只需要在单片机中通过代码读取这些数据就可以显示出来了,
解析过程与编码这些数据是刚好相反的。
- #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循环:
- #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;
- }
打印结果:
- 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 ...
最新文章
- Android开发之Buidler模式初探结合AlertDialog.Builder解说
- redis bind多个ip_Spring Boot 中 Redis 的使用
- Linq to xml API中 XName 的奇怪实现
- Python 33(1) UDP协议 数据报协议 socketsever模块
- r语言的逻辑回归分类
- boost::function_types::result_type用法的测试程序
- OpenCV ASIFT的实例(附完整代码)
- 15.8.2 泛型数组
- 谷歌guava_Google Guava BiMaps
- Java——网络编程三要素
- java mvc 菜鸟_【java框架】SpringMVC(1)--SpringMVC入门
- 面试:Java线程有哪几种状态,它们之间是如何切换的
- 你关注什么,输出什么
- .net工具类 获取枚举类型的描述
- java中solr的面试题_【索引服务器面试题】面试问题:Solr索引文… - 看准网
- 超级美女抽出滤镜抠图
- 计算机显示器黑屏首先检查,电脑显示器黑屏怎么回事?教你处理方案
- [置顶] 程序员面试之道(《程序员面试笔试宝典》)之程序员如何保持身心健康?
- 实习总结第七谈-----------vue中element-ui的表格行高怎么控制
- 译:Two-stream convolutional networks for action recognition in videos