本帖最后由 飞宇 于 2016-9-14 17:37 编辑
1. 字库和显示坐标
LCD12864液晶模块内置 8192个中文汉字(16X16 点阵)、128个字符(8X16点阵):
1) 每行可显示的汉字数量:128/16 = 8个。
2) 每行可显示的字符数量:128/8 = 16个。
3) 可显示的汉字行数:64/16 = 4行。
4) 可显示的字符64/16 = 4行。
显示字符也可以通过图形的方式来显示,在后面的章节会详细说明,本节说明的是使用字库的方式来显示字符。
使用字库的方式来显示字符需要使用基本指令集,流程是先写入显示地址指定字符在LCD上显示的起始位置,之后写入字符编码,LCD会根据字符编码从字库中查找对应的字模并显示到屏幕上。
显示坐标
显示坐标(地址)确定了显示的起始位置,下表中列出了可写入的所有的起始地址,共32个,对应LCD的4行8列。注意这和绘图时写入的地址是不一样的,绘图时,地址是根据“点”来确定的,字库显示时是将16×16点阵作为一个单元来处理的。
为了更好的理解LCD字符显示,我们准备了2个字符显示函数:单个字符显示和字符串显示,字符串显示也可以显示汉字。
单个字符显示
每次写入一个字符。注意,虽然写入的是一个字符,但是每次操作的仍然是一个16×16点阵的区域。
程序清单:
- /************************************************************************
- * 描 述 : 指定位置显示单个字符
- * 参 数 : row[in]:行,范围1~4
- * :column[in]:列,范围0~7
- * :chr[in]:字符编码
- * 返回值 : 无
- ************************************************************************/
- void LCD_ShowChar(uchar row,uchar column,uchar chr)
- {
- uchar Address;
-
- //row判断第几行,column判断第几列,0x80为液晶行初始地址
- if(row == 1)Address=0x80+column;
- if(row == 2){Address=0x90+column;}
- if(row == 3){Address=0x88+column;}
- if(row == 4){Address=0x98+column;}
- Write_Cmd(Address); //写入地址命令到LCD12864
- Write_Data(chr); //写入显示数据到LCD12864
- }
复制代码
因为操作是的16×16点阵区域,而我们写入的英文字符是8×16的,所以字符间会有8×16个点的空隙。
字符串显示:
在一个写流程里面连续写入n个字符。显示汉字时注意一个汉字等于2个字符。
程序清单:
- /************************************************************************
- * 描 述 : 字符串显示
- * 参 数 : row[in]:行,范围1~4
- * :column[in]:列,范围0~7
- * :num[in]:字符个数,注意一个汉字=2个字符
- * :s[in]:指向待显示的字符串
- * 返回值 : 无
- ************************************************************************/
- void LCD_ShowString(uchar row,uchar column,uchar num,uchar *s)
- {
- uchar Address;
-
- //row判断第几行,column判断第几列,0x80为液晶行初始地址
- if(row == 1)Address=0x80+column;
- if(row == 2){Address=0x90+column;}
- if(row == 3){Address=0x88+column;}
- if(row == 4){Address=0x98+column;}
- Write_Cmd(Address); //写入显示起始地址
- while(num) //写入显示数据的大小
- {
- Write_Data(*(s++)); //写入显示数据到LCD12864
- num--;
- }
- }
复制代码 显示字符时,“LCD12864”共8个字符,所以长度为8,显示汉字时,“液晶模块”4个汉字,一个汉字等于2个字符,所以长度也是8。
|