学习液晶屏的一些体会doc资料

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

在这先深呼吸一口气先,学了两个星期的液晶屏,总算能把液晶屏当成一种显示来使用了。

算然说不是用的很牛,但是普通的显示数码、字母、图片,还是可以滴~~~
会了这些,后面的还难吗!
讲一下本人学习的经历吧!毕竟这才是大家所关注的,因为我们可以通过别人的学习经验与自己的进行对比,学习别人更加好的经验。

和大家一样,初学液晶一般都是把配套的例程烧到ST中,然后看现象,然后就是在源程序中修改一些东西,看是否能够实现。

改到后面的时候,就觉得很没趣,因为东西
是别人的,总不能随心所欲的把自己想要显示的一些东西显示在液晶屏上,多多少少会受一些限制。

于是就萌生了自己写液晶驱动代码,但是看过液晶源驱动的朋友就发现
里面都是一大堆的16进制代码,怎么看也不懂!于是就复制驱动源程序到自己的工程上!毕竟液晶屏上显示一些东西自己才有成就嘛,但是当复制好,写好自己显示字符或者
汉字的程序时,才发现一大推错误!于是一狠心就把整个源程序复制,这是它又能正常显示!呵呵呵。

其实本人觉得这是一个过程,是初学者都要经历的一个过程。

好了!废话了那么多,下面才是最关键的地方:
我们知道,商家的开发板一般都可以驱动很多种不同控制器的液晶,所以为了增强程序的移植性,他都会设置好几种芯片驱动程序(本人用的是红牛板),至少红牛是,最让人郁闷的是他的程序代码中的函数名称都是用同一种驱动芯片的名字来命名,让初学者误认为就是这一种芯片控制器,但实际上却不是,看下面一段程序:
/****************************************************************************
* 名称:void ili9320_SetCursor(u16 x,u16 y)
* 功能:设置屏幕座标
* 入口参数:x 行座标
* y 列座标
* 出口参数:无
* 说明:
* 调用方法:ili9320_SetCursor(10,10);
****************************************************************************/
__inline void ili9320_SetCursor(u16 x,u16 y)
{
if(DeviceCode==0x8989)
{
LCD_WriteReg(0x004e,y); //行
LCD_WriteReg(0x004f,0x13f-x); //列
}
else if(DeviceCode==0x9919)
{
LCD_WriteReg(0x004e,x); //行
LCD_WriteReg(0x004f,y); //列
}
else
{
LCD_WriteReg(0x20,x); //行
LCD_WriteReg(0x21,y); //列
}
}
虽然函数__inline void ili9320_SetCursor(u16 x,u16 y)是以ILI9320驱动命名的,但是里面却是可以实现好几种不同的控制器的液晶显示
所以一定要小心,用之前一定要用仿真器仿真一下,看程序往哪里跑,来确定自己液晶屏是哪一种控制器驱动的。

到这会有朋友问,液晶屏
的外表一样,驱动也一样吧?如果这样想你就错了,我就是曾经这样想,才白白浪费了我一个星期的时间,到后面才发现自己的控制芯片是另外
一种,想死的心都有了!在这就不废话那么多了!
要学液晶就要配合手册来学,一个个寄存器的去配置,其实也不难,难的是你看不懂洋文,总想找中文资料却找不到。

教大家一个方法,就是用
有道词典,不懂哪里点哪里!下面是本人写的程序,液晶控制芯片是SSD1298,尺寸:320*240:。

