带字库程序
12864ZB带中文字库的液晶C程序,12864lcd
带中文字库的液晶12864的C程序(C12864ZB-1)带中文字库的液晶12864的C程序(C12864ZB-1)!并口连接液晶!ftinc1ude<reg52.h>#inc1ude<math.h>void1cd_init(void);voidc1r1cd(void);voidsendcom(unsignedcharcmd);voidsenddata(unsignedchardat);voidchekbusy(void);voidsetxy(unsignedcharxpos,unsignedcharypos);voidprint(unsignedcharx,unsignedchary,char*str);voidprintstr(unsignedcharxpos,unsignedcharypos,unsignedcharstr[],unsignedcha:unsignedcharcodebuf[4]={0xbb,0xb6,0xd3,0xad};〃欢迎/********************测忙碌**********************/〃测忙碌子程序/∕RS=O,RW=I,E=H,DO-D7二状态字voidchekbusy(void){unsignedchartempi;〃状态信息(判断是否忙)C1RB(CONTRO1,RS); 〃RS=0;SETB(CONTRO1,RW); //RW=1;SETB(CONTRO1,E); //E=1;do{tempi=DATA;DATA=O X FF;}whi1e(temp1&0x80);//SETB(CONTRO1,E); //E=1;DATA=O X FF;) 口〃写命令子程序//voidsend_com(unsignedcharCmd)/*写命令*/{chek_busyO;C1R B 7C ONTRO1,RS);//RS=0;C1RB(CONTRO1,RW);//RW=0;DATA=cmd;SETB(CONTRO1,E);//E=1;C1RB(CONTRO1,E);//E=0;voidsend_data(unsignedchardat){chek_busyO;SETBteONTRO1,RS);//RS=1;C1RB(CONTRO1,RW);//RW=0;DATA=dat;SETB(CONTRO1,E);//E=1;C1RB(CONTRO1,E);//E=0;}〃复位、通讯方式选择void1cd_init(void)SETB(CONTRO1,RST);〃复位RST=I?SETB(CONTRO1,PSB); 〃通讯方式为并口PSB=1//send_com(0x34);//34H 一扩充指令操作一次送8位数据,基本指令集整体显示,游标。
自己制作字体字库
自己制作字体字库
一直喜欢书法,经常会因为练习书法,要做些古代名家书法的集字字帖,但是每次都要花费很多时间从名家书法帖中寻找有关的字,通过拍照、PHOTOSHOP编辑等才能做一张字帖,非常费时间和功夫,最近突发奇想,决心自己做一个Fonts字体字库,以便以后在WORD等文档中打字输入文字后,可以通过字体选择自动生成,这样制作集字字帖就会特别的轻松了。
于是便开始工作,做了才知道工作量是出乎想象的大,因为一个字体库至少要六、七千个常用字,每个字都需要从名家字帖上通过拍照,然后PHOTOSHOP处理成单字的图片。
另外因为很多字可能在一个字帖里会反复使用很多次,按照书法的规矩,每次都不能重复一样的写法,要有变化,于是需要通过TRUE TYPE专用造字制作一些新造字(如图1),如下列表所示的新造字。
接下来在输入字体图片前,还要将每个待输入的字的UNICODE编码列出来,以便在使用FontCreator程序输入字体图片时,通过UNICODE编码搜索字的位置,以便输入字体图片(如图2、3)。
(图1:造新字程序)
(图2:做字体字库程序定位字体位置)
(图3:做字体字库程序插入字体图片,然后转换成矢量字体)
由于字体数量很大,只能每天晚上空闲时输入一部分,积少成多逐步完成这个大工程,下面是已经完成的部分字体显现的书法集字帖。
这是我最喜欢的明朝王铎的字集。
希望与喜欢书法的朋友一同分享。
白日依山尽
落花有情流水无情
苏东坡,水调歌头,明月几时有。
(资料素材和资料部分来自网络,供参考。
可复制、编制,期待你的好评与关注)。
字库制作详细教程(精)
字库制作详细教程很多时候,我们会用到字库,平时用到字库一般是把用到的汉字用取模软件按照自己的取模方式得到汉字的编码数组,然后把这些编码放在单片机的Flash里,用时调用出来显示。
但是如果我们要用到很多的汉字时,这种方法就不可取了,占用太多的Flash空间,然后我们会想到把字库放在SD卡或者是U盘里,用到时再从存储介质里读出来,这样,我们就可以显示很多汉字。
下面是字库的制作方法,首先感谢一个人,就是本坛的章其波大虾,其实就是他的一个贴子里的方法,只是他那个太专业了,一般的人看得不是很懂,所以我把它整理成了这个图文并茂的,方便各大网友,也是方便自己查看。
1、首先,好比起房子,得有源材料,用到以下3个文件:(1 取点阵Mold.exe(2 ziku.txt(3 ziku.exe取点阵Mold.exe是“牧马字模0.84测试版”取模软件ziku.txt是按顺序写有8178个汉字和字符的txt文档ziku.exe是一个小程序,配合“牧马字模0.84测试版”生成bin文件2、打开“牧马字模0.84测试版”取模软件,其界面如下所示:3、在工具栏处点“打开”按钮,打开ziku.txt文件,然后根据自己的需要,设置想要的取模方式,然后点工具栏上的“输出”按钮并等待其完成,完成后会在取模软件所在路径生成了一个temp.txt文件,修改这个文件名,比如现在我是按照“宋体、点阵数为16、字重为4、取模为为16*16、对齐设置为左上、方向设置为横向取模,高位在左”的方式来取的字模,也就是我平时TFT常用的一种字模,改文件名为st16x16.txt 。
4、为了生成的方便,我们在D盘根目录下新建一个文件夹,名称就叫ziku吧,然后,把ziku.exe 和st16x16.txt复制一份到这个文件夹里。
5、打开命令窗口:“开始”->“运行”->“cmd”,如下图所示:然后用cd命令进入到我们刚刚建的ziku文件夹下,输入命令如下图所示:6、输入命令,生成字库文件,输入命令如下图所示:为什么输入这样的命令,如果大家对main函数参数argc和argv有所了解的话,即int main(int argc, char* argv[] 这一主函数,这是很容易理解的,第一个参数是命令行输入参数的个数,第二个参数则存储了所有的命令行参数,前面我们已经用cd命令进入到了ziku文件夹下,接着我们输入了两个参数:ziku.exe st16x16.txt则,argc的值是2,argv[0]是" ziku.exe ",argv[1]是" st16x16.txt "。
带中文字库的12864lcd显示程序
for(j = 100; j > 0; j--); }
// 检测 LCD是否处于忙状态 , 若忙返回 1, 空闲返回 0 bit checkBusy() { bit busy;
RS = 0; RW = 1; E = 1; delayUs(); busy = (bit)(LCD_DATA&0x80); E = 0; return busy; }
1
文档来源为 :从网络收集整理 .word 版本可编辑 .欢迎下载支持 .
// 等待 LCD到空闲 void wait() {
while(checkBusy()); }
// 写命令 void writeCmd(uchar cmd) {
wait(); RS = 0; RW = 0; E = 0; delayUs(); LCD_DATA = cmd; delayUs(); E = 1; delayUs(); E = 0; }3ຫໍສະໝຸດ delayMs(10); }
void setPosition(uchar x, uchar y) { uchar p;
switch(x%4) {
case 0: p = 0x80; break; // case 1: p = 0x90; break; // case 2: p = 0x88; break; // case 3: p = 0x98; break; // } p += y; writeCmd(p); }
PSB = 1; // 并口方式 writeCmd(0x30); // 基本指令 , 扩充指令为 34H delayMs(10); writeCmd(0x0c); // 显示开 , 关光标 delayMs(10); writeCmd(0x01); // 清屏
19264液晶完整驱动程序 带字库st7920芯片驱动
void SendStringTo19264(u8 bit,u8 select,u8 data);
void Init_19264();
void screen_chear();
void display_chinese(u8 hang,u8 lie,u8 *array);
_delay_ms(3);
}
//------------------清屏JM12864---------------------
void screen_chear()
{
SendStringTo19264(upscreen,0,0x01);
SendStringTo19264(downscreen,0,0x01);
SendStringTo19264(upscreen,0,0x30); //使能基本指令 8位数据格式(在XY12864中)
//001DL X RE XX
/* DL=1,8位MPU接口;DL=0,4位MPU接口
RE=1,扩充指令集;RE=0,基本指令集
同一指令的动作不能同时改变DL和RE,需先改变DL再改变RE才能确保设置正确*/
SendStringTo19264(downscreen,0,0x30);
#define pin_19264data PINB&(1<<hf19264_data)
//--------------------------------------------------------
#define upscreen 1
#define downscreen 0
51单片机带字库12864液晶动态汉字显示C语言源程序
51单片机带字库12864液晶动态汉字显示C语言源程序2009-10-17 19:36实验芯片为:AT89S52,带字库液晶屏:12864,实现的目的:动态一个汉字一个汉字显示。
其实和显示汉字的程序一样,只是稍做一下修改即可。
C语言源程序如下:#include <stdio.h>#include <math.h>#include <reg52.h>#include <string.h>sbit RS=P2^4;sbit WRD=P2^5;sbit E=P2^6;sbit PSB=P2^1;sbit RES=P2^3;void TransferData(char data1,bit DI);void delayms(unsigned int n);void delay(unsigned int m);void lcd_mesg003(unsigned char code *addr1);unsigned char code IC_DAT[]={"我是一个中国人啊"};void initinal(void){delay(40);PSB=1; //并口工作模式delay(1);RES=0; //复位delay(1);RES=1; //复位置高delay(10);TransferData(0x30,0);delay(100);TransferData(0x30,0);delay(37);TransferData(0x08,0);delay(100);TransferData(0x10,0);delay(100);TransferData(0x0C,0);delay(100);TransferData(0x01,0);delay(10);TransferData(0x06,0);delay(100);}void main(void){while(1){initinal();//调用LCD字库初始化程序delay(100);lcd_mesg003(IC_DAT);}}void lcd_mesg003(unsigned char code *addr1){unsigned char i;//第一行TransferData(0x80,0);delay(100);for(i=0;i<16;i++){TransferData(*addr1,1);addr1++;delayms(50);}}void TransferData(char data1,bit DI) //传送数据或是命令,当DI=0时,传送命令,当DI=1时,传送数据{WRD=0;RS=DI;delay(1);P0=data1;E=1;delay(1);E=0;}void delayms(unsigned int n){unsigned int i,j;for(i=0;i<n;i++)for(j=0;j<2000;j++);}void delay(unsigned int m){unsigned int i,j;for(i=0;i<m;i++)for(j=0;j<10;j++);}原理就是在显示每个汉字的时候加了一个延时程序,当然可以用定时器来实现,这样的话,不占用CPU处理时间。
12864带字库c语言源码
#include <stdio.h>#include <math.h>#include <reg52.h>#include <string.h>unsigned char code IC_DAT[];unsigned char code pic1[];unsigned char code pic2[];unsigned char code pic3[];sbit RS =P2^4;sbit WRD=P2^5;sbit E= P2^6;sbit PSB=P2^1;sbit RES=P2^3;void TransferData(char data1,bit DI);void display(void);void display_grapic(void);void delayms(unsigned int n);void DisplayLine(unsigned char line1,unsigned char line2); void DisplayGraphic(unsigned char code *adder);void delay(unsigned int m);void lcd_mesg(unsigned char code *adder1);unsigned char code IC_DAT[]={"上海浩豚电子科技""单片机开发板系列""中文字库测试程序""恭喜发财身体健康"};unsigned char code IC_DAT2[]={"海纳百川宽容为先""欲成大业诚信为先""游弋商海济世为先""人立于世守法为先"};void initinal(void) //LCD字库初始化程序delay(40); //大于40MS的延时程序PSB=1; //设置为8BIT并口工作模式delay(1); //延时RES=0; //复位delay(1); //延时RES=1; //复位置高delay(10);TransferData(0x30,0); //Extended Function Set :8BIT设置,RE=0: basic instruction set, G=0 :graphic display OFFdelay(100); //大于100uS的延时程序TransferData(0x30,0); //Function Setdelay(37); ////大于37uS的延时程序TransferData(0x08,0); //Display on Controldelay(100); //大于100uS的延时程序TransferData(0x10,0); //Cursor Display Control光标设置delay(100); //大于100uS的延时程序TransferData(0x0C,0); //Display Control,D=1,显示开delay(100); //大于100uS的延时程序TransferData(0x01,0); //Display Cleardelay(10); //大于10mS的延时程序TransferData(0x06,0); //Enry Mode Set,光标从右向左加1位移动delay(100); //大于100uS的延时程序}void initina2(void) //LCD显示图片(扩展)初始化程序{delay(40); //大于40MS的延时程序PSB=1; //设置为8BIT并口工作模式delay(1); //延时RES=0; //复位delay(1); //延时RES=1; //复位置高delay(10);TransferData(0x36,0); //Extended Function Set RE=1: extended instructiondelay(100); //大于100uS的延时程序TransferData(0x36,0); //Extended Function Set:RE=1: extended instruction setdelay(37); ////大于37uS的延时程序TransferData(0x3E,0); //EXFUNCTION(DL=8BITS,RE=1,G=1)delay(100); //大于100uS的延时程序TransferData(0x01,0); //CLEAR SCREENdelay(100); //大于100uS的延时程序void main(void){while(1){initina2(); //调用LCD显示图片(扩展)初始化程序DisplayGraphic(pic2); //显示图片2delayms(200);DisplayGraphic(pic3); //显示图片3delayms(200);initinal(); //调用LCD字库初始化程序delay(100); //大于100uS的延时程序lcd_mesg(IC_DAT); //显示中文汉字1delayms(240);delayms(240);initinal(); //调用LCD字库初始化程序delay(100); //大于100uS的延时程序lcd_mesg(IC_DAT2); //显示中文汉字2delayms(240);delayms(240);}}void lcd_mesg(unsigned char code *adder1){unsigned char i;TransferData(0x80,0); //Set Graphic Display RAM Addressdelay(100);for(i=0;i<32;i++){TransferData(*adder1,1);adder1++;}TransferData(0x90,0); //Set Graphic Display RAM Addressdelay(100);for(i=32;i<64;i++){TransferData(*adder1,1);adder1++;}}void TransferData(char data1,bit DI) //传送数据或者命令,当DI=0是,传送命令,当DI=1,传送数据.{WRD=0;RS=DI;delay(1);P0=data1;E=1;delay(1);E=0;}void delayms(unsigned int n) //延时10×n毫秒程序{unsigned int i,j;for(i=0;i<n;i++)for(j=0;j<2000;j++);}void delay(unsigned int m) //延时程序{unsigned int i,j;for(i=0;i<m;i++)for(j=0;j<10;j++);}void DisplayGraphic(unsigned char code *adder){int i,j;//*******显示上半屏内容设置for(i=0;i<32;i++) //{TransferData((0x80 + i),0); //SET 垂直地址VERTICAL ADDTransferData(0x80,0); //SET 水平地址HORIZONTAL ADDfor(j=0;j<16;j++){TransferData(*adder,1);adder++;}}//*******显示下半屏内容设置for(i=0;i<32;i++) //{TransferData((0x80 + i),0); //SET 垂直地址VERTICAL ADDTransferData(0x88,0); //SET 水平地址HORIZONTAL ADDfor(j=0;j<16;j++){TransferData(*adder,1);adder++;}}}unsigned char code pic2[]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, 0xC0,0x1F,0xFF,0x81,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, 0xC0,0x1F,0xFF,0x81,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, 0xC0,0x18,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x00,0x00,0x00,0x03, 0xC0,0x1F,0xFF,0x80,0x00,0x00,0x04,0x07,0x81,0xE0,0x10,0x10,0x03,0xC0,0x30,0x03, 0xC0,0x1F,0xFF,0x80,0x00,0x00,0x0C,0x0C,0xC3,0x30,0x08,0x20,0x0C,0xE0,0x70,0x03, 0xC0,0x18,0x01,0x87,0xFF,0xFE,0x3C,0x18,0x66,0x18,0x04,0x40,0x0C,0x60,0x70,0x03, 0xC0,0x1F,0xFF,0x87,0xFF,0xFE,0x0C,0x18,0x66,0x18,0x02,0x80,0x18,0x00,0xB0,0x03, 0xC0,0x1F,0xFF,0x80,0x06,0x00,0x0C,0x18,0x66,0x18,0x01,0x00,0x1B,0x81,0x30,0x03, 0xC0,0x01,0x98,0x00,0x06,0x00,0x0C,0x00,0xE3,0x30,0x02,0x80,0x1C,0xC1,0x30,0x03, 0xC0,0x19,0x99,0x80,0x66,0x60,0x0C,0x00,0xC1,0xE0,0x04,0x40,0x18,0x62,0x30,0x03, 0xC0,0x19,0x99,0x80,0x66,0x30,0x0C,0x01,0x83,0x30,0x08,0x20,0x18,0x66,0x30,0x03, 0xC0,0x0D,0x9B,0x00,0xC6,0x38,0x0C,0x03,0x06,0x18,0x10,0x10,0x18,0x67,0xFC,0x03,0xC0,0x0D,0x9B,0x01,0xC6,0x1C,0x0C,0x06,0x06,0x18,0x20,0x08,0x18,0x60,0x30,0x03, 0xC0,0x01,0x98,0x03,0x86,0x0C,0x0C,0x0C,0x06,0x18,0x00,0x00,0x08,0x60,0x30,0x03, 0xC0,0x7F,0xFF,0xE3,0x06,0x00,0x0C,0x18,0x03,0x30,0x00,0x00,0x0C,0xC0,0x30,0x03, 0xC0,0x7F,0xFF,0xE0,0x1E,0x00,0x0C,0x1F,0xE1,0xE0,0x00,0x00,0x07,0x80,0x30,0x03, 0xC0,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x00,0x18,0x00,0x00,0x00,0x06,0x0C,0x03, 0xC3,0xFF,0xFC,0x3F,0xF0,0x80,0x0C,0x00,0x3F,0x18,0x01,0xFF,0xFE,0x06,0x0C,0x03, 0xC3,0xFF,0xFC,0x3F,0xF1,0x80,0x0F,0xFC,0x3F,0x18,0x01,0xFF,0xFE,0x06,0x0C,0x03, 0xC3,0x0C,0x0C,0x0C,0xC3,0x00,0x0F,0xFC,0x33,0x7F,0xE1,0x86,0x06,0x06,0x0C,0x03, 0xC3,0x1F,0xCC,0x0C,0xC6,0x00,0x0C,0x00,0x33,0x7F,0xE1,0x8F,0xE6,0x06,0x0C,0x03, 0xC3,0x3F,0xCC,0x0C,0xCC,0x00,0x0C,0x00,0x36,0x30,0x01,0x9F,0xE6,0x07,0xFF,0xE3, 0xC3,0x79,0x8C,0x0C,0xC8,0x00,0xFF,0xF0,0x36,0x36,0x01,0xBC,0xC6,0x07,0xFF,0xE3, 0xC3,0x6F,0x0C,0x7F,0xF0,0xC0,0xFF,0xF0,0x36,0x66,0x01,0xB7,0x86,0x06,0x00,0x03, 0xC3,0x0F,0x0C,0x7F,0xF1,0x80,0xC0,0x30,0x36,0x7F,0xC1,0x87,0x86,0x06,0x00,0x03, 0xC3,0x79,0xEC,0x0C,0xC3,0x00,0xC0,0x30,0x33,0x7F,0xC1,0xBC,0xF6,0x06,0x00,0x03, 0xC3,0x76,0xEC,0x0C,0xC6,0x00,0xC0,0x30,0x33,0x06,0x01,0xBB,0x76,0x07,0xFF,0x03, 0xC3,0x07,0x0C,0x0C,0xCC,0x20,0xFF,0xF0,0x33,0x06,0x01,0x83,0x86,0x07,0xFF,0x03, 0xC3,0x03,0x0C,0x18,0xC8,0x60,0xFF,0xF0,0x3F,0x06,0x01,0x81,0x86,0x06,0x03,0x03, 0xC3,0x1C,0x0C,0x18,0xC0,0xC0,0x00,0x00,0x3E,0xFF,0xE1,0x8E,0x06,0x06,0x03,0x03, 0xC3,0x1F,0x0C,0x18,0xC1,0x81,0xB1,0x8C,0x30,0xFF,0xE1,0x8F,0x86,0x06,0x03,0x03, 0xC3,0x03,0x0C,0x30,0xC7,0x01,0xB1,0x8C,0x30,0x06,0x01,0x81,0x86,0x0C,0x03,0x03, 0xC3,0xFF,0xFC,0x70,0xDE,0x03,0x18,0xC6,0x30,0x06,0x01,0xFF,0xFE,0x0C,0x03,0x03, 0xC3,0xFF,0xFC,0x20,0x18,0x03,0x18,0xC6,0x30,0x06,0x01,0xFF,0xFE,0x18,0x03,0x03, 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,};unsigned char code pic3[]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, 0xC3,0x02,0x0E,0x1C,0x08,0xF8,0x67,0xE3,0x87,0x0C,0x08,0x38,0x70,0x23,0xE1,0x83, 0xC4,0x8E,0x11,0x22,0x18,0x80,0x90,0x24,0x48,0x92,0x38,0x44,0x88,0x62,0x02,0x43, 0xC8,0x42,0x11,0x22,0x28,0x81,0x00,0x24,0x48,0xA1,0x08,0x44,0x88,0xA2,0x04,0x03, 0xC8,0x42,0x01,0x02,0x28,0xF1,0xE0,0x44,0x48,0xA1,0x08,0x04,0x08,0xA3,0xC7,0x83, 0xC8,0x42,0x02,0x0C,0x48,0x89,0x10,0x43,0x88,0xA1,0x08,0x08,0x31,0x22,0x24,0x43, 0xC8,0x42,0x04,0x02,0x88,0x09,0x10,0x44,0x47,0xA1,0x08,0x10,0x0A,0x20,0x24,0x43, 0xC8,0x42,0x08,0x22,0xFC,0x89,0x10,0x44,0x40,0xA1,0x08,0x20,0x8B,0xF2,0x24,0x43, 0xC4,0x82,0x10,0x22,0x08,0x89,0x10,0x84,0x49,0x12,0x08,0x40,0x88,0x22,0x24,0x43, 0xC3,0x02,0x1F,0x1C,0x08,0x70,0xE0,0x83,0x86,0x0C,0x08,0x7C,0x70,0x21,0xC3,0x83, 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, 0xCF,0xC7,0x0E,0x18,0x10,0x70,0xE0,0x47,0xC3,0x3F,0x1C,0x38,0x60,0x41,0xC3,0x83, 0xC0,0x48,0x91,0x24,0x70,0x89,0x10,0xC4,0x04,0x81,0x22,0x44,0x91,0xC2,0x24,0x43, 0xC0,0x48,0x91,0x42,0x10,0x89,0x11,0x44,0x08,0x01,0x22,0x45,0x08,0x42,0x24,0x43, 0xC0,0x88,0x91,0x42,0x10,0x08,0x11,0x47,0x8F,0x02,0x22,0x45,0x08,0x40,0x20,0x43, 0xC0,0x87,0x11,0x42,0x10,0x10,0x62,0x44,0x48,0x82,0x1C,0x45,0x08,0x40,0x41,0x83, 0xC0,0x88,0x8F,0x42,0x10,0x20,0x14,0x40,0x48,0x82,0x22,0x3D,0x08,0x40,0x80,0x43, 0xC0,0x88,0x81,0x42,0x10,0x41,0x17,0xE4,0x48,0x82,0x22,0x05,0x08,0x41,0x04,0x43, 0xC1,0x08,0x92,0x24,0x10,0x81,0x10,0x44,0x48,0x84,0x22,0x48,0x90,0x42,0x04,0x43, 0xC1,0x07,0x0C,0x18,0x10,0xF8,0xE0,0x43,0x87,0x04,0x1C,0x30,0x60,0x43,0xE3,0x83, 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, 0xC0,0x8F,0x86,0x7E,0x38,0x70,0xC0,0x83,0x87,0x02,0x3E,0x19,0xF8,0xE1,0xC3,0x03, 0xC1,0x88,0x09,0x02,0x44,0x89,0x23,0x84,0x48,0x86,0x20,0x24,0x09,0x12,0x24,0x83, 0xC2,0x88,0x10,0x02,0x44,0x8A,0x10,0x84,0x48,0x8A,0x20,0x40,0x09,0x12,0x28,0x43, 0xC2,0x8F,0x1E,0x04,0x44,0x8A,0x10,0x80,0x40,0x8A,0x3C,0x78,0x11,0x12,0x28,0x43, 0xC4,0x88,0x91,0x04,0x38,0x8A,0x10,0x80,0x83,0x12,0x22,0x44,0x10,0xE2,0x28,0x43, 0xC8,0x80,0x91,0x04,0x44,0x7A,0x10,0x81,0x00,0xA2,0x02,0x44,0x11,0x11,0xE8,0x43, 0xCF,0xC8,0x91,0x04,0x44,0x0A,0x10,0x82,0x08,0xBF,0x22,0x44,0x11,0x10,0x28,0x43,0xC0,0x88,0x91,0x08,0x44,0x91,0x20,0x84,0x08,0x82,0x22,0x44,0x21,0x12,0x44,0x83, 0xC0,0x87,0x0E,0x08,0x38,0x60,0xC0,0x87,0xC7,0x02,0x1C,0x38,0x20,0xE1,0x83,0x03, 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, 0xC1,0x07,0x0E,0x04,0x7C,0x33,0xF1,0xC3,0x86,0x04,0x1C,0x38,0x11,0xF0,0xCF,0xC3, 0xC7,0x08,0x91,0x0C,0x40,0x48,0x12,0x24,0x49,0x1C,0x22,0x44,0x31,0x01,0x20,0x43, 0xC1,0x08,0x91,0x14,0x40,0x80,0x12,0x24,0x50,0x84,0x22,0x44,0x51,0x02,0x00,0x43, 0xC1,0x00,0x81,0x14,0x78,0xF0,0x22,0x24,0x50,0x84,0x02,0x04,0x51,0xE3,0xC0,0x83, 0xC1,0x01,0x06,0x24,0x44,0x88,0x21,0xC4,0x50,0x84,0x04,0x18,0x91,0x12,0x20,0x83, 0xC1,0x02,0x01,0x44,0x04,0x88,0x22,0x23,0xD0,0x84,0x08,0x05,0x10,0x12,0x20,0x83, 0xC1,0x04,0x11,0x7E,0x44,0x88,0x22,0x20,0x50,0x84,0x10,0x45,0xF9,0x12,0x20,0x83, 0xC1,0x08,0x11,0x04,0x44,0x88,0x42,0x24,0x89,0x04,0x20,0x44,0x11,0x12,0x21,0x03, 0xC1,0x0F,0x8E,0x04,0x38,0x70,0x41,0xC3,0x06,0x04,0x3E,0x38,0x10,0xE1,0xC1,0x03, 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,};#include <reg52.h>#include <intrins.h>#include <stdio.h>#define uchar unsigned char#define Fisrt_Addr 0 //定义字符/汉字显示起始位置typedef unsigned char uint8;sbit LCD_RS=P2^2;sbit LCD_RW=P2^3;sbit LCD_E=P2^4;sbit PCB=P2^5;uchar i,j;uint8 AC_TABLE[]={0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, //第一行汉字位置0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97, //第二行汉字位置0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f, //第三行汉字位置0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f, //第四行汉字位置};void delay(int ms){while(ms--){for(j=0;j<120;j++);}}bit lcd_busy(){ bit result;LCD_RS=0;LCD_RW=1;LCD_E= 1;result=(bit)(P0&0x80);LCD_E=0;return result;}void lcd_wcmd(uchar cmd){while(lcd_busy());LCD_RS=0;LCD_RW=0;LCD_E=0;P0=cmd;LCD_E=1;LCD_E=0;}void lcd_wdata(uchar dat){while(lcd_busy());LCD_RS=1;LCD_RW=0;LCD_E=0;P0=dat ;LCD_E=1;LCD_E=0;}void lcd_initial(){lcd_wcmd(0x30);delay(1);lcd_wcmd(0x0C); //开显示,关光标,不闪烁delay(1);lcd_wcmd(0x06);//指定在资料写入或读取时,光标的移动方向delay(1);lcd_wcmd(0x01);delay(10); //这里要延时长一点,否侧会影响下面的操作}/*------------------清屏命令--------------------------*/void Clr_Screen(){lcd_wcmd(0x30);//考虑到前面出现0x34lcd_wcmd(0x01);delay(10);}/*------------------整屏写入数据:全亮,或者竖条-----------------------------*///先写0x34关绘图,写地址数据,0x360x绘图void Lcd_Fill(uchar disdata){ uchar x,y; //参考PDF写GDRAM的步骤,显示坐标for(y=0;y<32;y++)for(x=0;x<16;x++){ lcd_wcmd(0x34);lcd_wcmd(y+0x80); //行地址lcd_wcmd(x+0x80); //列地址lcd_wdata(disdata);lcd_wdata(disdata);lcd_wcmd(0x36);}lcd_wcmd(0x30);//考虑到前面出现0x34}/*------------------显示字符串--------------------------*/void Zi_FU(uchar code *s){while(*s!=0){ lcd_wdata(*s);s++;delay(10);}}//注意:中文显示时空格符或数字ASCII码必需两个一起用,标点符号注意中英文void intruction(){Clr_Screen() ;lcd_wcmd(0x80);//第一行(如果是地址是:80H,即LCD的第一行的第一个位置显示)Zi_FU("erwatgeawgaseg");lcd_wcmd(0x90);//第二行(如果是地址是:90H,即LCD的第二行的第一个位置显示)Zi_FU("wetwetw");lcd_wcmd(0x88);//第三行(如果是地址是:88H,即LCD的第二行的第一个位置显示)Zi_FU("yhwerqytqw");lcd_wcmd(0x98);//第四行(如果是地址是:98H,即LCD的第二行的第一个位置显示)Zi_FU("weagfawgaw?);delay(1000);}void feeling1(){lcd_wcmd(0x30);Zi_FU("fasgfwqf");delay(300);lcd_wcmd(0x90+Fisrt_Addr);Zi_FU("gwagawga");delay(300);lcd_wcmd(0x88+Fisrt_Addr);Zi_FU("nfaishdgfioa");delay(300);lcd_wcmd(0x98+Fisrt_Addr);delay(500);Zi_FU("6456464");}/*------------------显示图片---------------------------*/void Disp_Img(uchar code *bmp){uchar count=2,X=0x80;lcd_wcmd(0x34); //扩展指令lcd_wcmd(0x36); //打开绘图for(;count>0;count--){for(i=0;i<32;i++){ lcd_wcmd(0x80|i);lcd_wcmd(X); //X地址坐标,自动加1.for(j=0;j<16;j++) //16*8=128lcd_wdata(*bmp++);}X=0x88;//下半屏}}/********************************************* 函数名称:去字摸函数,取模方式是横向,顺序函数功能:**********************************************/ void ZK(uchar *zk){uchar i, j;for(j=0;j<16;j++){lcd_wcmd(0x34); //扩展指令lcd_wcmd(0x36); //打开绘图lcd_wcmd(0x80|j);lcd_wcmd(0x80) ;//X地址坐标,自动加1.for(i=0;i<2;i++){lcd_wdata(*zk++);}}}/********************************************* 函数名称: 向某一行写字符函数功能:**********************************************/ void Lcd_Write_Poss(uchar x,uchar y,uchar *ZiFu){uchar addr,i=0;if(x==1)addr=0x80;if(x==2)addr=0x90;if(x==3)addr=0x88;if(x==4)addr=0x98;addr=addr+y;lcd_wcmd(0x30);lcd_wcmd(addr);while(*ZiFu!='\0'){lcd_wdata(*ZiFu++);}}void main(){PCB=1;while(1){lcd_initial();delay(1000);Clr_Screen();feeling1();delay(3000);for(i=8;i>0;i--){lcd_wcmd(0x18); //一二行与三四行调换了,液晶分为上下两个半屏,delay(1000); //有时会乱,与上面程序有关,要加lcd_wcmd(0x30),clrscreen();}Clr_Screen(); //清屏feeling1();lcd_wcmd(0x34);lcd_wcmd(0x04); //0X04第一行和第三行反白显示,delay(3000); //0X05第二行和第四行反白显示,与PDF不符lcd_wcmd(0x04); //恢复正常delay(3000);lcd_wcmd(0x34);lcd_wcmd(0x03); //允许输入滚动地址for(i=0x40;i<0x7f;i++){lcd_wcmd(i); //垂直滚动屏幕的内容delay(500);}}}。
12864程序,字库与自定义字符的显示
uchar code user1[]={
/*--文字:你--*/
/*--楷体_GB231212;此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x00,0x08,0x80,0x08,0x80,0x08,0x80,0x11,0x38,0x11,0xC8,0x32,0x10,0x50,0x40,
delay(1);
RES=1;
delay(10);
w_cmd(0x30);//功能设置,选着8位元模式
delay(1);
w_cmd(0x30);//选择基本指令集,因为DL与RE不能同时改变需要两个指令
delay(1);
w_cmd(0x0c);//开显示(无游标、不反白)
delay(1);
w_cmd(0x01);//clear print
12864并口输入在输入输出数据是注意时序之前由于忙检测时序写错而无法显示字库文字自定义字符注意地址与编码方式对应不然会显示乱码includesbitrsp24
/*------------------------------------
12864并口输入,在输入输出数据是注意时序
之前由于忙检测时序写错,而无法显示字库文字
{
RW=1;
RS=0;
E=1;
data_port=0xff;
while((data_port&&0x80)==0x80);//data_port&&0x80必须加上括号
E=0;
}
void w_cmd(uint dat)
{check_busy();
RS=0;
RW=0;
E=1;
data_port=dat;
lcd12864带字库经典程序
X++;
Delay5Ms();
}
}
}
/***********短延时********************************************************/
voidDelay5Ms(void)
{
unsignedintTempCyc= 5552;
while(TempCyc--);
WriteDataLCD(DData);
}
/***********按指定位置显示一串字符*****************************************/
voidDisplayListChar(unsignedcharX,unsignedcharY,unsignedcharcode*DData)
voidWriteDataLCD(unsignedcharWDLCD)
{
ReadStatusLCD();//检测忙
LCD_RS= 1;
LCD_RW= 0;
LCD_Data=WDLCD;
LCD_E= 1;
LCD_E= 1;
LCD_E= 0;
}
/***********写指令********************************************************/
sbitLCD_RS=P1^0;
sbitLCD_RW=P1^1;
sbitLCD_E=P1^2;
sbitPSB=P1^6;//PSB脚为-12系列的串、并通讯功能切换,使用位并行接口,PSB=1
/********宏定义***********************************************************/
uCGUI添加汉字库方法
一找到UCGUIGenApp.exe程序,并打开,界面如下
二选择要转换的字体,这里选择“华文中宋,加粗,22号字体”
三因为全部导出的话文件会很大,因此根据项目需要,只导出特定的汉字做字库。
选择“指定范围导出GBK码”,输入要导出的汉字,并点“确定”。
四点击“确定”后,会自动生成字库的C文件,位置和uCGUIGenAPP.exe相同。
五将文件“Text_37.c”拷贝到/GUI/Font里,并在Keil工程中添加这个文件。
六打开Test_37.c文件,可见字库名已经被定义为“GUI_FontHZ_Test_37”
七修改GUI.h文件。
找到GUI.h中的“Standard Fonts”块,并在下方添加字库名“extern GUI_CONST_STORAGE GUI_FONT GUI_FontHZ_Test_37;”。
注意“;”号必须加入。
八设置好后就可以正常使用了,比如在按键上加汉字。
12864各种画图程序(带字库修改)
/****************************************************************************** ******************************************************************************* *********///程序说明:本程序为12864(st7920)驱动程序,只实现了最简单的显示功能//端口设置:RS、RW、EN分别为P0口的0、1、2,数据口为P2口//注意:1.要想在液晶屏上同时显示自定义字库和绘图,必须先显示自定义字库// 2.本程序所有函数均有用且正确,由于我的keil未破解不能编译,所以将其注释了// 3.用取模软件取的图形或汉字必须是逐行取的,因为本函数是在液晶上逐行打点的/****************************************************************************** *****************************************************************************/ #include<reg51.h>#include<intrins.h> //内含-NOP-函数#include<stdlib.h> //内含rand()函数#define uchar unsigned char#define uint unsigned int//**********宏定义所需指令#define BASIC_SET 0x30#define EXTEND_SET 0x34#define DRAW_ON 0x36#define DRAW_OFF 0x34//*************端口定义sbit LCD_RS = P0^0;sbit LCD_RW = P0^1;sbit LCD_EN = P0^2;//************变量定义//uchar dis1[10];//****************短延时void delay(uint k){uint i;uchar j;for(i = 0; i < k ;i ++)for(j = 0; j < 10 ;j ++);}//***********ms级延时函数/*void delay_1ms(uint x){uint i,j;for(j = 0;j < x; j++)for(i = 0;i < 110; i++);} *///***********12864写指令函数void write_com(uchar cmd){LCD_RS = 0;LCD_RW = 0;P2 = cmd;delay(5);LCD_EN = 1;delay(5);LCD_EN = 0;}//********12864写数据函数void write_dat(uchar dat){LCD_RS = 1;LCD_RW = 0;P2 = dat;delay(5);LCD_EN = 1;delay(5);LCD_EN = 0;}//****************从LCD中读数据uchar read_dat(void){uchar temp;P2 = 0XFF; //释放数据线LCD_RS = 1; //数据LCD_RW = 1; // 读模式LCD_EN = 1; //E为高电平进行读数据或指令delay(1);temp = P2;LCD_EN = 0;return temp;}//********************************************************//设置光标(地址)函数//参数说明:x---为行号,y为列号//********************************************************void set_cursor(unsigned char x, unsigned char y){unsigned char i;switch(x) //确定行号{case 0x00: i=0x80; break; //第一行case 0x01: i=0x90; break; //第二行case 0x02: i=0x88; break; //第三行case 0x03: i=0x98; break; //第四行default : break;}i = y+i; //确定列号write_com(i);}//********************************************************//显示字符函数//********************************************************void display_char(unsigned char Alphabet){write_dat(Alphabet); //写入需要显示字符的显示码}//********************************************************//指定位置显示字符串函数//参数说明:x为行号,y为列号//********************************************************void display_string(unsigned char x,unsigned char y,unsigned char *Alphabet) {unsigned char i=0;set_cursor(x,y); //设置显示的起始地址while(Alphabet[i]!='\0'){write_dat(Alphabet[i]); //写入需要显示字符的显示码i++;}}//***********************以下为GDRAM绘图部分***************************////*********************绘图显示的清屏函数(因清屏指令在画图时不能用)------------------------------------------------------------------------------注意!!!!!!!void gui_clear(){uchar i , j , k;write_com(EXTEND_SET);//扩展指令集,8位数据传输write_com(DRAW_OFF);//绘图显示关闭for(i = 0; i < 2; i ++)//分上下两屏写{for(j = 0; j < 32; j ++){write_com(0x80 + j);//写y坐标delay(1);if(i == 0) //写x坐标{write_com(0x80);delay(1);}else //写下半屏{write_com(0x88);delay(1);}for(k = 0; k < 16; k ++)//写一整行数据{write_dat(0x00);//写高字节write_dat(0x00);//写低字节delay(1);}}}write_com(DRAW_ON);//打开绘图显示write_com(BASIC_SET);//打开基本指令集}//******************************************************************//*****有反白显示功能的打点函数***********//参数:color=1,该点填充1;color=0,该点填充白色0;//*******************************************************************void GUI_Point(unsigned char x,unsigned char y,unsigned char color){unsigned char x_Dyte,x_byte; //定义列地址的字节位,及在字节中的哪1位unsigned char y_Dyte,y_byte; //定义为上下两个屏(取值为0,1),行地址(取值为0~31)unsigned char GDRAM_hbit,GDRAM_lbit;write_com(0x36); //扩展指令命令/***X,Y坐标互换,即普通的X,Y坐标***/x_Dyte=x/16; //计算在16个字节中的哪一个x_byte=x&0x0f; //计算在该字节中的哪一位y_Dyte=y/32; //0为上半屏,1为下半屏y_byte=y&0x1f; //计算在0~31当中的哪一行write_com(0x80+y_byte); //设定行地址(y坐标),即是垂直地址write_com(0x80+x_Dyte+8*y_Dyte); //设定列地址(x坐标),并通过8*y_Dyte选定上下屏,即是水平地址read_dat(); //预读取数据GDRAM_hbit= read_dat(); //读取当前显示高8位数据GDRAM_lbit= read_dat(); //读取当前显示低8位数据delay(1);write_com(0x80+y_byte); //设定行地址(y坐标)write_com(0x80+x_Dyte+8*y_Dyte); //设定列地址(x坐标),并通过8*y_Dyte选定上下屏delay(1);if(x_byte<8) //判断其在高8位,还是在低8位{if(color==1){write_dat(GDRAM_hbit|(0x01<<(7-x_byte))); //置位GDRAM区高8位数据中相应的点}elsewrite_dat(GDRAM_hbit&(~(0x01<<(7-x_byte)))); //清除GDRAM区高8位数据中相应的点write_dat(GDRAM_lbit); //显示GDRAM区低8位数据}else{write_dat(GDRAM_hbit);if(color==1)write_dat(GDRAM_lbit|(0x01<<(15-x_byte))); //置位GDRAM区高8位数据中相应的点elsewrite_dat(GDRAM_lbit&(~(0x01<<(15-x_byte))));//清除GDRAM区高8位数据中相应的点}write_com(0x30); //恢复到基本指令集}//***********(给定坐标并打点的)任意位置打点函数void lcd_set_dot(uchar x,uchar y){uchar x_byte,x_bit;//确定在坐标的那一字节哪一位uchar y_ping , y_bit;//确定在坐标的哪一屏哪一行uchar tmph , tmpl;//定义两个临时变量,用于存放读出来的数据write_com(EXTEND_SET);//扩展指令集write_com(DRAW_OFF);//绘图显示关闭x_byte = x / 16;//算出在哪一字节,注意一个地址是16位的x_bit = x % 16;//& 0x0f;//算出在哪一位y_ping = y / 32;//确定在上半屏还是下半屏,0代表上半屏,1代表下半屏y_bit = y % 32;//& 0x1f;//确定在第几行write_com(0X80 + y_bit);//先写垂直地址(最高位必须)write_com(0x80 + x_byte + 8 * y_ping);//水平坐标,下半屏坐标起始地址为0x88,(+8*y_ping)就是用来确定上半屏还是下半屏read_dat();//预读取数据tmph = read_dat();//读取当前显示高8位数据tmpl = read_dat();//读取当前显示低8位数据delay(1);write_com(0x80 + y_bit);//读操作会改变AC,所以重新设置一下write_com(0x80 + x_byte + 8 * y_ping);delay(1);if(x_bit < 8){write_dat(tmph | (0x01 << (7 - x_bit)));//写高字节,因为坐标是从左向右的,GDRAM 高位在昨,低位在右write_dat(tmpl);//原低位数据送回}else{write_dat(tmph);//原高位数据送回write_dat(tmpl | (0x01 << (15 - x_bit)));}write_com(DRAW_ON); //打开绘图显示write_com(BASIC_SET);//回到基本指令集}//************画水平线函数**********************************////x0、x1为起始点和终点的水平坐标,y为垂直坐标***************////**********************************************************//void gui_hline(uchar x0, uchar x1, uchar y){uchar bak;//用于对两个数互换的中间变量,使x1为大值if(x0 > x1){bak = x1;x1 = x0;x0 = bak;}do{lcd_set_dot(x0 , y);//从左到右逐点显示x0 ++;}while(x1 >= x0);}//***********画竖直线函数***********************************////x为起始点和终点的水平坐标,y0、y1为垂直坐标***************////**********************************************************//void gui_rline(uchar x, uchar y0, uchar y1)uchar bak;//用于对两个数互换的中间变量,使y1为大值if(y0 > y1){bak = y1;y1 = y0;y0 = bak;}do{lcd_set_dot(x , y0);//从上到下逐点显示y0 ++;}while(y1 >= y0);}//*********任意两点间画直线*********************************// //x0、y0为起始点坐标,x1、y1为终点坐标**********************// //**********************************************************// void gui_line(uchar x0 , uchar y0 , uchar x1 , uchar y1){char dx;//直线x轴差值char dy;//直线y轴差值char dx_sym;//x轴增长方向,为-1时减值方向,为1时增值方向char dy_sym;//y轴增长方向,为-1时减值方向,为1时增值方向char dx_x2;//dx*2值变量,用于加快运算速度char dy_x2;//dy*2值变量,用于加快运算速度char di; //决策变量if(x0 == x1)//判断是否为垂直线{gui_rline(x0 , y0 , y1);//画垂直线return;}if(y0 == y1)//判断是否为水平线{gui_hline(x0 , x1 , y0);//画水平线return;}dx = x1 - x0;//求取两点之间的差值dy = y1 - y0;//****判断增长方向,或是否为水平线、垂直线、点*// if(dx > 0)//判断x轴方向dx_sym = 1;else{if(dx < 0)dx_sym = -1;else{gui_rline(x0 , y0 , y1);return;}}if(dy > 0)//判断y轴方向dy_sym = 1;else{if(dy < 0)dy_sym = -1;else{gui_hline(x0 , x1 , y0);return;}}/*将dx、dy取绝对值***********/dx = dx_sym * dx;dy = dy_sym * dy;/****计算2倍的dx、dy值*******/dx_x2 = dx * 1;//我改为了一倍,这样才跟真实的两点对应dy_x2 = dy * 1;/***使用bresenham法进行画直线***/if(dx >= dy)//对于dx>=dy,使用x轴为基准{di = dy_x2 - dx;while(x0 != x1){lcd_set_dot(x0,y0);x0 +=dx_sym;if(di < 0)di += dy_x2;//计算出下一步的决策值else{di += dy_x2 - dx_x2;y0 += dy_sym;}}lcd_set_dot(x0, y0);//显示最后一点}else //对于dx<dy使用y轴为基准{di = dx_x2 - dy;while(y0 != y1){lcd_set_dot(x0, y0);y0 += dy_sym;if(di < 0)di += dx_x2;else{di += dx_x2 - dy_x2;x0 += dx_sym;}}lcd_set_dot(x0, y0);//显示最后一点}}//***************************************************************************// //*******************画指定宽度的任意两点之间的直线**************************// //参数说明:x0、y0为起始点坐标,x1、y1为终点坐标,with为线宽*****************// //***************************************************************************// void gui_linewith(uchar x0 , uchar y0 , uchar x1 , uchar y1 , uchar with){char dx; // 直线x轴差值变量char dy; // 直线y轴差值变量char dx_sym; // x轴增长方向,为-1时减值方向,为1时增值方向char dy_sym; // y轴增长方向,为-1时减值方向,为1时增值方向char dx_x2; // dx*2值变量,用于加快运算速度char dy_x2; // dy*2值变量,用于加快运算速度char di; // 决策变量char wx, wy; // 线宽变量char draw_a, draw_b;// 参数过滤if(with==0) return;if(with>50) with = 50;dx = x1-x0; // 求取两点之间的差值dy = y1-y0;wx = with/2;wy = with-wx-1;//判断增长方向,或是否为水平线、垂直线、点if(dx>0) // 判断x轴方向{dx_sym = 1; // dx>0,设置dx_sym=1 }else{if(dx<0){dx_sym = -1; // dx<0,设置dx_sym=-1 }else{//dx==0,画垂直线,或一点wx = x0-wx;if(wx<0) wx = 0;wy = x0+wy;while(1){x0 = wx;gui_rline(x0, y0, y1);if(wx>=wy) break;wx++;}return;}}if(dy>0) // 判断y轴方向{dy_sym = 1; // dy>0,设置dy_sym=1}else{if(dy<0){dy_sym = -1; // dy<0,设置dy_sym=-1 }else{//dy==0,画水平线,或一点wx = y0-wx;if(wx<0) wx = 0;wy = y0+wy;while(1){y0 = wx;gui_hline(x0, x1, y1);if(wx>=wy) break;wx++;}return;}}// 将dx、dy取绝对值dx = dx_sym * dx;dy = dy_sym * dy;//计算2倍的dx及dy值dx_x2 = dx*2;dy_x2 = dy*2;//使用Bresenham法进行画直线if(dx>=dy) // 对于dx>=dy,则使用x轴为基准{di = dy_x2 - dx;while(x0!=x1){//x轴向增长,则宽度在y方向,即画垂直线draw_a = y0-wx;if(draw_a<0) draw_a = 0;draw_b = y0+wy;gui_rline(x0, draw_a, draw_b);x0 += dx_sym;if(di<0){di += dy_x2; // 计算出下一步的决策值}else{di += dy_x2 - dx_x2;y0 += dy_sym;}}draw_a = y0-wx;if(draw_a<0) draw_a = 0;draw_b = y0+wy;gui_rline(x0, draw_a, draw_b);}else // 对于dx<dy,则使用y轴为基准{di = dx_x2 - dy;while(y0!=y1){//y轴向增长,则宽度在x方向,即画水平线draw_a = x0-wx;if(draw_a<0) draw_a = 0;draw_b = x0+wy;gui_hline(draw_a, y0, draw_b);y0 += dy_sym;if(di<0){di += dx_x2;}else{di += dx_x2 - dy_x2;x0 += dx_sym;}}draw_a = x0-wx;if(draw_a<0) draw_a = 0;draw_b = x0+wy;gui_hline(draw_a, y0, draw_b);}//***********画矩形函数*************************************// //x0、y0为矩形左上角坐标值,x1、y1为矩形右下角坐标值********// //**********************************************************// void gui_rectangle(uchar x0 , uchar y0 , uchar x1 , uchar y1){gui_hline(x0 , x1 , y0);gui_rline(x0 , y0 , y1);gui_rline(x1 , y0 , y1);gui_hline(x0 , x1 , y1);}//****************画填充矩形函数****************************// //x0、y0为矩形左上角坐标值,x1、y1为矩形右下角坐标值********// //**********************************************************// /*void gui_rectangle_fill(uchar x0 , uchar y0 , uchar x1 , uchar y1){uchar i;//转换数据的中间变量,使x1、y1大if(x0 > x1){i = x0;x0 = x1;x1 = i;}if(y0 > y1){i = y0;y0 = y1;y1 = i;}//***判断是否是直线***//* if(y0 == y1)//画水平线{gui_hline(x0 , x1 , y0);return;}if(x0 == x1)//画竖直线gui_rline(x0 , y0 , y1);return;}while(y0 <= y1)//画填充矩形{gui_hline(x0 , x1 , y0);y0 ++;}} *///*******************画正方形函数*************************// //x0、y0为正方形左上角坐标,with正方形边长****************// //********************************************************// /*void gui_square(uchar x0 , uchar y0 , uchar with){if(with == 0)return;if((x0 + with) > 127)//横轴超出液晶边界return;if((y0 + with) > 63)return;gui_rectangle(x0 , y0 , x0 + with , y0 + with);} *///****************画填充正方形函数*************************// //x0、y0为正方形左上角坐标,with正方形边长*****************// //*********************************************************// /*void gui_square_fill(uchar x0 , uchar y0 , uchar with){if(with == 0)return;if((x0 + with) > 127)//横轴超出液晶边界return;if((y0 + with) > 63)return;gui_rectangle_fill(x0 , y0 , x0 + with , y0 + with);} *///****************画圆函数*********************************////x0、y0为圆心坐标,r为圆的半径****************************////*********************************************************///*void gui_circle(uchar x0 , uchar y0 , uchar r){char a , b;char di;if(r > 31 || r == 0)//圆大于液晶屏或者没半径则返回return;a = 0;b = r;di = 3 - 2 * r;//判断下个点位置的标志while(a <= b){lcd_set_dot( x0 - b , y0 - a);//3lcd_set_dot( x0 + b , y0 - a); //0lcd_set_dot( x0 - a , y0 + b); //1lcd_set_dot( x0 - b , y0 - a); //7lcd_set_dot( x0 - a , y0 - b); //2lcd_set_dot( x0 + b , y0 + a); //4lcd_set_dot( x0 + a , y0 - b); //5lcd_set_dot( x0 + a , y0 + b); //6lcd_set_dot( x0 - b , y0 + a);a ++;//***使用bresenham算法画圆********//* if(di < 0)di += 4 * a + 6;else{di += 10 + 4 * (a - b);b --;}lcd_set_dot( x0 + a , y0 + b);}} *///***************************************************************************// //***************************画正椭圆函数************************************// //说明:给定椭圆的四个点的参数,最左、最右点的x轴坐标值为x0、x1,最上、最下点// 的y轴坐标为y0、y1.//说明:----------------------------显示效果不好//***************************************************************************// /*void gui_ellipse(char x0, char x1, char y0, char y1){char draw_x0, draw_y0; // 刽图点坐标变量char draw_x1, draw_y1;char draw_x2, draw_y2;char draw_x3, draw_y3;char xx, yy; // 画图控制变量char center_x, center_y; // 椭圆中心点坐标变量char radius_x, radius_y; // 椭圆的半径,x轴半径和y轴半径int radius_xx, radius_yy; // 半径乘平方值int radius_xx2, radius_yy2; // 半径乘平方值的两倍char di; // 定义决策变量/* 参数过滤*//* if( (x0==x1) || (y0==y1) ) return; *//* 计算出椭圆中心点坐标*//* center_x = (x0 + x1) >> 1;center_y = (y0 + y1) >> 1; *//* 计算出椭圆的半径,x轴半径和y轴半径*//* if(x0 > x1){ radius_x = (x0 - x1) >> 1;}else{ radius_x = (x1 - x0) >> 1;}if(y0 > y1){ radius_y = (y0 - y1) >> 1;}else{ radius_y = (y1 - y0) >> 1;} *//* 计算半径平方值*//* radius_xx = radius_x * radius_x;radius_yy = radius_y * radius_y; *//* 计算半径平方值乘2值*//* radius_xx2 = radius_xx<<1;radius_yy2 = radius_yy<<1; *//* 初始化画图变量*//* xx = 0;yy = radius_y;di = radius_yy2 + radius_xx - radius_xx2*radius_y ; // 初始化决策变量/* 计算出椭圆y轴上的两个端点坐标,作为作图起点*//* draw_x0 = draw_x1 = draw_x2 = draw_x3 = center_x;draw_y0 = draw_y1 = center_y + radius_y;draw_y2 = draw_y3 = center_y - radius_y;lcd_set_dot(draw_x0, draw_y0); // 画y轴上的两个端点lcd_set_dot(draw_x2, draw_y2);while( (radius_yy*xx) < (radius_xx*yy) ){ if(di<0){ di+= radius_yy2*(2*xx+3);}else{ di += radius_yy2*(2*xx+3) + 4*radius_xx - 4*radius_xx*yy;yy--;draw_y0--;draw_y1--;draw_y2++;draw_y3++;}xx ++; // x轴加1draw_x0++;draw_x1--;draw_x2++;draw_x3--;lcd_set_dot(draw_x0, draw_y0);lcd_set_dot(draw_x1, draw_y1);lcd_set_dot(draw_x2, draw_y2);lcd_set_dot(draw_x3, draw_y3);}di = radius_xx2*(yy-1)*(yy-1) + radius_yy2*xx*xx + radius_yy + radius_yy2*xx - radius_xx2*radius_yy;while(yy>=0){ if(di<0){ di+= radius_xx2*3 + 4*radius_yy*xx + 4*radius_yy - 2*radius_xx2*yy;xx ++; // x轴加1draw_x0++;draw_x1--;draw_x2++;draw_x3--;}else{ di += radius_xx2*3 - 2*radius_xx2*yy;}yy--;draw_y0--;draw_y1--;draw_y2++;draw_y3++;lcd_set_dot(draw_x0, draw_y0);lcd_set_dot(draw_x1, draw_y1);lcd_set_dot(draw_x2, draw_y2);lcd_set_dot(draw_x3, draw_y3);}} *///******************************************************************* //*******画满屏图片-----本程序为逐行写,因此图片数据也应该是逐行取的//参数:dat为填充的数据------用本程序时需要满屏图的数组//******************************************************************* /*void gui_draw_full_picture (unsigned char *dat){unsigned char i;unsigned char j;unsigned char k;unsigned char bGDRAMAddrX = 0x80; //GDRAM水平地址unsigned char bGDRAMAddrY = 0x80; //GDRAM垂直地址for(i = 0; i < 2; i++){for(j = 0; j < 32; j++){for(k = 0; k < 8; k++){write_com(0x34); //设置为8位MPU接口,扩充指令集,关闭绘图显示write_com(bGDRAMAddrY+j); //垂直地址Ywrite_com(bGDRAMAddrX+k); //水平地址Xwrite_dat(*dat++); //写数据高字节write_dat(*dat++); //写数据低字节}}bGDRAMAddrX = 0x88; //写下半屏幕}write_com(0x36); //打开绘图模式write_com(0x30); //恢复基本指令集,关闭绘图模式} */unsigned char code DCB2HEX_TAB[8] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01}; //****************************输出一行数据函数,此行可任意长,不必非得是8的倍数**和下个函数合用画任意大小(矩形)的图形或汉字//参数:flag反显标志,1为反显,x、y为指定显示位置的起始点,*dat要输出的点阵数组,no显示此行所需的点个数,即图形一行的点数void gui_loadline(unsigned char x,unsigned char y,unsigned char *dat,unsigned char no,unsigned char flag){unsigned char bit_dat;unsigned char i;/* 参数过滤,若指定显示位置超出液晶屏则返回*/if(x>127) return;if(y>63) return;for(i=0; i<no; i++)//超出本行所规定的点数则本行显示完成{/* 判断是否要读取点阵数据,每字节的开始读取一次点阵数组即i为8的倍数时*/if( (i%8)==0 ) bit_dat = *dat++;/* 对相应的点打1或打0,i&0x07意思是对8求余*/if( (bit_dat&DCB2HEX_TAB[i&0x07])==0 )//取出i对应的位,并判断是否为0{if(flag==0) //判断是否反显,该位取出的数据为0,反显要打为1,flag==0代表不反显GUI_Point(x,y,0); //正常显示0,GUI_Point(x,y,0)代表在x、y处打0elseGUI_Point(x,y,1); //将0反显}else{if(flag==0)GUI_Point(x,y,1);elseGUI_Point(x,y,0);}if( (++x)>127) return;//若显示超出了液晶屏则返回}}//*********************************************************************//********在自定义大小的区域内画图或画字函数****************************//参数说明:x、y指定显示区域的起始点坐标// dat 要输出显示的图形或汉字点阵数组。
字库生成程序使用方法
字库生成程序使用方法MakeFontLibV34.exe可用来生成SCL2008/SuperComm播放文本文件或直接输出文字所需要的字库文件。
1. 运行该程序2. 生成英文字库2.1 在Width和Height中输入英文文字大小(一般英文字符占半个汉字位置)2.2 如果显示屏要旋转90度使用,则选中Rotate 90 d2.3 点ASCII按钮弹出字体对话框,选择所需的字体,注意字体大小应与2.1中输入的大小一致,否则程序会自动缩放到2.1中输入的大小2.4 点确定后显示你所选择的字体信息,若正确则点Accept按钮弹出另存为对话框,选择或输入文件名点保存生成英文字库文件2.5 程序在窗口的最下方编辑框里输出字库定义字符串,须添加到CONFIG.LY文件中3. 生成中文字库3.1 在Width和Height中输入中文文字大小3.2 在1st Byte和2nd Byte处选择文字编码的起始位置:GB2312简体字编码,在1st Byte处选A0H,在2nd Byte处选A0H;Big5繁体字编码,在1st Byte处选80H,在2nd Byte处选40H。
其它编码请查阅其编码表3.3 点Local Languange按钮弹出字体对话框,选择所需的字体,注意字体大小应与2.1中输入的大小一致,否则程序会自动缩放到2.1中输入的大小3.4 点确定后显示你所选择的字体信息,若正确则点Accept按钮弹出另存为对话框,选择或输入文件名点保存生成中文字库文件3.5 程序在窗口的最下方编辑框里输出字库定义字符串,须添加到CONFIG.LY文件中4. 加载字库到控制卡4.1 修改CONFIG.LY文件,将生成字库后最下方编辑框里输出的文字添加到CONFIG.LY文件中。
并根据实际字库数量修改FontCount 的值4.2 将CONFIG.LY文件和所生成的字库上传到控制卡上即可。
字体库制作的方法和流程哦
字体库制作的方法和流程利用现有程序进行字库制作如果你是专业字体设计师,那么你一定有过制作一套属于自己的全新的中文字库之梦;但是,毕竟中文字库属大字符集当然是或大于6763个字符的字库,个人想徒手直接设计一整套中文字体谈何容易其繁复程度足以使任何人却步;但是,当今世界上图形图像程序软件已经如此发达,难道没有什么办法利用现在已有的通用软件,将复杂的工作简化,使设计师自己可以独立完成这一艰巨的工作的吗本文就时装字体的设计经验,介绍一种相对简单的方法,帮你完成的心愿;这种方法的意义在于能够使得字体设计工作化繁为简;大前提:如果你仅仅是为了设计新字样或仅只几个字,那么研读本文对你没多大帮助;本文并不介绍新字样的设计;本文是帮你在已产生了字体设计的设想之后,如何利用已有资源、不花费太大力气地将整个字库6763汉字或更多,如欲英文、数字、标点一起处理的话,包括进来即可制作出来;因此,你必须会使用图形处理的通用软件,这包括:PhotoShop、Illustrator、CorelDRAW考虑到字库制作的特殊性,应当以矢量软件为主;什么程度算是“会使用”本文是在介绍字库设计方法,不是软件教学,所以,软件使用方法点到为止;如果不能看明白,说明你还不会熟练使用,即请自行加强研究;这样做的主要目的是为了在尽量短的文字里多介绍具体方法的关键之处;关于硬件要求;说起来似乎可笑:介绍软件应用的文章,说什么硬件要求尽管如此,还是想说说:CPU当然越快越好,硬盘也是越快越大越好;硬盘设定提醒:最好把Windows的临时文档和应用图形图像软件的临时文档不要放到同一分区上,找一个空没有存放任何文件的分区更好,另放一张空的物理硬盘最好;如有条件,专门软件可做一个内存虚拟的硬盘,把那些需要倒来倒去的文件放在上面,速度会快不少;关键是内存一定要大;会使用PS的人都知道,如果图大,内存又不很充足的话,PS的某些特效是不能使用的;Illustrator有过之而无不及;即便内存足够充分,也会经常出现out of memory的要求放弃选框;我们最好不要让它出现;内存越大越好;最小1G;为什么要这么强调计算机的物理指标因为我们希望一次性地将GB2312里面的6763个字符处理完毕,这样才可以达到简化字符操作之目的;所以我们最好把所有文字放在一个文件里;在建立文件的时候,如果有可能,当然建立一个包含6763个汉字的文档;这样才能在以后动作时不必反复操作;这时就看出机器物理指标的重要性了;如果你一时无法满足要求,那么就只好退而求其次,将6763个字分割成为几块,分块处理,也没什么别的,就是麻烦点;具体方法1. 启动PS,将现有字体按照需要排列在一起,位图化;注意:1,字与字之间留有足够的空隙,以免在分割字符的时候相互影响;2,字要足够大,一般应当在10cm10cm 以上,否则矢量化的时候,精密程度会受影响;2. 按照事先的设想,对每一个字的位图笔画进行分层划分,一层一种笔画;例如1层,丶;2层,一;3层,丨;4层,丿;5层…….汉字所有不同的笔画加在一起,大概在40~50之间,应当不会超过255个,PS最多能够接受255层,满足一般的设计要求应当没有问题;或许有人会问:如果超过255怎么办也好办,再Copy一份即可;注意事项:1,汉字笔画种类虽然不多,但同一种笔画,有长短之分;不同长短之间,不同的字体设计,往往会有不同的处理方式,若相互混淆,就不美妙了;所以,在分层之初,先要做好样本测试;不要上来就干,否则事倍功半;3. 启动CorelDRAW Trace,对分层的位图进行中心矢量化;保存成为矢量文件,譬如wmf文档;4. 同样地,再在矢量软件我用的是Illustrator里建起一张分层的矢量图,将所有的矢量化的图形分层堆叠在一起;当然得有所调整,否则对不齐;5. 针对不同的层笔画,用矢量软件的填充功能一般矢量软件都有这种功能进行填充;6. 利用各种“笔刷”、“画笔”填充之后,你几乎可以得到这种结构字体除了结构变化之外的所有变化;当然,如果你水平高,或许也能填充出结构有所改观的字体来不可能脱胎换骨;但是如果想找到原字体,大概连影子也看不到了;该方法总的来说应当仅仅是一个思路;具体操作起来可以有各种变通;譬如使用CorelDRAW比较熟练的朋友,从CorelDRAW就可以完成这个工作;使用FreiHand 比较熟练的朋友,使用FreeHand也可以单独完成这个工作;完成之后,如果需要转换成为AI格式的文档,另存转换一下就可以了;当然也可以直接转换为BMP位图; FontLAB可以接受Ai的剪贴板,如果你在Illustrator里面制作的话,直接使用拷贝粘贴的方法就可以创作一个全新的字库了;直接使用Illustraor Copy&Past到FontLAB里面的好处是你设计的画笔的节点就是FontLAB里面的二阶控制点;这样所Copy出来的字库本身就是一个精密字库;关于精密字库和率意字库之区别,请参阅“提高字库质量”一文;如果你没有人力,还也希望快速得到这个字体字库,那就只有找做字网了;我们可以快速帮助你完成这个工作;但是我们的这个服务是收费的;当然,速度快,且收费价格低廉;这里,我们提供一种我们已经制作好了的、包含6763个汉字和一般常用英文、数字、标点的Illustrator的AI格式的文件;文件尽管还有各种毛病,但是基本够用;如果你有兴趣,可以下载之后自己试一试;选结构制作这种字体,首先需要确定的是你需要以一种什么样的字体结构创作你的新字;因为基于这种字体的结构,你将不止制作一个字库,而是将反复使用多次;所以,你对结构基础用字应当慎之又慎;因为你还需要对这个字体下大功夫处理,一旦感觉得不好,想换,可以,但你以前的劳动就白费了;所以说要慎之又慎;结构的变化更具有视觉的基本性;所以,理论上讲,只有达到了结构变形,整个字体才真的改变了;但是怎样才能够达到结构的变化呢大至以下几种方法可供参考:1,两字叠加法;找到两种字体,用和两种字体的结构进行叠加,从而达到创建一种新的字体结构的目的;该方法尽管理论可行,但是找到两种可以叠加的字体并不容易;因为你想叠加的字体往往参差不齐,如何修理这种参差不齐就成为该方法成败的关键;因为不是仅仅能修就可以了,而且得相对省事才行,否则过于繁琐,等于不能做;具体方法如下:A,找到两种笔画结构基本相近的字形;B,按照统一的格式进行排版,并且保证各笔画可以相互叠加到一起;C,叠加后的字形必然是参差不齐的,可用橡皮进行涂擦;D,如果嫌该涂擦过程过于繁琐,可以先行中心矢量化,转而将矢量文件导入PS,用画笔填充后,转为位图,再涂擦,这样可以稍微省事一些,不过基本的劳动还是得付出的;2,不论是在PS里面还是Illustrator里面,都有“变形”工具,可以利用它进行字体结构的变化;当然,最好这种变化是和笔画的设计结合起来的;否则过于简单机械,意思不大;具体方法是:先排版,解散群组,然后变形处理;注意,中心矢量化之后是不能够进行变形的;因为矢量化之后的图像本来就没有群组,如果变形,都是单独笔画自己在变形,也应当属于后果不可预料和控制一类;3,从一个字库的结构走向另一个字库的结构;还有一种创新字体结构的方法,就是从一种字体结构出发,利用笔画填充的技巧,令该字库的结构发生某种应当说是微量变化,然后将新字文件轮廓化之后,导成位图,再矢量化,如此反复,可令字体结构发生变化;如果你手段高明,别人或许还以为你新创作了一种字体结构;只是这种结构控制的方法比较繁琐,况且,每次都得分割笔画,投入也比较大;分块处理由于机器内存太小或软件不支持等等,很有可能在程序里不能够一次性完成6763个汉字字符的处理;这时只有分块处理;根据我们的经验,比较方便的是将文字排列为正方形,这样有利于后期的对齐和分割测量工作;刚开始需要建立位图,位图的占地面积应当充足地大;否则会影响精密度;关于如何分块这是一个分块的技巧问题;1, 分成方块,而不是长方形块;务必注意字间距和行间距;间距最好大一些,给后期处理留下一个方便的空间;否则悔之晚矣;2, 在程序能够接受的范围内,尽量少分;能少分一块,就少分一块,使用时就减少一次麻烦,劳动强度也会减少一些;也许有人会问,我使用ATN,多一块与少一块有什么区别有区别;因为我们的这种对字体的处理方法是基于Illustrator等矢量图形处理软件的;而ATN在Illustrator里面从来都不像是在PS里面一样好用;否则我们就会发布单字符的AI文件;譬如针对PS,我们就有相对的单字文件集;3, 最好把常用字和非常用字分开处理;因为有可能你会认为一次处理6763个字太麻烦,从而希望先少处理一些,看看效果以后再说,有了这种区分,就比较好处理了;否则将难以为继;4, 最好按照笔画数排序Access里面可以进行后再分块处理;不同的笔画数的填充可能会有所变化;譬如少笔画数的字的笔画填充可能需要粗一些的图案,而多笔画的字的笔画填充,笔画就得相应变细一些;有了笔画数的区分,你的处理就会方便很多;5, 英文大小写、阿拉伯数字、标点符号这些部分应当单独作为一块进行处理;因为这些东西和中文字没什么关系,也没有笔画对应的必然性;关于字符处理数和排版形状我们现在绝大多数大陆的书报刊市场使用GB2312标准的字库;GB2312内有6763个简体中文字字符;能不能处理更大的字符集当然可以,只是更麻烦罢了;其实GB2312就已经够用;如果是在一个小范围内使用的话,仅处理GB2312内的常用字3755个汉字字符也可以够用;处理3755的好处当然是更加简单方便;为什么一定要正方形主要是考虑到后期对字库进行处理时,需要对字符进行分割,在对位图进行百分比划分时,正方形易于使用PS的网格参考线对齐;如果不是正方形就会十分麻烦;此外,使用正方形也容易估测字间距与行间距;当然,如果你用不到这些,也就无所谓是否正方形了;对于6763汉字,如果作为一块正方形处理,就应当是83行×83列,略有余数;如果分为10块,大致是26行×26列;如果只处理3755个常用字,也须以正方形对行列进行开平方计算处理;文字制作技巧不分层行不行有人为了省事,希望直接用现成的字体进行填充;当然可以实现,只不过由于中心矢量化是程序自动进行的,在其过程中无法进行人工干涉,而程序进行的结果会在所有笔画分叉处形成断点,这在以后的填充当中会产生既无法预料也无法控制的结果;这一般不是我们所需要的;利用已经中心矢量化的文件,直接分层利用中心矢量化,直接对字体进行跟踪、分层,在某些情况下会比利用PS更加方便;好处是对笔画的选取比较方便直观,不像在PS里面要用橡皮擦来擦去的,既不容易擦好,也不容易消除尖角点;但也有不便宜之处:直接矢量化对于稍粗的笔画,尤其是对于有交叉的粗笔画,会产生倾斜失真;因为在中心矢量化的时候,Trace并不能智能处理你的交叉笔画;在Illustrator里面分解,矢量线在结点处被切断,需要将其连接起来;转到PS里面,用画笔描绘一遍,然后再次中心矢量化,所有断裂的笔画就全部自动缝合起来了;这样做唯一的缺点是文件格式反复翻转,会对字体细节有一定的损失;应当注意;每次翻转的时候要严格与原作相符合才好;细化字体笔画,建立精确结构你在矢量化字体的时候,一定会发现,在中心细化的过程中,细笔画的字体,还原比较真实;笔画越粗,失真越严重;所以,我们建议对于所有需要使用的字体,使用前都进行一次细化处理;注意,这种细化处理不是在PS里,而是在Illustrator里,使用距离位移工具进行;具体大小得看你图像和字体原始设置的大小;为什么一定要使用Illustrator为什么不能使用PS这里涉及到两种不同的图形图像处理方式,原理说起来比较复杂,在此从略;总而言之,使用Illustrator的距离位移工具细化字体笔画,可以最大限度地接近于原始真实,这是用PS不能或不便达到的;关于矢量化的方向问题什么是矢量矢量是一个有方向有大小的量;现在的程序对矢量的大小似乎还没有多少控制,但是矢量的方向却是有意义的;你在中心矢量化之后所得到的矢量笔画描述就是一个有方向的描绘;其作用体现在当你在Illustrator里填充一个自己已经设计好的图形笔画的时候,如果不能掌握该矢量的方向,就有可能会将头尾倒置或各笔画的头尾顺序不一;CorelDRAW Trace的跟踪方向是从左上角向右下角进行的,所以,你的位图图像当中的笔画,最好是顺同这个方向的;如果不顺怎么办好办,旋转一下,顺过来就是了;至于在旋转图像之后整造成的图像面积变化,可暂不理睬;因为矢量化后,无图像的空白部分会自动消除,你只需要在Illustrator里面打开、对齐就可以了;对于有弯曲的笔画,也需要如此处理;弯曲越多,越得小心谨慎;最好是把同一个弯曲方式的笔画编排在一起;否则将难以控制;关于字库软件及方法如果你真的想使用FontLAB Copy&Past制作一个字库的话,你当然最好有一个正版的;FontLAB公司的FontLab Studio for Win US$,网上虽可找到盗版;但不论哪种,都只支持6400个字符;这显然是冲着中文来的;你当然可以把一个字库分割成为两个部分进行,然后再在FontCreat里面合成;不过这样FontLAB所支持的多种文件格式也就都都没用了——这就是FontLAB的销售和推广策略;专门为亚洲文字设计的AsiaFont Studio 4 for Windows US$1999;据说为防盗版,须有解密U盘;其实AsiaFont就是FontLAB的一个多字符版本而已,没有更多新鲜处;大概是嫌亚洲文字当然就是中文使用者买得少,所以,到之后,再没兴趣把AsiaFont与FontLAB并驾齐驱地再开发了;其实并不是我们不买他的账,的确是它仅解决了字库文件格式问题,而没有解决汉字其它困难问题;大概以为都是字库,中西文是一回事,只因不愿意购买正版而弃之不用;其实南辕北辙,差着老大一截子哩看来跨文化、跨语言的字库制作工具绝不那么简单;关于借助外力当你会使用上述方法之后,现在所面临的问题就已经不是字体设计,而是如何简便从事,并且赚到钱;最简单的就是花钱雇人;谁都想借助外力完成自己的工作;问题在于价格;譬如你自己完全可以徒手设计一套字体,但是如果你的劳动不足以回报你的价值,如果字库不能卖出一个好价钱,你自然也没有心情去做;怎样才能够得到一个好的价钱这不是本文所讨论的问题,各位都是字体设计专家,相信各自都有自己的服务对象和销售渠道;想提醒各位的是:市场需要培育;别想一口吃成个胖子;现在中文字库市场,由于受盗版排挤,正规市场已消亡殆尽;对你来讲,所剩或许只有你所联系的需要字库的单位;倘你能将自己设计的字库销售出去,不亏本,略有盈余,就已经赚了,因为你还用字库做了个广告;这个广告难道不等于白赚吗不要小看这个广告,多少人搞了一辈子字体设计,书也不知道出了多少本,却还从未做成过一个字库哩况且,凭此广告,你完全可以进行更大规模的新一轮推销;长此以往,才能建立起一个围绕着你自己的字库市场;在你已经基本上可以比较简单地完成整个字库的设计工作后,现在的繁琐劳动主要表现在前期的笔画分解和后期的字库扫描两个方面;怎样简化劳动,尤其是简化简单劳动在此给你提点建议:笔画分解是可以雇人完成的;分解笔画比较简单,水平低一点的学生、计算机初学者等等,都可以在你的指导下完成;就像打字一样,只不过这是图像处理罢了;现在我们提供的分解文件就是请人帮忙完成的;对于字库扫描,学生们也可以做,只是生手做起来不容易做到均匀码放;我们做字网专门制作字库;具体过程请参阅价格策略部分;关于精密字库作字体设计的人,都希望自己的字库制作成为一款精密字库,而不希望制作成为率意字库;这是可以理解的;做字网只制作率意字库而不制作精密字库;如果想要精密字库,请另请高明抑或使用Copy&Past的方法,在FontLAB里面进行;可以顺利完成,就是麻烦一点而已;。
字体库制作的方法和流程(免费哦)
字体库制作的方法和流程利用现有程序进行字库制作如果你是专业字体设计师,那么你一定有过制作一套属于自己的全新的中文字库之梦。
但是,毕竟中文字库属大字符集(当然是或大于6763个字符的字库),个人想徒手直接设计一整套中文字体谈何容易!其繁复程度足以使任何人却步。
但是,当今世界上图形图像程序软件已经如此发达,难道没有什么办法利用现在已有的通用软件,将复杂的工作简化,使设计师自己可以独立完成这一艰巨的工作的吗?本文就时装字体的设计经验,介绍一种相对简单的方法,帮你完成的心愿。
这种方法的意义在于能够使得字体设计工作化繁为简。
大前提:如果你仅仅是为了设计新字样或仅只几个字,那么研读本文对你没多大帮助。
本文并不介绍新字样的设计。
本文是帮你在已产生了字体设计的设想之后,如何利用已有资源、不花费太大力气地将整个字库(6763汉字或更多,如欲英文、数字、标点一起处理的话,包括进来即可)制作出来。
因此,你必须会使用图形处理的通用软件,这包括:PhotoShop、Illustrator、CorelDRAW(考虑到字库制作的特殊性,应当以矢量软件为主)。
什么程度算是“会使用”?本文是在介绍字库设计方法,不是软件教学,所以,软件使用方法点到为止。
如果不能看明白,说明你还不会熟练使用,即请自行加强研究。
这样做的主要目的是为了在尽量短的文字里多介绍具体方法的关键之处。
关于硬件要求。
说起来似乎可笑:介绍软件应用的文章,说什么硬件要求?!尽管如此,还是想说说:CPU当然越快越好,硬盘也是越快越大越好。
硬盘设定提醒:最好把Windows 的临时文档和应用图形图像软件的临时文档不要放到同一分区上,找一个空(没有存放任何文件)的分区更好,另放一张空的物理硬盘最好。
如有条件,专门软件可做一个内存虚拟的硬盘,把那些需要倒来倒去的文件放在上面,速度会快不少。
关键是内存一定要大。
会使用PS的人都知道,如果图大,内存又不很充足的话,PS的某些特效是不能使用的。
字库安装方法
字库安装方法
字库是计算机操作系统中的一种重要组成部分,它包含了各种字体和
字符集。
在使用电脑时,我们常常需要安装新的字库以支持更多的语
言或美化文档排版。
下面是一个全面详细的字库安装方法:
1. 首先,我们需要下载所需的字库文件。
可以从官方网站或第三方网
站下载,确保下载来源可靠。
2. 下载完成后,双击打开压缩包或解压缩文件夹,并找到字体文件。
通常情况下,字体文件的扩展名为.ttf、.otf或.dfont等。
3. 右键点击字体文件,并选择“安装”选项。
此时会弹出一个对话框,显示正在安装该字体。
4. 安装完成后,在任何支持该字体的应用程序中都可以使用该字体了。
例如,在Microsoft Word中选择“字体”选项卡,在下拉菜单中找
到并选择刚刚安装的新字体即可。
5. 如果需要在操作系统级别上管理已安装的字体,则可以打开“控制
面板”,并选择“外观和个性化”选项。
接着,在左侧导航栏中选择“字体”选项,即可看到已安装的所有字体列表。
6. 如果需要卸载某个不再需要使用的字库,则只需在字体列表中找到该字体,右键点击并选择“删除”选项即可。
总之,安装字库是一个非常简单的过程,只需几个简单的步骤即可完成。
通过安装新字库,我们可以使我们的文档更加美观、多样化,并支持更多的语言。
字库编辑程序
字库编辑程序字库编辑程序字库编辑程序应当属于专业性比较强的通用软件程序。
字库在西方文字环境下,实在算不得是个什么大事。
在中文环境下,因为实在是太麻烦,且又容易被盗版而很少有人去做。
所以,现在市面上见得到的字库编辑程序不多,对于一般爱好者来说,也都算不上好使。
附带说一句,一般稍微专业一点程序,对于本专业的应用,都会直接调用地层函数,或者直接写汇编代码。
由于字库软件是对字库进行操作的,所以,一切汉化的有关字库的软件都不大保险(尽管其它汉化也不太保险,但是相对来说,字库方面的更不保险)。
会产生什么问题呢?毛病小的时候,会产生诸如写的某些域被破坏(由于字库内涉及的域太多,具体破坏了哪些域还真不好说。
TrueType的定义域大概有1000行,绝大多数没有什么用处,但是谁也不知道什么域在什么地方有用)。
所以,如果你要有志于编辑自己的字库,一定要使用原版的程序,而决不要使用什么汉化版。
使用汉化版看上去可能比使用原版程序省事,但是有可能会毁掉你所有的工作。
有关字库程序这里介绍如下:1,High-Logic公司的Font Creator Program 4.1版。
这是一款试用期为30天,30天过后需要注册的字库编辑软件。
FCP4.1支持双字节字,全英文操作界面。
这款字库编辑软件大概是现在见得到的最便宜好用的字库编辑软件了。
此前的FCP3.0版,虽然功能上少一些(例如不能够扫描位图),但是在30天试用期过期之后,仍旧可以使用。
登陆到High-Logic公司的页面,可以随时下载最新版本。
2,Softy 1.07版。
注册软件,但是不注册也能使用。
支持双字节字。
虽然不是很好用(不大直观、也不太方便),但却可以一用。
3,Macromedia公司的Fontographer 4.1版。
Macromedia 公司是一家著名的软件公司。
其麾下的有著名的Dreamwavre、Flash、FireWorks、Authorware、FreeHand等等,可惜,它的Fontographic 4.1版只支持单字节字,全英文界面。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/*主程序ﻩﻩ*/
/**/
/*********************************************************/
main()
{
uchari;
delay(10);//延时
wela=0;
dula=0;
lcd_init();//初始化LCD
lcd_pos(0,0);//设置显示位置为第一行的第1个字符
/**/
/*******************************************************************/
bitlcd_busy()
{
bit result;
LCD_RS=0;
LCD_RW=1;
LCD_EN= 1;
delayNOP();
result=(bit)(P0&0x80);
void lcd_wcmd(uchar cmd)
{
while(lcd_busy());
LCD_RS=0;
LCD_RW = 0;
LCD_EN =0;
_nop_();
_nop_();
P0= cmd;
delayNOP();
LCD_EN= 1;
delayNOP();
LCD_EN= 0;
}
/*******************************************************************/
LCD_RS=1;
LCD_RW=0;
LCD_EN = 0;
P0= dat;
delayNOP();
LCD_EN= 1;
delayNOP();
LCD_EN = 0;
}
/*******************************************************************/
i=0;
while(dis1[i] != '\0')
{//显示字符
lcd_wdat(dis1[i]);
i++;
}
lcd_pos(1,0);//设置显示位置为第二行的第1个字符
i =0;
while(dis2[i] != '\0')
{
ﻩ_nop_();
_nop_();
ﻩ_nop_();
}
ﻩ}
}
/*******************************************************************/
/**/
/*检查LCD忙状态*/
/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。*/
/**/
/*LCD初始化设定*/
/**/
/*******************************************************************/
void lcd_init()
{
LCD_PSB =1;//并口方式
lcd_wcmd(0x34);//扩充指令操作
delay(5);
LCD_EN = 0;
return(result);
}
/*******************************************************************/
/**/
/*写指令数据到LCD*/
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。*/
/**/
/*******************************************************************/
带字库程序
————————————————————————————————作者:
————————————————————————————————日期:
#include<reg51.h>
#include <intrins.h>
ﻩ
#defineucharunsignedchar
#defineuintunsignedint
/**/
/*延时函数*/
/**/
/*******************************************************************/
voiddelay(int ms)
{
while(ms--)
{
uchari;
ﻩfor(i=0;i<250;i++)
{
_nop_();ﻩﻩ
lcd_wcmd(0x30);//基本指令操作
delay(5);
lcd_wcmd(0x0C);//显示开,关光标
dela;//清除LCD的显示内容
delay(5);
}
/*********************************************************/
ucharIRDIS[2];
uchar IRCOM[4];
voiddelay0(uchar x); //x*0.14MS
voidbeep();
void dataconv();
voidlcd_pos(uchar X,ucharY);//确定显示位置
/*******************************************************************/
/**/
/*写显示数据到LCD*/
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。*/
/**/
/*******************************************************************/
void lcd_wdat(uchardat)
{
while(lcd_busy());
/*TS12864A-3端口定义*/
#define LCD_dataP0//数据口
sbit LCD_RS=P1^0;//寄存器选择输入
sbitLCD_RW=P1^1;//液晶读/写控制
sbit LCD_EN = P2^5;//液晶使能控制
sbitLCD_PSB= P1^2;//串/并方式控制
sbitwela=P2^6;
sbitdula= P2^7;
uchar code dis1[] ={"欢迎指导工作"};
uchar codedis2[]={"淮南师范学院"};
ucharcode dis3[]={"罗雷雷"};
ucharcode dis4[] = {"胡伟伟"};
#define delayNOP();{_nop_();_nop_();_nop_();_nop_();};