驱动一个320*240 的液晶屏
这里不说 液晶控制器 的驱动,其实大部分的FTF液晶的驱动时序都比较简单 也就是是初始化等的操作命令极其繁琐,不过一般都会有一个厂家出的的初始换说明可供参考。
而我做FTF对 底层的色彩 与 文字字库 很有感触,先说说 颜色。我要将一个点显示在 液晶上对其颜色的描述 是一个U16 型的数
就是 R G B 其中 R5位 G6 位 B 5位 //红 绿 蓝
16比特模式分配给每种原色各为5比特,其中绿色为6比特,因为人眼对绿色分辨的色调更精确。 比如红光与绿光按某种比例复合,对三种锥状细胞刺激后产生的色觉可与眼睛对单纯的黄光的色觉等效。但决不能认为红光与绿光按某种比例复合后生成黄光,或黄光是由红光和绿光复合而成的。扯远了~~~~~~
#define RED 0xf800 //11111 000000 00000 红
#define GREEN 0x7e0 // 00000 111111 00000 绿
#define BLUE 0x001f
#define BLACK 0x0000
#define YELLOW 0xffe0
#define WHITE 0xffff
那么写一个点 就把颜色设好就好了。可以用 Image2Lcd 这个软件提取图片的颜色信息。颜色既然是16Bit 的 那么就有65536 种颜色了 也就是常说的6万5千色屏,这个级别在MP4与手机中比较常见。
好了 再来说说字模 比如说16*16 的 其实就是两个U8的数据做行共16 列 2*16=32 一个字要 32个 U8
比如说 "你", (十六进制)
0x90,0x00,0x90,0x01,0x88,0x20,0xC8,0x7F,0x44,0x20,0x2C,0x12,0x16,0x02,0x45,0x0A,
0xC4,0x12,0x44,0x12,0x24,0x22,0x24,0x62,0x14,0x22,0x84,0x02,0x04,0x01,0x00,0x00,
但是 知道一个汉字 如何找到他在字库的 地址呢???若是英语这个好说 A的ASCII码是65 ,a的是97 这个大家都知道。那么汉字也有类似ASCII码吗?这个就需要 汉字的编码知识了 至少在 VC++ 与 KEIL 中汉字使用 GB2312 方式编码的 。
在使用GB2312的程序通常采用EUC储存方法,以便兼容于ASCII。浏览器编码表上的“GB2312”,通常都是指“EUC-CN”表示法。
每个汉字及符号以两个字节来表示。第一个字节称为“高位字节”,第二个字节称为“低位字节”。
“高位字节”使用了0xA1-0xF7(把01-87区的区号加上0xA0),“低位字节”使用了0xA1-0xFE(把01-94加上0xA0)。 由于一级汉字从16区起始,汉字区的“高位字节”的范围是0xB0-0xF7,“低位字节”的范围是0xA1-0xFE,占用的码位是72*94=6768。其中有5个空位是D7FA-D7FE。
例如“啊”字在大多数程序中,会以两个字节,0xB0(第一个字节)0xA1(第二个字节)储存。(与区位码对比:0xB0=0xA0+16,0xA1=0xA0+1)。 大家都熟悉的4级报名等要用的 名字 的编码便是来源于此,不过我们这时用的是4位区位码 比如 啊 在16区 第一位 就是 1601 。
01-09区为特殊符号。
16-55区为一级汉字,按拼音排序。 //常用的
56-87区为二级汉字,按部首/笔画排序。 //罕用的
如果有人的名字 编码出现了 55区之上 比如 5921 呢这些字多半就不好念了。呵呵·····~~
好了这里介绍 GB2312 的目的 在于说明
GB2312 码并不是连续的 一个区中只有94 个字的GB2312码是连续的 。
而字库是按GB2312的顺序从0开始连续排列的,所以知道GB2312码必须转换一下才知道其所在字库的地址。
1601 啊 45217 176,161
1602 阿 45218 176,162
1603 埃 45219 176,163
.......
1694 剥 45310 176,254
1701 薄 45473 177,161
1702 雹 45474 177,162
.......
明白了吧 45217 是将 "啊" 当做一个U16 的GB2312 转换的 而 176,161 是当做两个U8 分别转换的 //U16 == unsigned short int
这样的话:
u8 zi[]={"啊你好!"};
u8 *stf=zi;
if (*str >= 0xb0) //汉字
{
hz=(*str++)<<8;
hz|=(*str++);
TFTShowHZ16(x,y,hz,color);
}
/*************************************************************
c1=(u8)hz;
c2=hz>>8;
addr=((c2-176)*94+(c1-161))*32; //计算地址