PHP仿LED点阵,读取字库文字,并转化为二进制输出
- <?php
- $xml=simplexml_load_file("zimu.xml");//导入XML文件,从XML文件里知道需要提取的字体的信息
- $font_height=$xml->font->Size_H; //字体高
- $font_width=$xml->font->Size_L;//字体宽
- $lcdwidth=($xml->num_weight)*16;//屏幕的宽度
- $lcdheight=($xml->num_height)*32;//屏幕高度
- $Size=$font_width.$font_height; //字体的大小
- $ZiMu=$xml->character; //字内容
- $show=$xml->enter; //文字出现的效果
- $B=$xml->font->B;
- $U=$xml->font->U;
- $display=$B.$U; //是否选择加粗和下划线
- $str=mb_convert_encoding($ZiMu,"gbk","utf-8"); //把输入的字转换为GBK编码
- $strlen=strlen($str); //一个字两个字节,字节数
- if($font_height*$font_width==12*12){$font_height=16;} //因为一次扫描八位,所以要八的整数
- switch($display)//打开字库的类型
- {
- case "":$file_name="HZK/cell.bin";break; //没有加下划线和加粗功能的字库
- case "B":$file_name="HZK/B-cell.bin";break;//加粗功能的字库
- case "U":$file_name="HZK/U-cell.bin";break;//加下划线功能的字库
- case "BU":$file_name="HZK/B-U-cell.bin";break;//加下划线和加粗功能的字库
- }
- switch($Size)//不同字体大小偏移量
- {
- case 1212:$start_offset=0;break; //字的大小为12*12
- case 1216:$start_offset=0x0002FEB2;break; //字的大小为12*16
- case 1616:$start_offset=0x0005FD64;break; //字的大小为16*16
- case 1624:$start_offset=0x0009FBA6;break; //字的大小为16*24
- case 2424:$start_offset=0x000FF908;break; //字的大小为24*24
- case 2432:$start_offset=0x0018F51A;break; //字的大小为24*32
- case 3232:$start_offset=0x0024EFDC;break; //字的大小为32*32
- }
- $fp = fopen($file_name, "rb");//打开字库文件
- $offset_size=$font_width * $font_height / 8; //不同字体大小的一个字需要的字节数,一个字节有8位
- $number="";
- $word_number=(int)($lcdwidth/$font_width);//一行能放多少字
- $word_string=$word_number*2;//一行能放的字节数,一个汉字两个字节
- $circulation=0; //要循环的次数即要放多少字在一行里
- $_rows=0; //要放在第几行
- for ($i=0; $i<$strlen;$i++)//走一次提取一个字的二进制数
- {
- $dot_string="";
- if (ord($str[$i])>127) //汉字
- {
- $offset=(((ord($str[$i])-0xa1)*94)+(ord($str[$i+1])-0xa1))*$offset_size; //汉字偏移量的计算公式
- $i++; //因为汉字是两个字节,所以i加两次
- }
- else //英文,标点符号
- { $offset=(ord($str[$i])+155)*$offset_size; }//英文偏移量的计算公式
- fseek($fp, $start_offset+$offset,SEEK_SET);//把指针指到要取得字的位置
- $bindot=fread($fp, $offset_size); //提取的字
- for($j=0; $j<$offset_size; $j++) //一次转换一个字节,把一个字转换为二进制数字
- { $dot_string.= sprintf("%08b", ord($bindot[$j]));
- $total.=sprintf("%08b", ord($bindot[$j])); }
- $one_word[$i]=$dot_string; //一个字的字节
- $number.=$one_word[$i];//一行所放的字
- $circulation++;//循环的次数即一行放的字数
- if($circulation==$word_number)//当一行放满,就重新开始放下一行
- {
- $circulation=0;
- $_rows++;
- $Word[$_rows-1]=$number;
- $number="";
- }
- }
- $Word[$_rows]=$number; //不满一行的字放在这里
- $lcdrow=json_encode($Word);//PHP转JSON
- $row_number=(count($one_word))/$word_number; //需要多少行,总数处于一行的数
- fclose($fp); //关闭字库文件
- ?>
PHP仿LED点阵,读取字库文字,并转化为二进制输出的更多相关文章
- 从文本中读取内容并把读取到的内容转化成二进制保存的形式(包含十进制数如何转换成二进制数dtob函数)
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<malloc.h> d ...
- 基于Proteus仿真的Arduino学习(2)——LED点阵探究A(LED点阵基础)
一.前言: 随着LED的普及,以LED点阵为基础的显示设置层出不穷.例如,公交车的线路提示牌.高速公路的信息提示牌,安装在大楼上的广告屏幕等.下面,我们将由简单到复杂地探索各种LED点阵的使用方法,同 ...
- 单片机与控制实验(2)——LED点阵显示屏
一.实验目的和要求 了解LED点阵显示的基本原理和实现方法.掌握点阵汉字库的编码和从标准字库中提取汉字编码的方法. 二.实验设备 单片机测控实验系统 LED点阵显示器实验模块 Keil开发环境 STC ...
- 51单片机学习笔记(清翔版)(13)——LED点阵、74HC595
如图3,点阵屏分单色和彩色,点阵屏是由许多点组成的,在一个点上,只有一颗一种颜色的灯珠,这就是单色点阵屏,彩色的在一个点上有三颗灯珠,分别是RGB三原色. 图4你可能没看出来,那么大块黄色的就是点阵屏 ...
- LED点阵显示名字
学习了一周的单片机,然后中途有事打断了两周,现在温习一下之前学的东西,用“普中科技单片机”上的LED点阵显示自己的名字. P1接J19(绿).P2接J20(红),P0接J12(数码管段选):5V电压: ...
- LED点阵书写显示
LED点阵书写显示屏 摘要:随着时代的发展,数字电子技术已经普及到我们生活,工作,科研,各个领域,而LED显示以其组构方式灵活.显示稳定.功耗低.寿命长.技术成熟.成本低廉等特点在车站.证券所.运 ...
- WPF仿QQ聊天框表情文字混排实现
原文:WPF仿QQ聊天框表情文字混排实现 二话不说.先上图 图中分别有文件.文本+表情.纯文本的展示,对于同一个list不同的展示形式,很明显,应该用多个DataTemplate,那么也就需要Data ...
- 「雕爷学编程」Arduino动手做(22)——8X8 LED点阵MAX7219屏
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里 ...
- shell读取文件的每一行内容并输出【转】
写法一: #!/bin/bash while read line do echo $line done < file(待读取的文件) 写法二: #!/bin/bash cat file(待读取的 ...
随机推荐
- 向大家推荐一个在.Net下使用C#语言和Managed DirectX 9开发游戏的视频教程
视频教程:3D游戏开发步步高系列课程(微软课堂).美中不足的是视频的声音和画面不太对应.专心的听声音,听老师讲解吧. PPT和源码下载:3D游戏开发步步高系列课程-PPT和源码 网址链接:3D游戏开发 ...
- JS实现网页换肤功能效果
网页换肤的基本原理 使用 JS 切换对应的 CSS 样式表.例如hao123首页的右上方就有网页换肤功能.除了切换 CSS 样式表文件之外,通常的网页换肤还需要通过 Cookie 来记录用户之前更换过 ...
- 利用Cydia Substrate进行Android HOOK
Cydia Substrate是一个代码修改平台.它可以修改任何主进程的代码,不管是用Java还是C/C++(native代码)编写的.而Xposed只支持HOOK app_process中的java ...
- UWP ListView 绑定 单击 选中项 颜色
refer: https://www.cnblogs.com/lonelyxmas/p/7650259.html using System; using System.Collections.Gene ...
- 20155333 《网络对抗》Exp2 后门原理与实践
20155333 <网络对抗>Exp2 后门原理与实践 1.例举你能想到的一个后门进入到你系统中的可能方式? 下载的软件中捆绑有后门: 浏览的网页或其上的小广告: 有些网页会自动安装软件. ...
- mfc CListCtrl
了解CListCtrl属性 了解CListCtrl常用成员函数 代码示例 一.CListCtrl常用属性 View:视图方式;.大(标准)图标2.小图标3.列表4.报表 Sort:排序; No Scr ...
- PowerBI开发 第五篇:关系和交互
PowerBI 使用 内存的列式数据库 VertiPaq,用于对已发布的数据集进行数据压缩和快速处理,能够使PowerBI报表执行脱机访问,面向列的处理,高度优化对1:N关系的处理性能.关系是数据分析 ...
- Sterling B2B Integrator与SAP交互 - 01 简介
公司近期实施上线了SAP系统,由于在和客户的数据交互中采用了较多的EDI数据交换,且多数客户所采用的EDI数据并不太相同(CSV,XML,X12,WebService),所以在EDI架构上选择了IBM ...
- 使用ClosedXML,读取到空行
最近项目中使用了ClosedXML.dll来处理Excel,在读取Excel的时候,用workSheet.Rows()获取Excel行数,默认读取Excel最大行数1048576 所以为了读取到不是空 ...
- 零点计费系统_Ros云计费(下面是对接教程)
零 点 计 费 系 统 对 接 ROS 教 程 1.首先我们到零点控制台:oa.eczcz.com先注册一个主账号:(当然,以前有维盟片区的主账号就不用再注册了,因为零点早就设计到支持多台路由器,所以 ...