与大家分享一下,希望写得不好的地方,高手
点评一下,低手学习一下(包括本人):
#include"stm32f10x.h"
#include"SSD1289.h"
#include"Char8X16.h"
#include"Char12X24.h"
#include"Char20X40.h"
#include"Char24X48.h"
#include"ziku_X_.h"
#include"China32.h"
/****************************************************************************** *********************
*函数描述:函数的声明或者宏定义
*参数输入:无
*参数输出:无
*函数说明:((LCD_TypeDef *) LCD_BASE)表示将LCD_BASE看成是一个指针,然后对其强制类型转换
0x60000000指向内存的一个地址,从此地址开始赋值。

例如:LCD.LCD_REG=0x202是指
将0x202存放在0x6C000000所指向的内存中,是给LCD_REG赋值,但不是什么偏移地址。

******************************************************************************* *********************/
// LCD is connected to the FSMC_Bank1_NOR/SRAM4 and NE4 is used as ship select signal
#define LCD_BASE ((u32)(0x60000000 | 0x0C000000))
#define LCD ((LCD_TypeDef *) LCD_BASE)
/****************************************************************************** *********************
*函数描述:数据命令结构体的初始化
*参数输入:无
*参数输出:无
*函数说明:
******************************************************************************* *********************/
typedef struct
{
vu16 LCD_REG; //SSD1289写命令
vu16 LCD_RAM; //SSD1289写数据
} LCD_TypeDef;
/****************************************************************************** **********************
*函数名称:LCD_writeReg
*函数描述:写寄存器函数
*参数输入:u8 LCD_Reg:写寄存器地址
u16 LCD_RegValue:写数据
*参数输出:无
*返回值:无
*函数说明:
*函数的调用:LCD_writeReg(0x0020,256)
******************************************************************************* **********************/
void LCD_WriteReg(u8 LCD_Reg,u16 LCD_RegValue)
{
/* Write 16-bit Index, then Write Reg */
LCD->LCD_REG = LCD_Reg; //0x60000000
/* Write 16-bit Reg */
LCD->LCD_RAM = LCD_RegValue;
}
/****************************************************************************** **********************
*函数名称:LCD_ReadReg
*函数描述:读寄存器函数
*参数输入:无
*参数输出:u8 LCD_Reg:写寄存器地址
*返回值:u16 LCD_RegValue
*函数说明:写寄存器地址,读回该地址的数据
*函数的调用:Value=LCD_ReadReg()
******************************************************************************* **********************/
u16 LCD_ReadReg(u8 LCD_Reg)
{
/* Write 16-bit Index (then Read Reg) */
LCD->LCD_REG = LCD_Reg;
LCD->LCD_RAM;
/* Read 16-bit Reg */
return (LCD->LCD_RAM);
}
/****************************************************************************** **********************
*函数名称:LCD_WriteRAM_Prepare
*函数描述:开始写GGRAM信号
*参数输入:无
*参数输出:无
*返回值:无
*函数说明:
*函数的调用:LCD_WriteRAM_Prepare()
******************************************************************************* **********************/
void LCD_WriteRAM_Prepare(void)
{
LCD->LCD_REG = R34; //0x22
}
/****************************************************************************** **********************
*函数名称:LCD_WriteRAM
*函数描述:写数据到GGRAM
*参数输入:无
*参数输出:无
*返回值:无
*函数说明:- RGB_Code: the pixel color in RGB mode (5-6-5).
像素填充模式为:5-6-5模式
*函数的调用:
******************************************************************************* **********************/
void LCD_WriteRAM(u16 RGB_Code)
{
/* Write 16-bit GRAM Reg */
LCD->LCD_RAM = RGB_Code;
/****************************************************************************** **********************
*函数名称:LCD_ReadRAM
*函数描述:从GGRAM读回数据
*参数输入:无
*参数输出:无
*返回值:LCD RAM Value:即使LCD中RAM的值
*函数说明:
*函数的调用:
******************************************************************************* **********************/
u16 LCD_ReadRAM(void)
{
vu16 dummy;
/* Write 16-bit Index (then Read Reg) */
LCD->LCD_REG = R34; /* Select GRAM Reg */
/* Read 16-bit Reg */
dummy = LCD->LCD_RAM;
return LCD->LCD_RAM;
}
/****************************************************************************** **********************
*函数名称:LCD_SetCurso
*函数描述:设置光标
*参数输入:u16 Xpos:x坐标轴。

u16 Ypos:Y坐标轴。

*参数输出:
*返回值:
*函数说明:
*函数的调用:
******************************************************************************* **********************/
void LCD_SetCursor(u16 Xpos, u16 Ypos)
{
LCD_WriteReg(0x004E,Xpos ); //X坐标轴
LCD_WriteReg(0X004F,Ypos ); //Y坐标轴
}
/******************************************************************************
**********************
*函数名称:Delay
*函数描述:延时函数
*参数输入:u32 nCount:时间值
*参数输出:
*返回值:
*函数说明:
*函数的调用:
******************************************************************************* **********************/
void Delay(u32 nCount)
{
u32 TimingDelay;
while(nCount--)
{
for(TimingDelay=0;TimingDelay<10000;TimingDelay++);
}
}
/****************************************************************************** **********************
*函数名称:void SSD1289_SetCursor
*函数描述:设置屏幕座标
*参数输入:u16 x:行座标
* u16 y 列座标
*参数输出:无
*返回值:
*函数说明:
*函数的调用:SSD1289_SetCursor(0,0)
******************************************************************************* **********************/
void SSD1289_SetCursor(u16 x,u16 y)
{
LCD_WriteReg(0x004e,y); //行
LCD_WriteReg(0x004f,0x13f-x); //列
}
/****************************************************************************** **********************
*函数名称:SSD1289_SetWindows
*函数描述:设置窗口的区域
*参数输入:u16 StartX:起始行坐标
* u16 StartY:起始列坐标
* u16 Height:窗口高
* u16 Width :窗口宽
* u16 Color : 窗口的区域的颜色值
*参数输出:无
*返回值:
*函数说明:
*函数的调用:SSD1289_SetWindows(0,0,119,159,Blue);
******************************************************************************* **********************/
void SSD1289_SetWindows(u16 StartX,u16 StartY,u16 Height,u16 Width,u16 Color)
{
u16 i;
LCD_WriteReg(0x44,StartX|(StartX+Width-1)<<8); //设置水平方向GRAM起始地址(低字节为起始地址,高字节为结束地址)
LCD_WriteReg(0x45,StartY); //设置窗口的Y方向的开始位置
LCD_WriteReg(0x46,StartY+Height-1); //设置窗口的Y方向的结束位置
SSD1289_SetCursor(StartX,StartY);
LCD_WriteRAM_Prepare(); //开始写GGRAM信号
for (i=0;i<(Height*Width);i++) //对区域进行颜色打点
{
LCD_WriteRAM(Color);
}
}
/****************************************************************************** **********************
*函数名称:SSD1289_Clear
*函数描述:将指定大小屏幕填充指定成的颜色,如清屏,则填0xffff
*参数输入:u16 Color:填充颜色值
*参数输出:无
*返回值:
*函数说明:
*函数的调用:SSD1289_Clear(0,0,319,239,0xffff)
******************************************************************************* **********************/
void SSD1289_Clear(u16 Color)
{
u32 index=0;
LCD_SetCursor(0,0); //以原点为起始坐标对320*240像素屏幕清LCD_WriteRAM_Prepare(); //开始写GGRAM信号
for(index=0;index<76800;index++) //320*240=76800清屏像素
{
LCD->LCD_RAM=Color;
}
}
/****************************************************************************** **********************
*函数名称:SSD1289_SetPoint
*函数描述:指定坐标画点函数
*参数输入:u16 x:X坐标轴
* u16 x:X坐标轴
* u16 Color:点颜色
*参数输出:无
*返回值:无
*函数说明:
*函数的调用:SSD1289_SetPoint(10,10,Red)
******************************************************************************* **********************/
void SSD1289_SetPoint(u16 x,u16 y,u16 Color)
{
if ( (x>320)||(y>240) ) return; //判断写的坐标值是否超出范围
SSD1289_SetCursor(x,y);
LCD_WriteRAM_Prepare();
LCD_WriteRAM(Color);
}
/****************************************************************************** **********************
*函数名称:SSD1289_DrawPicture
*函数描述:在指定座标范围显示一副图片
*参数输入:StartX 行起始座标
* StartY 列起始座标
* u16 Height:窗口高
* u16 Width:窗口宽
* pic 图片头指针
*参数输出:无
*返回值:无
*函数说明:
*函数的调用:SSD1289_DrawPicture(0,0,140,140,gImage_tupian);
******************************************************************************* **********************/
void SSD1289_DrawPicture(u16 StartX,u16 StartY,u16 Height,u16 Width,u8 *pic)
{
u32 i;
u16 *bitmap = (u16 *)pic;
LCD_WriteReg(0x44,StartX|(StartX+Width-1)<<8); //设置水平方向GRAM起始地址(低字节为起始地址,高字节为结束地址)
LCD_WriteReg(0x45,StartY); //设置窗口的Y方向的开始位置
LCD_WriteReg(0x46,StartY+Height-1); //设置窗口的Y方向的结束位置
LCD_SetCursor(StartX,StartY ); //设置光标
LCD_WriteRAM_Prepare(); //开始写GGRAM信号
for (i=0;i<(Height*Width);i++) //读取图片信息{
LCD_WriteRAM(*bitmap++);
}
LCD_WriteReg(0x44,0|239<<8); //设置窗口的X方向开始位置和结束位置
LCD_WriteReg(0x45,0);
//设置窗口的Y方向的开始位置
LCD_WriteReg(0x46,319);
//设置窗口的Y方向的结束位置
}
/****************************************************************************** **********************
*函数名称:SSD1289_PutChar8X16
*函数描述:在指定座标范围显示一个8X16 ASCLL字符
*参数输入:u16 X :横座标
* u16 Y :纵座标
* u8 c :字符
* u16 charColor:字符颜色
* u16 bkColor :字符背景颜色
*参数输出:无
*返回值:无
*函数说明:高:16位像素点。

宽:8位像素点
*函数的调用:void SSD1289_PutChar8X16(0,0,52,Red,Black)
******************************************************************************* **********************/
void SSD1289_PutChar8X16(u16 x,u16 y,u8 c,u16 charColor,u16 bkColor)
{
u16 i=0,j=0,k=0,map=0;
u8 tmp_char=0;
for(i=0;i<16;i++) //可理解为字符高
{
map=0;
for(k=0;k<1;k++) //行的字节数,例如:像素8X16,即横8个点(一个字节),竖直16个点
{
tmp_char=nAsciiDot_8X16[c-0x20][i*1+k]; //0x20为ASCLL的内码,读取ASCLL码的字符模值
for(j=0;j<8;j++) //对读回的16进制值进行打点
{
if((tmp_char>>j) & 0x01==0x01) //如果读回的值为高电平则打charColor点
{
LCD_SetCursor((x+j+map),(y+i));
LCD_WriteRAM_Prepare();
LCD_WriteRAM(charColor);
}
else
//否则打charColor点
{
LCD_SetCursor((x+j+map),(y+i));
LCD_WriteRAM_Prepare();
LCD_WriteRAM(bkColor);
}
}
}
}
}
/****************************************************************************** **********************
*函数名称:SSD1289_PutChar12X24
*函数描述:在指定座标范围显示一个12X24 ASCLL字符
*参数输入:u16 X :横座标
* u16 Y :纵座标
* u8 c :字符
* u16 charColor:字符颜色
* u16 bkColor :字符背景颜色
*参数输出:无
*返回值:无
*函数说明:高:24位像素点。

宽:16位像素点
*函数的调用:void SSD1289_PutChar12X24(0,0,52,Red,Black)
******************************************************************************* **********************/
void SSD1289_PutChar12X24(u16 x,u16 y,u8 c,u16 charColor,u16 bkColor)
{
u16 i=0,j=0,k=0,map=0;
u8 tmp_char=0;
for(i=0;i<24;i++) //可理解为字符高
{
map=0; //行位地址偏移量
for(k=0;k<2;k++) //行的字节数,例如:像素8X16,即横8个点(一个字节),竖直16个点
{
tmp_char=nAsciiDot_12X24[c-0x20][i*2+k]; //C-0x20为ASCLL的内码字符偏移量,i*2+k可以理解为数组行个数
for(j=0;j<8;j++) //对读回的16进制值进行打点
{
if((tmp_char>>j) & 0x01==0x01) //如果读回的值为高电平则打charColor点
{
LCD_SetCursor((x+j+map),(y+i));
LCD_WriteRAM_Prepare();
LCD_WriteRAM(charColor);
}
else
//否则打charColor点
{
LCD_SetCursor((x+j+map),(y+i));
LCD_WriteRAM_Prepare();
LCD_WriteRAM(bkColor);
}
}
map+=8; //每循环一次偏移8位
}
}
}
/****************************************************************************** **********************
*函数名称:SSD1289_PutChar20X40
*函数描述:在指定座标范围显示一个20X40 ASCLL字符
*参数输入:u16 X :横座标
* u16 Y :纵座标
* u8 c :字符
* u16 charColor:字符颜色
* u16 bkColor :字符背景颜色
*参数输出:无
*返回值:无
*函数说明:高:40位像素点。

宽:24位像素点
*函数的调用:void SSD1289_PutChar20X40(0,0,52,Red,Black)
******************************************************************************* **********************/
void SSD1289_PutChar20X40(u16 x,u16 y,u8 c,u16 charColor,u16 bkColor)
{
u16 i=0,j=0,k=0,map=0;
u8 tmp_char=0;
for(i=0;i<40;i++) //可理解为字符高
{
map=0; //行位地址偏移量
for(k=0;k<3;k++) //行的字节数,例如:像素8X16,即横8个点(一个字节),竖直16个点
{
tmp_char=nAsciiDot_20X40[c-0x20][i*3+k]; //C-0x20为ASCLL的内码字符偏移量,i*2+k可以理解为数组行个数
for(j=0;j<8;j++) //对读回的16进制值进行打点
{
if((tmp_char>>j) & 0x01==0x01) //如果读回的值为高电平则打charColor点
{
LCD_SetCursor((x+j+map),(y+i));
LCD_WriteRAM_Prepare();
LCD_WriteRAM(charColor);
}
else
//否则打charColor点
{
LCD_SetCursor((x+j+map),(y+i));
LCD_WriteRAM_Prepare();
LCD_WriteRAM(bkColor);
}
}
map+=8; //每循环一次偏移8位
}
}
/****************************************************************************** **********************
*函数名称:SSD1289_PutChar24X48
*函数描述:在指定座标范围显示一个20X40 ASCLL字符
*参数输入:u16 X :横座标(0<X<240)
* u16 Y :纵座标(0<Y<320)
* u8 c :字符
* u16 charColor:字符颜色
* u16 bkColor :字符背景颜色
*参数输出:无
*返回值:无
*函数说明:高:48位像素点。

宽:24位像素点
*函数的调用:void SSD1289_PutChar24X48(0,0,52,Red,Black)
******************************************************************************* **********************/
void SSD1289_PutChar24X48(u16 x,u16 y,u8 c,u16 charColor,u16 bkColor)
{
u16 i=0,j=0,k=0,map=0;
u8 tmp_char=0;
for(i=0;i<48;i++) //可理解为字符高
{
map=0; //行位地址偏移量
for(k=0;k<3;k++) //行的字节数,例如:像素8X16,即横8个点(一个字节),竖直16个点
{
tmp_char=nAsciiDot_24X48[c-0x20][i*3+k]; //C-0x20为ASCLL的内码字符偏移量,i*2+k可以理解为数组行个数
for(j=0;j<8;j++) //对读回的16进制值进行打点
{
if((tmp_char>>j) & 0x01==0x01) //如果读回的值为高电平则打charColor点
{
LCD_SetCursor((x+j+map),(y+i));
LCD_WriteRAM_Prepare();
LCD_WriteRAM(charColor);
}
else
//否则打charColor点
LCD_SetCursor((x+j+map),(y+i));
LCD_WriteRAM_Prepare();
LCD_WriteRAM(bkColor);
}
}
map+=8; //每循环一次偏移8位
}
}
}
/****************************************************************************** **********************
*函数名称:SSD1289_Hanzi32X32
*函数描述:在指定座标范围显示一个32X32 汉字
*参数输入:u16 X :横座标
* u16 Y :纵座标
* u8 c :字符
* u16 charColor:字符颜色
* u16 bkColor :字符背景颜色
*参数输出:无
*返回值:无
*函数说明:高:32位像素点。

宽:32位像素点
*函数的调用:void SSD1289_Hanzi32X32(0,0,52,Red,Black)
******************************************************************************* **********************/
void SSD1289_Hanzi32X32(u16 x,u16 y,u8 c,u16 charColor,u16 bkColor)
{
u16 i=0,j=0,k=0,map=0;
u8 tmp_char=0;
for(i=0;i<32;i++) //可理解为字符高
{
map=0; //行位地址偏移量
for(k=0;k<4;k++) //行的字节数,例如:像素8X16,即横8个点(一个字节),竖直16个点
{
tmp_char=HZ_32X32[c][i*4+k]; //C-0x20为ASCLL的内码字符偏移量,i*2+k可以理解为数组行个数
for(j=0;j<8;j++) //对读回的16进制值进行打点
{
if((tmp_char>>j) & 0x01==0x01) //如果读回的值为高电平则打charColor点
{
LCD_SetCursor((x+j+map),(y+i));
LCD_WriteRAM_Prepare();
LCD_WriteRAM(charColor);
}
else
//否则打charColor点
{
LCD_SetCursor((x+j+map),(y+i));
LCD_WriteRAM_Prepare();
LCD_WriteRAM(bkColor);
}
}
map+=8; //每循环一次偏移8位
}
}
}
/****************************************************************************** **********************
*函数名称:SSD1289_Hanzi48X48
*函数描述:在指定座标范围显示一个32X32 汉字
*参数输入:u16 X :横座标
* u16 Y :纵座标
* u8 c :字符
* u16 charColor:字符颜色
* u16 bkColor :字符背景颜色
*参数输出:无
*返回值:无
*函数说明:高:40位像素点。

宽:40位像素点
*函数的调用:void SSD1289_Hanzi48X48(0,0,52,Red,Black)
******************************************************************************* **********************/
void SSD1289_Hanzi48X48(u16 x,u16 y,u8 c,u16 charColor,u16 bkColor)
{
u16 i=0,j=0,k=0,map=0;
u8 tmp_char=0;
for(i=0;i<48;i++) //可理解为字符高
{
map=0; //行位地址偏移量
for(k=0;k<6;k++) //行的字节数,例如:像素8X16,即横8个点(一个字节),竖直16个点
{
tmp_char=HZ_48X48[c][i*6+k]; //C-0x20为ASCLL的内码字符偏移量,i*2+k可以理解为数组行个数
for(j=0;j<8;j++) //对读回的16进制值进行打点
{
if((tmp_char>>j) & 0x01==0x01) //如果读回的值为高电平则打charColor点
{
LCD_SetCursor((x+j+map),(y+i));
LCD_WriteRAM_Prepare();
LCD_WriteRAM(charColor);
}
else
//否则打charColor点
{
LCD_SetCursor((x+j+map),(y+i));
LCD_WriteRAM_Prepare();
LCD_WriteRAM(bkColor);
}
}
map+=8; //每循环一次偏移8位
}
}
}
/****************************************************************************** **********************
*函数名称:SSD1289_DisplayStringLine
*函数描述:在制定行显示字符串
*参数输入:u8 Line: 行
* u8 *ptr:输入的字符串指针
* u16 charColor:字符串颜色
* u16 bkColor :字符串背景颜色
* u16 size :字符尺寸
*参数输出:无
*返回值:无
*函数说明:
*函数的调用:SSD1289_DisplayStringLine(200, " kljkkjfg ", Red, White,8*16);
******************************************************************************* **********************/
void SSD1289_DisplayStringLine(u8 Line, u8 *ptr, u16 charColor, u16 bkColor,u16 size)
{
u32 i = 0;
u16 refcolumn = 0;
if(size==8*16)
{
while ((*ptr != 0) & (i < 30)) //一行能显示的字符数
{
SSD1289_PutChar8X16(refcolumn, Line, *ptr, charColor, bkColor);
refcolumn += 8; //行地址偏移量(即字符宽度为8个点)
ptr++;
i++;
}
}
if(size==12*24)
{
while ((*ptr != 0) & (i < 15)) //一行能显示的字符数
{
SSD1289_PutChar12X24(refcolumn, Line, *ptr, charColor, bkColor);
refcolumn += 16; //行地址偏移量(即字符宽度为16个点)
ptr++;
i++;
}
}
if(size==20*40)
{
while ((*ptr != 0) & (i < 10)) //一行能显示的字符数
{
SSD1289_PutChar20X40(refcolumn, Line, *ptr, charColor, bkColor);
refcolumn += 24; //行地址偏移量(即字符宽度为24个点)
ptr++;
i++;
}
}
if(size==24*48)
{
while ((*ptr != 0) & (i < 10)) //一行能显示的字符数
{
SSD1289_PutChar24X48(refcolumn, Line, *ptr, charColor, bkColor);
refcolumn += 24; //行地址偏移量(即字符宽度为16
个点)
ptr++;
i++;
}
}
}
void SSD1289_China32X32(u16 x,u16 y,const unsigned char *string,u16 charColor,u16 bkColor) {
u16 i=0,j=0,k=0,map=0;
u8 tmp_char=0;
for(i=0;i<32;i++) //可理解为字符高
{
map=0; //行位地址偏移量
for(k=0;k<4;k++) //行的字节数,例如:像素8X16,即横8个点(一个字节),竖直16个点
{
tmp_char=string[i*4+k]; //C-0x20为ASCLL的内码字符偏移量,i*2+k可以理解为数组行个数
for(j=0;j<8;j++) //对读回的16进制值进行打点
{
if((tmp_char>>j) & 0x01==0x01) //如果读回的值为高电平则打charColor点
{
LCD_SetCursor((x+j+map),(y+i));
LCD_WriteRAM_Prepare();
LCD_WriteRAM(charColor);
}
else
//否则打charColor点
{
LCD_SetCursor((x+j+map),(y+i));
LCD_WriteRAM_Prepare();
LCD_WriteRAM(bkColor);
}
}
map+=8; //每循环一次偏移8位
}
}
}
/****************************************************************************** **********************
*函数名称:SSD1289_DisplayChinaLine
*函数描述:在制定行显示汉字串
*参数输入:u8 Line: 行控制
* u8 x : 水平偏移量
* u8 *ptr:输入的汉字串指针
* u16 charColor:字符串颜色
* u16 bkColor :字符串背景颜色
*参数输出:无
*返回值:无
*函数说明:
*函数的调用:SSD1289_DisplayChinaLine(0,10 " 我爱你", Red, White,32*32);
******************************************************************************* **********************/
void SSD1289_DisplayChinaLine(u8 x,u8 Line, u8 *ptr, u16 charColor, u16 bkColor)
{
u8 ch1,ch2;
u16 length;
u16 i=0,j=0;
ch1=ch1;
ch2=ch2;
i=i;
for(length=0;ptr[length]!=0;length++); //测量汉字的长度
do
{
ch1=ptr[j];
ch2=ptr[j+1];
if(ch1>0x80) // 汉字内码索引,当ch1大于128时为汉字,小于128为ASCLL码
{
for(i=0;i<sizeof(GBHZ_32)/sizeof(GBHZ_32[0]);i++) //检索汉字的个数
{
if(ch1==GBHZ_32[i].Index[0] && ch2==GBHZ_32[i].Index[1]) //输入的汉字与汉字库中的字进行校对
break;
//如果能在字库中找到,则跳出,否则继续检索
}
SSD1289_China32X32(x,Line,GBHZ_32[i].Msk, charColor, bkColor); //显示汉字
x+= 32; //每两个汉字之间的水平偏移量
j += 2; //汉字内码检索偏移量
}
if(ch1<0x80)
{
SSD1289_PutChar12X24(x,Line,ch1,charColor, bkColor);
x+=16;
j++;
}
}
while(j<length);
}。

相关文档
最新文档