最近做的项目中需要使用到hzk16。
以下转载自网络:
HZK16字库是符合GB2312标准的16×16点阵字库,HZK16的GB2312-80支持的汉字有6763个,符号682个. 其中一级汉字有 3755个,按声序排列,二级汉字有3008个,按偏旁部首排列. 我们在一些应用场合根本用不到这么多汉字字模, 所以在应用时就可以只提取部分字体作为己用.HZK16字库里的16×16汉字一共需要256个点来显示, 也就是说需要32个字节才能达到显示一个普通汉字的目的.我们知道一个GB2312汉字是由两个字节编码的,范围为0xA1A1~0xFEFE.A1-A9为符号区, B0到F7为汉字区. 每一个区有94个字符(注意:这只是编码的许可范围,不一定都有字型对应,比如符号区就有很多编码空白区域). 以下为部分代码:
int fd_fb; struct fb_var_screeninfo var; struct fb_fix_screeninfo fix; int screen_size; unsigned char *fbmem; unsigned int line_width; unsigned int pixel_width; int fd_hzk16; struct stat hzk_stat; unsigned char *hzkmem; void lcd_put_pixel(int x,int y,unsigned int color) { unsigned char *pen_8 = fbmem+y*line_width+x*pixel_width; unsigned short *pen_16; unsigned int *pen_32; unsigned char red,green,blue; pen_16 = (unsigned short *)pen_8; pen_32 = (unsigned int *)pen_8; switch(var.bits_per_pixel) { case 8: { *pen_8 = color; break; } case 16: { /* R:G:B = 5:6:5 */ red = ((color>>16)&0x1f)<<11; green = ((color>>8)&0x3f)<<6; blue = color&0x1f; *pen_16 = red | green | blue; break; } case 32: { *pen_32 = color; } default: { printf("Can‘t surport %d bpp\n",var.bits_per_pixel); break; } } } void lcd_put_ascii(int x,int y,unsigned char c) { unsigned char *dots = &fontdata_8x16[c*16]; int i,j; unsigned char byte; for(i=0;i<16;i++) { byte = dots[i]; for(j=7;j>=0;j--) { if(byte&(1<<j)) { /* show */ lcd_put_pixel(x+7-j,y+i,0xffffff); // 显示白色 } else { /* hide */ lcd_put_pixel(x+7-j,y+i,0x0); // 显示黑色 } } } } void lcd_put_chinese(int x,int y,unsigned char *str) { unsigned int area = str[0] - 0xA1; // 默认以UTF-8存储,"中"的UTF-8存储为D6D0,存储其实位置行列均为A1 unsigned int where = str[1] - 0xA1; unsigned char *dots = hzkmem + (area*94 + where)*32; // 每个区占据94个字符,每个字符占据32个字节 unsigned char byte; int i,j,b; for(i=0;i<16;i++) { for(j=0;j<2;j++) { byte = dots[i*2+j]; for(b=7;b>=0;b--) { if(byte&(1<<b)) { /* show */ lcd_put_pixel(x+8*j+7-j,y+i,0xffffff); // 显示白色 } else { /* hide */ lcd_put_pixel(x+8*j+7-j,y+i,0x0); // 显示黑色 } } } } }
时间: 2024-10-10 15:19:01