1. <?php
  2. $xml=simplexml_load_file("zimu.xml");//导入XML文件,从XML文件里知道需要提取的字体的信息
  3. $font_height=$xml->font->Size_H; //字体高
  4. $font_width=$xml->font->Size_L;//字体宽
  5. $lcdwidth=($xml->num_weight)*16;//屏幕的宽度
  6. $lcdheight=($xml->num_height)*32;//屏幕高度
  7. $Size=$font_width.$font_height; //字体的大小
  8. $ZiMu=$xml->character;   //字内容
  9. $show=$xml->enter;       //文字出现的效果
  10. $B=$xml->font->B;
  11. $U=$xml->font->U;
  12. $display=$B.$U;        //是否选择加粗和下划线
  13. $str=mb_convert_encoding($ZiMu,"gbk","utf-8"); //把输入的字转换为GBK编码
  14. $strlen=strlen($str);  //一个字两个字节,字节数
  15. if($font_height*$font_width==12*12){$font_height=16;}  //因为一次扫描八位,所以要八的整数
  16. switch($display)//打开字库的类型
  17. {
  18. case "":$file_name="HZK/cell.bin";break;  //没有加下划线和加粗功能的字库
  19. case "B":$file_name="HZK/B-cell.bin";break;//加粗功能的字库
  20. case "U":$file_name="HZK/U-cell.bin";break;//加下划线功能的字库
  21. case "BU":$file_name="HZK/B-U-cell.bin";break;//加下划线和加粗功能的字库
  22. }
  23. switch($Size)//不同字体大小偏移量
  24. {
  25. case 1212:$start_offset=0;break;    //字的大小为12*12
  26. case 1216:$start_offset=0x0002FEB2;break;  //字的大小为12*16
  27. case 1616:$start_offset=0x0005FD64;break;  //字的大小为16*16
  28. case 1624:$start_offset=0x0009FBA6;break;  //字的大小为16*24
  29. case 2424:$start_offset=0x000FF908;break;  //字的大小为24*24
  30. case 2432:$start_offset=0x0018F51A;break;  //字的大小为24*32
  31. case 3232:$start_offset=0x0024EFDC;break;  //字的大小为32*32
  32. }
  33. $fp = fopen($file_name, "rb");//打开字库文件
  34. $offset_size=$font_width * $font_height / 8;  //不同字体大小的一个字需要的字节数,一个字节有8位
  35. $number="";
  36. $word_number=(int)($lcdwidth/$font_width);//一行能放多少字
  37. $word_string=$word_number*2;//一行能放的字节数,一个汉字两个字节
  38. $circulation=0; //要循环的次数即要放多少字在一行里
  39. $_rows=0; //要放在第几行
  40. for ($i=0; $i<$strlen;$i++)//走一次提取一个字的二进制数
  41. {
  42. $dot_string="";
  43. if (ord($str[$i])>127) //汉字
  44. {
  45. $offset=(((ord($str[$i])-0xa1)*94)+(ord($str[$i+1])-0xa1))*$offset_size; //汉字偏移量的计算公式
  46. $i++; //因为汉字是两个字节,所以i加两次
  47. }
  48. else  //英文,标点符号
  49. {  $offset=(ord($str[$i])+155)*$offset_size;  }//英文偏移量的计算公式
  50. fseek($fp, $start_offset+$offset,SEEK_SET);//把指针指到要取得字的位置
  51. $bindot=fread($fp, $offset_size);          //提取的字
  52. for($j=0; $j<$offset_size; $j++)   //一次转换一个字节,把一个字转换为二进制数字
  53. {  $dot_string.= sprintf("%08b", ord($bindot[$j]));
  54. $total.=sprintf("%08b", ord($bindot[$j])); }
  55. $one_word[$i]=$dot_string; //一个字的字节
  56. $number.=$one_word[$i];//一行所放的字
  57. $circulation++;//循环的次数即一行放的字数
  58. if($circulation==$word_number)//当一行放满,就重新开始放下一行
  59. {
  60. $circulation=0;
  61. $_rows++;
  62. $Word[$_rows-1]=$number;
  63. $number="";
  64. }
  65. }
  66. $Word[$_rows]=$number; //不满一行的字放在这里
  67. $lcdrow=json_encode($Word);//PHP转JSON
  68. $row_number=(count($one_word))/$word_number; //需要多少行,总数处于一行的数
  69. fclose($fp); //关闭字库文件
  70. ?>

