您的位置:首页 > 其它

SSD1289驱动讲解

2014-03-18 10:44 567 查看
呼~~~~~

在这先深呼吸一口气先,学了两个星期的液晶屏,总算能把液晶屏当成一种显示来使用了。算然说不是用的很牛,但是普通的显示数码、字母、图片,还是可以滴~~~

会了这些,后面的还难吗!

讲一下本人学习的经历吧!毕竟这才是大家所关注的,因为我们可以通过别人的学习经验与自己的进行对比,学习别人更加好的经验。

和大家一样,初学液晶一般都是把配套的例程烧到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);

}

本人坚信:“有分享,才会有进步。”代码可能写得不好,难登大雅之堂,但是也是本人的一份汗水~~~~

忘志同道合者拍砖~~~~~~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: