版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
LCD中文字符显示机制的原理如何将字符显示到LCD一、字符显示机制1.字符显示原理要在LCD上显示一个字符,需要以下两步:①占据屏幕上的一块地方,大小由字体大小说了算;②在占据的地方上依次控制每个像素点是否显示。比如中文字符24×24字体大小表示水平需要24个像素点、垂直需要24个像素点。在这块24×24的地盘上,每个像素点是否显示由字模说了算,字模中的每1位数据表示一个像素点,如果该位为0则表示此处像素点不显示、为1则表示显示(阴码规则)。所以,字符显示的函数只需要基于打点函数实现即可。在程序中逐位读取字模,如果该位为0则该点写入背景颜色,如果该位为1则写入前景颜色。2.字模生成(点阵字体)正因为LCD显示字符的机制,所以该种字体被称为点阵字体。为了方便大家理解原理,这里我首先使用小工具生成字模。设置工具的字模生成规则如下,阴码、逐行式、顺向取模(图中有误)、C51格式:接着生成汉字的字模:接着复制生成数据,在程序中定义为一个二维数组作为字库,第一个值表示字库中的元素个数,可以由编译器自行判断,第二个值是每个元素的大小,必须要指明,这样我们就可以用hz_16x16[0]来找到汉字”春”在字库中的位置:#ifndef_HZ_H_#define_HZ_H_constunsignedcharhz_16x16[][32]={{0x01,0x00,0x01,0x00,0x7F,0xFC,0x01,0x00,0x3F,0xF8,0x02,0x00,0xFF,0xFE,0x08,0x20,0x10,0x10,0x2F,0xE8,0xC8,0x26,0x08,0x20,0x0F,0xE0,0x08,0x20,0x08,0x20,0x0F,0xE0},/*"春",0*//*(16X16,宋体)*/};#endif/*_HZ_H_*/我们选择的字体是16x16,所以:水平方向有16个像素点,每个像素点占1位,需要16bit,两个字节来表示一行;垂直方向有16行,所以整体有2*16=32个字节;此处需要注意,软件每16个字节生成一对花括号,这会影响二维数组取值,需要将中间多余的花括号去除。二、如何将字符显示到LCD1.打点函数支持字符显示需要打点函数的支持,这里我使用RGB-LCD的打点函数:voidlcd_draw_point(uint16_tx,uint16_ty,uint16_tcolor);2.字库支持引入刚刚我们创建二维数组的头文件:#include"hz.h"3.读取字模显示voidlcd_show_chinese(uint16_tx,uint16_ty,charch,uint16_tback_color,uint16_tfont_color,uint8_tfont_size){uint16_ti,j;uint16_tx_pos,y_pos,size,font_width,font_height;uint8_t*font_ptr;uint8_tbit_width,temp;if((x>(LCD_WIDTH-font_size))||(y>(LCD_HEIGHT-font_size))){return;}x_pos=x;y_pos=y;font_height=font_size;font_width=font_size;bit_width=8;size=(font_width/8+((font_width%8)?1:0))*font_height;font_ptr=(uint8_t*)&hz_16x16[ch];for(i=0;i<size;i++){temp=*(font_ptr+i);for(j=0;j<bit_width;j++){if(temp&0x80){lcd_draw_point(x_pos,y_pos,font_color);}else{lcd_draw_point(x_pos,y_pos,back_color);}temp<<=1;x_pos++;}if(x_pos>=(x+font_width)){y_pos++;x_pos=x;}}}实现之后记得声明:/***@briefShowachinesechar.*@param[in]x1horizontalstartposition.*@param[in]y1verticalstartposition.*@param[in]x2horizontalendposition.*@param[in]y2verticalendposition.*@param[in]choffsetinhzlibrary.*@param[in]back_colorrgb565*@param[in]font_colorrgb565*@param[in]font_sizesupport16.*@returnNone*@noteThisfunctionneedhzlibrary.*/voidlcd_show_chinese(uint16_tx,uint16_ty,charch,uint16_tback_color,uint16_tfont_color,uint8_tfont_size);4.测试显示在main函数中调用:lcd_show_chinese(0,0,0,BLACK,GREEN,16);编译、下载即可看到效果三、小字库的使用1.制作小字库在项目中,我们需要显示一些中文,但也没必要将整个汉字库包含进来,所以经常是制作本项目专属小字库。这里取模工具使用安富莱电子的MakeDot,非常方便:这里选择了输入文字重排,可以去除重复汉字,减少字库体积。将生成的整个数组复制作为之前我们创建数组hz_16x16的内容:#ifndef_HZ_H_#define_HZ_H_constunsignedcharhz_16x16[][32]={{0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,//!//0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00},{0x00,0x00,0x20,0x00,0x17,0xFE,0x10,0x08,0x80,0x08,0x43,0xC8,0x42,0x48,0x12,0x48,//河//0x12,0x48,0x22,0x48,0xE3,0xC8,0x22,0x48,0x20,0x08,0x20,0x08,0x20,0x28,0x00,0x10},{0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x7C,0xFE,0x44,0x12,0x44,0x12,0x44,0x12,0x44,//加//0x12,0x44,0x12,0x44,0x12,0x44,0x12,0x44,0x22,0x44,0x22,0x7C,0x4A,0x44,0x84,0x00},{0x01,0x00,0x01,0x00,0xFF,0xFE,0x01,0x00,0x01,0x00,0x7F,0xFC,0x48,0x24,0x44,0x44,//南//0x4F,0xE4,0x41,0x04,0x41,0x04,0x5F,0xF4,0x41,0x04,0x41,0x04,0x41,0x14,0x40,0x08},{0x00,0x40,0x20,0x40,0x10,0x40,0x10,0x40,0x87,0xFC,0x44,0x44,0x44,0x44,0x14,0x44,//油//0x14,0x44,0x27,0xFC,0xE4,0x44,0x24,0x44,0x24,0x44,0x24,0x44,0x27,0xFC,0x04,0x04},};#endif/*_HZ_H_*/这样就完成了我们整个项目小字库的制作,同样的方法,我们再制作出hz_24x24字库,hz_32x32字库。constunsignedcharhz_24x24[][72]={//...};constunsignedcharhz_32x32[][128]={};2.使用小字库进一步完善中文显示函数,找到获取字模数据的代码:font_ptr=(uint8_t*)&hz_16x16[ch]优化为:switch(font_size){case16:font_ptr=(uint8_t*)&hz_16x16[ch];break;case24:font_ptr=(uint8_t*)&hz_24x24[ch];break;case32:font_ptr=(uint8_t*)&hz_32x32[ch];break;default:return;}在main函数中进一步添加测试程序:lcd_show_chinese(0,0,1,BLACK,RED,16);//河lcd_show_chinese(16,0,3,BLACK,RED,16);//南lcd_show_chinese(32,0,2,BLACK,RED,16);//加lcd_show_chinese(48,0,4,BLACK,RED,16);//油lcd_show_chinese(64,0,0,BLACK,RED,16);//!lcd_show_chinese(0,20,1,BLACK,RED,24);lcd_show_chinese(24,20,3,BLACK,RED,24);lcd_show_chinese(48,20,2,BLACK,RED,24);lcd_show_chinese(72,20,4,BLACK,RED,24);lcd_show_chinese(96,20,0,BLACK,RED,24);lcd_show_chinese(0,60,1,BLACK,RED,32);lcd_show_chinese(32,60,3,BLACK,RED,32);lcd_show_chinese(64,60,2,BLACK,RED,32);lcd_show_chinese(96,60,4,BLACK,RED,32);lcd_show_chinese(128,60,0,BLACK,RED,32);四、进一步的优化本文中讲述的仅仅是最基本的中文显示方法,还可以进一步进行优化。①字
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论