PHP仿LED点阵,读取字库文字,并转化为二进制输出的更多相关文章

  1. 从文本中读取内容并把读取到的内容转化成二进制保存的形式(包含十进制数如何转换成二进制数dtob函数)

    #include<stdio.h> #include<string.h> #include<stdlib.h> #include<malloc.h> d ...

  2. 基于Proteus仿真的Arduino学习(2)——LED点阵探究A(LED点阵基础)

    一.前言: 随着LED的普及,以LED点阵为基础的显示设置层出不穷.例如,公交车的线路提示牌.高速公路的信息提示牌,安装在大楼上的广告屏幕等.下面,我们将由简单到复杂地探索各种LED点阵的使用方法,同 ...

  3. 单片机与控制实验(2)——LED点阵显示屏

    一.实验目的和要求 了解LED点阵显示的基本原理和实现方法.掌握点阵汉字库的编码和从标准字库中提取汉字编码的方法. 二.实验设备 单片机测控实验系统 LED点阵显示器实验模块 Keil开发环境 STC ...

  4. 51单片机学习笔记(清翔版)(13)——LED点阵、74HC595

    如图3,点阵屏分单色和彩色,点阵屏是由许多点组成的,在一个点上,只有一颗一种颜色的灯珠,这就是单色点阵屏,彩色的在一个点上有三颗灯珠,分别是RGB三原色. 图4你可能没看出来,那么大块黄色的就是点阵屏 ...

  5. LED点阵显示名字

    学习了一周的单片机,然后中途有事打断了两周,现在温习一下之前学的东西,用“普中科技单片机”上的LED点阵显示自己的名字. P1接J19(绿).P2接J20(红),P0接J12(数码管段选):5V电压: ...

  6. LED点阵书写显示

    LED点阵书写显示屏   摘要:随着时代的发展,数字电子技术已经普及到我们生活,工作,科研,各个领域,而LED显示以其组构方式灵活.显示稳定.功耗低.寿命长.技术成熟.成本低廉等特点在车站.证券所.运 ...

  7. WPF仿QQ聊天框表情文字混排实现

    原文:WPF仿QQ聊天框表情文字混排实现 二话不说.先上图 图中分别有文件.文本+表情.纯文本的展示,对于同一个list不同的展示形式,很明显,应该用多个DataTemplate,那么也就需要Data ...

  8. 「雕爷学编程」Arduino动手做(22)——8X8 LED点阵MAX7219屏

    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里 ...

  9. shell读取文件的每一行内容并输出【转】

    写法一: #!/bin/bash while read line do echo $line done < file(待读取的文件) 写法二: #!/bin/bash cat file(待读取的 ...

随机推荐

  1. odoo明细表汇总数据

    一.在主表中#改动地方 总结算金额 求和:def _get_subtotal2(self, cr, uid, ids, field_name, arg, context=None): # 初始化 re ...

  2. 【H5】dropload (移动端下拉刷新,上拉加载)

    插件概要地址:http://ximan.github.io/dropload/ 一般下载其中的demo2对照修改即可使用. 小吐槽.我在项目中用的时候,有个后端说ajax麻烦但是还是要做体现他很热爱工 ...

  3. activiti发布APP时报错:关联的流程无效

    解决办法: 1.检查流程命名和任务命名以及其他命名中是否有特殊字符,有一些字符是不支持的.(中文是可以的,中文标点符号可能不行,我的经验是顿号会报错) 2.检查流程图,把鼠标放到每一根连接线上,观察它 ...

  4. 一、CnPack源码模板功能快速添加注释

    Delphi通过CnPack源码模板功能,能快速添加注释,非常之好用,使用方法如下图: 1.选择CnPack的源码模板专家 2.设置Pacal标准过程头 3.设置内容如下,并且设置了Ctrl+W的快捷 ...

  5. 有关C++的数据类型(int,long,short,float,double等等)

    再看C++ prime plus 第六版的时候 对数据类型又一次有些乱了,在看了这篇博客后,重新清晰起来了. 有关C++的数据类型(int,long,short,float,double等等)

  6. 20155339平措卓玛 Exp2 后门原理与实践

    20155339平措卓玛Exp2 后门原理与实践 基础问题 (1)例举你能想到的一个后门进入到你系统中的可能方式? 答:下载并安装某个程序,这个程序可以正常的并且完整的为我们提供服务,但是在开发改程序 ...

  7. Spring+SpringMVC+MyBatis整合基础篇(三)搭建步骤

    作者:13GitHub:https://github.com/ZHENFENG13版权声明:本文为原创文章,未经允许不得转载. 框架介绍 Spring SpringMVC MyBatis easyUI ...

  8. 有关ADO.NET基础中的基础的熟悉过程

    现在对于ADO.NET基础的理解与记忆并不严谨和完善 所以,只写一点关于自己的理解,嗯,一种去转换思维理解的方法吧,算是吧 希望各位前辈或者同学,积极指出其中的错误和偏差 个人对于刚接触的ADO.NE ...

  9. WebGL模型拾取——射线法二

    这篇文章是对射线法raycaster的补充,上一篇文章主要讲的是raycaster射线法拾取模型的原理,而这篇文章着重讲使用射线法要注意的地方.首先我们来看下图. 我来解释一下上图中的originTr ...

  10. GTK学习笔记————创建窗口

    创建gtk1.c文件 代码 #include <gtk/gtk.h> int main (int argc, char *argv[]) { GtkWidget *window; gtk_ ...