ASCII码:共256个,在ASCII码点阵(fontdata)中,用8*16位表示一个ASCII码字模(dots)。也就是16个字节。
void lcd_put_ascii(int x, int y, char c)
unsigned char* dots = fontdata_8x16[c*16] /* c*16表示一个字符占16个字节, dots指向的是从第字符的ASCII码值*16的项*/
要在LCD上显示字模点阵,就要根据fontdata的数据,一个对一个位的扫描
for (int i=0; i<16; i++)
{
for (int b=7; b>=0; b--)
{
if (byte & (1<<b)) /* 从 第0行,一行8位,也就是一个字节,从高位开始扫, 扫0~7列 */
lcd_put_pixel(x+7-b, y+i);
}
}
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
要获取fbmem中的一些可变参数,var, 和不可变参数fix
struct struct fb_var_screeninfo var;
struct fb_fix_screeninfo fix;
fd_fb = open("/dev/fb0", O_RDWR);
if (ioctl(fd_fb, FBIOGET_VSCREENINFO, &var))
{
printf("can't get var\n");
return -1;
}
if (ioctl(fd_fb, FBIOGET_FSCREENINFO, &fix))
{
printf("can't get fix\n");
return -1;
}
为framebuffer在SDRAM中映射一块内存,相当于显存。以后就可以直接对内存操作,大小为screen_size = xres*yres*bis_per_pixel/8字节,这块内存的地址决定了整块LCD上的每个像素的颜色,即每一个像素的颜色用16位来表示。
fd_fb = open("/dev/fb0", O_RDWR);
fbmem =(unsigned char*) mmap(NULL, screen_size, PROT_WRITE | PROT_READ, MAP_SHARED, fd_fb, 0);
把汉字库文件是网上找的,也映射到SDRAM中去,直接对内存数组操作,就可以找到对应汉字的字模点阵
fd_hzk16 = open("HZK16", O_RDONLY);
汉字库的大小用fstat函数来计算出,man fstat就能知道用法
struct stat hzk_stat;
if (fstat(fd_hzk16, &hzk_stat))
{
printf("cant get hzk_stat\n");
return -1;
}
fzkmem = (unsigned char*)mmap(NULL, st.size, PROT_READ , MAP_SHARED, fd_hzk16, 0);
memset(fbmem, 0, screen_size); /* 清屏设为黑色 */
lcd_put_ascii(var.xres/2,var.yres/2, 'A');