SSD1289驱动讲解--单片机编写液晶驱动代码

呼~~~~~
在这先深呼吸一口气先,学了两个星期的液晶屏,总算能把液晶屏当成一种显示来使用了。算然说不是用的很牛,但是普通的显示数码、字母、图片,还是可以滴~~~
会了这些,后面的还难吗!
讲一下本人学习的经历吧!毕竟这才是大家所关注的,因为我们可以通过别人的学习经验与自己的进行对比,学习别人更加好的经验。
和大家一样,初学液晶一般都是把配套的例程烧到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);
}
 

转自:https://blog.csdn.net/shk242673/article/details/21446539

猜你喜欢

转载自blog.csdn.net/phenixyf/article/details/81875211
今日推荐