像素: 图像的最小组成单位。
一个彩色像素的信息可以用1个多位二进制数来表示和储存。用来表示彩色像素的二进制数的位数我们称为颜色深度或颜色质量。采用1个16位二进制数来表达一个彩色点,黑白是1bit对于LCD一个像素,彩色是多bit对应一个像素,数组中一个字符占了横8竖16。
   Ascii的最末一个为0x7f,因此经常有x<0x80的判断语句。

红: 0xf800 黄: 0xffe0 绿: 0x07e0 青: 0x07ff 蓝: 0x001f
紫: 0xf81f 黑: 0x0000 白: 0xffff 灰: 0x7bef

函数名:Write_Data_U16 功能:写16位数据 函数原型:void Write_Data_U16(unsigned int y); 入口参数:unsigned int y 要写的16位数据 出口参数:无 说明:这个16位数据分成两个8位数据分两次写入 示例代码: Write_Data_U16(Color);//写 16 位颜色数据

函数名:Write_Cmd_Data 功能:写命令、写数据 函数原型:void Write_Cmd_Data(unsigned char x,unsigned int y); 入口参数:unsigned char x 要写的8位命令 unsigned int y 出口参数:无 说明:先写8位命令,后写16位数据 示例代码: Write_Cmd_Data(WINDOW_XADDR_START,x0);//写 X 坐标的起始位置 要写的 16 位数据

函数名:ILI9325_Initial 功能:液晶初始化函数 函数原型:void ILI9325_Initial(void); 入口参数:无 出口参数:无 说明:厂家提供的液晶初始化代码 示例代码: ILI9325_Initial();//初始化 LCD

函数名:LCD_SetPos 功能:定义显示窗体 函数原型:static void LCD_SetPos (unsigned int x0, unsigned int x1, unsigned int y0, unsigned int y1); 入口参数:x0:窗体中X坐标中较小者 x1:窗体中X坐标中较大者 y0:窗体中Y坐标中较小者 y1:窗体中Y坐标中较大者 出口参数:无 说明:设置显示区域的大小 示例代码: LCD_SetPos(0,240,0,320);//设置显示区域为 320x240

函数名:CLR_Screen 功能:清屏 函数原型:void CLR_Screen(unsigned int bColor); 入口参数:bColor 清除屏幕的的颜色 出口参数:无 说明:使用背景色清除屏上所有内容 示例代码: CLR_Screen(0xf800);//清屏红色 CLR_Screen(0xffe0);//清屏黄色 CLR_Screen(BLUE);//清屏蓝色

函数名:Put_pixel 功能:在屏幕上画点 函数原型:void Put_pixel(uchar x,uchar y,unsigned int color); 入口参数:x,y 需要画点的坐标,color为点的颜色 出口参数:无 说明:在屏幕上指定的坐标画指定颜色的点 示例代码: Put_pixel(200,200,RED);//在坐标点(200,200)画一红色点

函数名:Line 功能:在屏幕上画线 函数原型:void Line(uchar X0, uchar Y0, uchar X1, uchar Y1, unsigned int color); 入口参数:起点坐标(X0,Y0),终点坐标(X1,Y1),color为线的颜色 出口参数:无 说明:用指定颜色在屏幕指定坐标画出线 示例代码: Line(0,0,200,200,BLUE);//从点(0,0)到点(200,200)画一条蓝色的线

函数名:Rectangle 功能:绘制一个矩形框 函数原型:void Rectangle (uchar left, uchar top, uchar right, uchar bottom, unsigned int color); 入口参数:矩形的起始位置left,top 矩形的结束位置right,bottom 矩形框的颜色color 出口参数:无 说明:用指定颜色在屏幕指定坐标绘制一个矩形框 示例代码: Rectangle(10,10,118,150,0x0000);//画一黑色矩形框

函数名:Bar 功能:绘制一个填充的平面矩形 函数原型:void Bar (uchar left, uchar top, uchar right, uchar bottom, unsigned int color); 入口参数:矩形的起始位置left,top 矩形的结束位置right,bottom 矩形填充颜色color 出口参数:无 说明:用指定颜色在屏幕指定坐标绘制一个填充的平面矩形 示例代码: Bar(0,0,120,160,0x0000);//画一黑色矩形框

函数名:Show_RGB 功能:绘制一个填充的平面矩形 函数原型:void Show_RGB (unsigned int x0, unsigned int x1, unsigned int y0, unsigned int y1, unsigned int Color); 入口参数:x0,y0 起始坐标 x1,y1 结束坐标 Color 背景颜色 出口参数:无 说明: 用指定颜色在屏幕指定坐标绘制一个填充的平面矩形(速度比Bar函数快) 示例代码: Show_RGB (0,120,0,160,0x0000);//画一黑色矩形框

函数名:show_colour_bar 功能:在整个屏幕上绘制横彩条 函数原型:void show_colour_bar(void); 入口参数:无 出口参数:无 说明:横彩条从上到下的颜色顺序为红、绿、蓝、黄、紫、青、白、黑 示例代码: show_colour_bar();//显示彩条

函数名:LCD_PutChar8x16 功能:显示数字及英文字符 函数原型:void LCD_PutChar8x16 (unsigned short x, unsigned short y, char c, unsigned int fColor, unsigned int bColor); 入口参数:x 横坐标,y 纵坐标 c 需要显示的字符 fColor 字符颜色 bColor 字符背景颜色 出口参数:无 说明:需包含"8X16.h ",显示数字、大小写英文字符和一些符号等 示例代码: LCD_PutChar8x16(0,0, \'Z\',RED,BLUE);//显示英文字符 Z
!!!!这其中涉及的char m=Font8x16[c*16+i]的问题!!!
unsigned char Font8x16[] = {
s _ _ _ _ _ _ _ _ , //0000 0000
s _ _ _ _ _ _ _ _ ,
s _ X X X X X _ _ , // 0111 1100
s _ X _ _ _ _ X _ , // 0100 0010,
s _ X _ _ _ _ X _ , //每一行依次类推
s _ X _ _ _ _ X _ ,
s _ X _ _ _ _ X _ ,
s _ X X X X X _ _ ,
s _ X _ X _ _ _ _ ,
s _ X _ _ X _ _ _ ,
s _ X _ _ _ X _ _ ,
s _ X _ _ _ _ X _ ,
s _ _ _ _ _ _ _ _ ,
s _ _ _ _ _ _ _ _ ,
s _ _ _ _ _ _ _ _ ,
s _ _ _ _ _ _ _ _ , };
for(i=0; i<16;i++) {
unsigned char m=Font8x16[c*16+i];
for(j=0;j<8;j++) {
if((m&0x80)==0x80) {
write_data_u16(fColor); }
else { write_data_u16(bColor); }
m<<=1;
} }
}
Font8x16[]是与ASSIC码表对应的一张表,连续16个8位二进制值可成一个字符(8*16),把一个8位二进制值依次循环和0x80(1000 0000)相与(与1000 0000与则只看最高为是0还是1,其他为和0相与都为0,相当于提取了最高位进行判断是0还是1),为1则表示此个小点应有填充,即输出字体颜色,为0则输出背景。如上所示,m=66=0x0100 0010, 最高位与0x80相与,输出后将其向左移动1位,继续相与,直到8位输出完,再进行下一行扫描。


函数名:PutGB1616 功能:显示16*16汉字 函数原型:void PutGB1616 (unsigned short x, unsigned short y, unsigned char c[2], unsigned int fColor, unsigned int bColor); 入口参数:x 横坐标,y 纵坐标 c 需要显示的汉字码 fColor 汉字颜色 bColor 汉字背景颜色 出口参数:无 说明:需包含" GB1616.h ",具体汉字是如何取模的,阅读16*16汉字取模说明 示例代码: PutGB1616(0,0, "华",RED,BLUE);//显示汉字“华”

函数名:LCD_PutString 功能:显示字符串 函数原型:void LCD_PutString (unsigned short x, unsigned short y, unsigned char *s, unsigned int fColor, unsigned int bColor); 入口参数:x 横坐标,y 纵坐标 *s 需要显示的字符串 fColor 字符颜色 bColor 字符背景颜色 出口参数:无 说明:中英文字符、数字和符号可以同时显示 示例代码: LCD_PutString(10,80,"电子科技",0x0000,0xf800);//显示字符串

函数名:LCDShow_uCharNumber 功能:向LCD发送一个0--65535的数值 函数原型:void LCDShow_uCharNumber (uchar x, uchar y, unsigned int uCharNumber, unsigned int forecolor, unsigned int bkcolor); 入口参数:x 横坐标,y 纵坐标 uCharNumber 需要显示的一串数字 forecolor 字符颜色 bkcolor 字符背景颜色 出口参数:无 说明:显示一串数字,数值范围从0--65535 示例代码: LCDShow_uCharNumber(10,30,9999,0x0000,0xffff);//显示一串数字

函数名:PutGB3232 功能:显示32*32汉字 函数原型:void PutGB3232 (unsigned short x, unsigned short y, unsigned char c[2], unsigned int fColor, unsigned int bColor); 入口参数:x 横坐标,y 纵坐标 c 需要显示的汉字码 fColor 汉字颜色 bColor 汉字背景颜色 出口参数:无 说明:需包含" GB3232.h ",具体汉字是如何取模的,阅读32*32汉字取模说明 示例代码: PutGB3232(0,200,"我",WHITE,BLUE);//显示 32*32 汉字

函数名:Show_Color_Bar 功能:在整个屏幕上显示渐变色横彩条 函数原型:void Show_Color_Bar(void); 入口参数:无 出口参数:无 说明:在整个屏幕上逐行扫描出渐变颜色横彩条 示例代码: Show_Color_Bar();//显示渐变彩条


16*16汉字取模方式: 16*16字模由软件取模得到,具体操作如下点击“参数设置”中的“其它选项” ,设置如下图然后输入文字,按“Ctrl+Enter 组合键”结束文字输入点击“取模方式”选择“C51 格式” ,此时会在“点阵生成区”输出取模数据把生成的代码复制,粘贴到 GB1616.h 中,按已有的格式进行修改修改好 GB1616.h 文件后,还要修改 PutGB1616 函数中的“自建汉字的个数”至此,就可以在程序中*的调用字库中已有汉字用于显示


32*32汉字取模方式:
32*32字模由软件取模得到,具体操作如下,打开软件点击“模式”选择“字符模式”,设置字宽为 32*32点击“选项” ,具体设置如下,然后在软件中间的空白处输入汉字,点击“生成字模” ,此时字模代码产生把生成的代码复制,粘贴到 GB3232.h 中,按已有的格式进行修改,修改好 GB3232.h 文件后,还要修改 PutGB3232 函数中的“自建汉字的个数”。至此,就可以在程序中*的调用字库中已有汉字用于显示


问1:如果想在LCD上显示字母\'A\',怎么显示?
答:比如LCD分辨率为320*270,这个字母‘A’用8个像素*8个像素的矩阵来显示。所谓显示就‘A’边界的像素值为黑色,其它地方为其它颜色,这样用户就行看到了。

问2:那怎么知道哪些地方要显示成黑色,哪些地方显示为白色呢?
答:这个由‘A’字母的字模来决定,字模里面包含了字母‘A’的像素值。

问3:字模是什么东西,怎么得到?
答:字模从linux内核中可以找到,程序中是在font_8x8.c文件中,其实就是在一个数组里面设置好了各个字符的像素值,每个字符用8个字节来存储,8*8=64位像素。我们要显示时就是在这里面找到对应字符的像素值。
 ‘A’的ASCII是0x41=65,所以对应的是这个数组是的65个元素fontdata_8x8[65]; 根据这8个字节的值在纸上描一下,就可以看到字母A了,1为画黑点。
例1:程序对应:24th_lcd_putchar
功能:在串口上输出字母A,同时在LCD上显示字母A。
输出字母的功能主要在framebuffer.c中的lcd_putc()方法中。

 


单片机显示程序:复制后用notepad++打开方便查看,keil更佳

#include"reg52.h"

#define WINDOW_XADDR_START 0x0050 // Horizontal Start Address Set
#define WINDOW_XADDR_END 0x0051 // Horizontal End Addr•ess Set
#define WINDOW_YADDR_START 0x0052 // Vertical Start Address Set
#define WINDOW_YADDR_END 0x0053 // Vertical End Address Set
#define GRAM_XADDR      0x0020 // GRAM Horizontal Address Set
#define GRAM_YADDR      0x0021 // GRAM Vertical Address Set
#define GRAMWR        0x0022 // memory write

/* LCD color */
#define White          0xFFFF
#define Black          0x0000
#define Blue           0x001F
#define Blue2          0x051F
#define Red            0xF800
#define Magenta        0xF81F
#define Green          0x07E0
#define Cyan           0x7FFF
#define Yellow         0xFFE0

sbit CS=P2^7;  //片选                     
sbit RES=P2^5;  //复位
sbit RS=P2^4;  //数据/命令选择
sbit RW=P2^3;
                 //注意!!!数据口使用P1                  

void main (void);
void ILI9325_Initial(void);
void show_colour_bar (void);//显示横幅彩条,无意义
void Init_data(unsigned char x, unsigned int y);
void Write_Cmd(unsigned char DH,unsigned char DL);
void Write_Data(unsigned char DH,unsigned char DL);
void delayms(unsigned int tt);
void show_photo(void);//显示图片
void Show_RGB (unsigned int x0,unsigned int x1,unsigned int y0,unsigned int y1,unsigned int Color);
unsigned char code pic[];
void  Write_Data_U16(unsigned int y);
static void LCD_SetPos(unsigned int x0,unsigned int x1,unsigned int y0,unsigned int y1);
void ClearScreen(unsigned int bColor);
void LCD_PutChar8x16(unsigned short x, unsigned short y, char c, unsigned int fColor, unsigned int bColor);
void LCD_PutChar8x8(unsigned short x, unsigned short y, char c, unsigned int fColor, unsigned int bColor);
void LCD_PutChar(unsigned short x, unsigned short y, char c, unsigned int fColor, unsigned int bColor);
void LCD_PutString(unsigned short x, unsigned short y, char *s, unsigned int fColor, unsigned int bColor);//*s指向的是s[]字符串
void PutGB1616(unsigned short x, unsigned short  y, unsigned char c[2], unsigned int fColor,unsigned int bColor);//汉字
void PutGB3232(unsigned short x, unsigned short  y, unsigned char c[2], unsigned int fColor,unsigned int bColor);//汉字
//================================================//

void  main(void)
{  
 CS=1;
 delayms(25);
 RES=0;
 delayms(150);
 RES=1;
 delayms(25);
 ILI9325_Initial();//厂家提供LCD初始源代码
 while(1)
 {
   ClearScreen(0x0);
//show_colour_bar(); //显示横幅彩条,无意义

LCD_PutString(2,40,"hello,this is Sugon ",Red,Blue);   ///前景颜色和背景颜色,可以直接//定义,也可以直接填入16进制数字
LCD_PutString(20,160,"abcdefghijklmnopqistuvwxyz",0xF800,Yellow);
LCD_PutString(20,180,"`,./<>\';:[]{}\|?)(-=+*&^%$",0xF800,Yellow);
PutGB3232(20,200,"我",Blue,Yellow); //写入32x32汉字
PutGB3232(60,200,"是",Blue,Red);
PutGB3232(100,200,"曙",Blue,Magenta);
PutGB3232(140,200,"光",Blue,Green);
PutGB3232(180,200,"人",Blue,Cyan); 

// show_photo();//无意义
  
while(1); 
 }
}

void ClearScreen(unsigned int bColor)  //清屏,可以设置颜色
{
 unsigned int i,j;
 LCD_SetPos(0,240,0,320);//SetPos为选择区域,320x240为整个屏幕
 for (i=0;i<325;i++)                   //按地址来说只能是从上往下刷屏,循环只是为了计数
 {
    for (j=0;j<240;j++)
        Write_Data_U16(bColor);//写入背景颜色
 }
}
/////////////////////////////////////////////////////////////
#include "8X16.h"
void LCD_PutChar8x16(unsigned short x, unsigned short y, char c, unsigned int fColor, unsigned int bColor)
{
 unsigned int i,j;//有一个疑问,i和j怎么和一个字符的8x16各个位置对应并写入?即i+1与j+1时,怎么就能使write_data_u16右移?
 LCD_SetPos(x,x+8-1,y,y+16-1);
 for(i=0; i<16;i++) {
  unsigned char m=Font8x16[c*16+i];     
  for(j=0;j<8;j++) {
   if((m&0x80)==0x80) {         
    Write_Data_U16(fColor);//表示该点填充前景色
    }
   else {
    Write_Data_U16(bColor); //表示该点填充背景色
    }
   m<<=1;
   }
  }
}

void LCD_PutChar(unsigned short x, unsigned short y, char c, unsigned int fColor, unsigned int bColor) {
  LCD_PutChar8x16( x, y, c, fColor, bColor );//两个函数一样,相连
 }

#include "GB1616.h" //16*16汉字字模

void PutGB1616(unsigned short x, unsigned short  y, unsigned char c[2], unsigned int fColor,unsigned int bColor){
 unsigned int i,j,k;
 LCD_SetPos(x,  x+16-1,y, y+16-1);

 for (k=0;k<64;k++) { //64标示自建汉字库中的个数,循环查询内码 ?应该是25个吧。。
   if ((codeGB_16[k].Index[0]==c[0])&&(codeGB_16[k].Index[1]==c[1])){
     for(i=0;i<32;i++) {
    unsigned short m=codeGB_16[k].Msk[i];
    for(j=0;j<8;j++) {
   if((m&0x80)==0x80) {
    Write_Data_U16(fColor);
    }
   else {
    Write_Data_U16(bColor);
    }
   m<<=1;
   }
    }
  } 
   } 
 }

#include "GB3232.h" //32*32汉字字模

void PutGB3232(unsigned short x, unsigned short  y, unsigned char c[2], unsigned int fColor,unsigned int bColor){
 unsigned int i,j,k;
 LCD_SetPos(x,  x+32-1,y, y+32-1);
 for (k=0;k<15;k++) { //15标示自建汉字库中的个数,循环查询内码 这个15倒是对的。。
   if ((codeGB_32[k].Index[0]==c[0])&&(codeGB_32[k].Index[1]==c[1])){
     for(i=0;i<128;i++) {
    unsigned short m=codeGB_32[k].Msk[i];
    for(j=0;j<8;j++) {
   if((m&0x80)==0x80) {
    Write_Data_U16(fColor);
    }
   else {
    Write_Data_U16(bColor);
    }
   m<<=1;
   }
    }
  } 
   } 
 }

void LCD_PutString(unsigned short x, unsigned short y, unsigned char *s, unsigned int fColor, unsigned int bColor) {
 unsigned char l=0;
 while(*s) {
  if( *s < 0x80)                            //*s指向的是s[]字符串
      {
      LCD_PutChar(x+l*8,y,*s,fColor,bColor);  //横着写,纵坐标不变,l*8表示两个字符间距为8
   s++;l++;
   }
  else
      {
   PutGB1616(x+l*8,y,(unsigned char*)s,fColor,bColor); //间距16 如果不是ascii所能表示的范围,则是汉字,那么间距加大为16,s每次+2,1每次+2
   s+=2;l+=2;
   }
  }
 }
//==================== 显示R G B 顔色 ====================//

void Show_RGB (unsigned int x0,unsigned int x1,unsigned int y0,unsigned int y1,unsigned int Color)
{   //绘制一个填充的平面矩形
 unsigned int i,j;
 LCD_SetPos(x0,x1,y0,y1);
 for (i=y0;i<=y1;i++)
 {
    for (j=x0;j<=x1;j++)
        Write_Data_U16(Color); //写像素点
 }
}

//====================== 显示彩条,无意义可不解 ======================//
//void show_colour_bar (void)   //和上一个函数没有本质区别,只是规定了宽度

//{
// int V,H;
// LCD_SetPos(0,240,0,320);//320x240

// for(H=0;H<240;H++)
// {
//  for(V=0;V<40;V++)
//  Write_Data(0xf8,0x00);  //干嘛非要把16位数用两个8位拼起来,为什么不直接write_data_U16那个函数呢?真蛋疼。。
// }

// for(H=0;H<240;H++)
// {
//  for(V=40;V<80;V++)
//  Write_Data(0x07,0xe0);
// }

// for(H=0;H<240;H++)
// {
//  for(V=80;V<120;V++)
//  Write_Data(0x00,0x1f);
// }

// for(H=0;H<240;H++)
// {
//  for(V=120;V<160;V++)
//  Write_Data(0xff,0xe0);
// }

// for(H=0;H<240;H++)
// {
//  for(V=160;V<200;V++)
//  Write_Data(0xf8,0x1f);
// }

// for(H=0;H<240;H++)
// {
//  for(V=200;V<240;V++)
//  Write_Data(0x07,0xff);
// }

// for(H=0;H<240;H++)
// {
//  for(V=240;V<280;V++)
//  Write_Data(0xff,0xff);
// }

// for(H=0;H<240;H++)
// {
//  for(V=280;V<320;V++)
//  Write_Data(0x00,0x00);
// }

//}
//====================== 显示图片,要用再解 ======================//
//void show_photo(void)
//{
// unsigned char j;
// unsigned int i;
// unsigned long s=0;

// LCD_SetPos(0,240,0,320);//320x240

// for (i=0;i<75;i++)
// {
// for (j=0;j<240;j++)
// Write_Data(0xff,0xff);
//  
// }

// for (i=0;i<170;i++)
// {
// for (j=0;j<55;j++)
//  Write_Data(0xff,0xff);

//  for (j=0;j<130;j++)
//  Write_Data(pic[s++],pic[s++]);
//  
//  for (j=0;j<55;j++)
//  Write_Data(0xff,0xff);
// }

//    for (i=0;i<75;i++)
// {
// for (j=0;j<240;j++)
// Write_Data(0xff,0xff);
//  
// }
// }
//=======================================================//

void  Init_data (unsigned char x,unsigned int y)
{
 unsigned char m,n;
 m=y>>8;
 n=y;
 Write_Cmd(0x00,x);
 Write_Data(m,n);
}

void  Write_Data_U16(unsigned int y)  //char m,n为8位,y为16位
{
 unsigned char m,n;
 m=y>>8;
 n=y;
 Write_Data(m,n);
}
//====================== 写命令 ==========================//

void Write_Cmd(unsigned char DH,unsigned char DL) //DH/DL为16位数的高低8位
{
 CS=0;
 RS=0;

 P1=DH;
 RW=0;
 RW=1;

 P1=DL;
 
 RW=0;
 RW=1;
 CS=1;
}
//===================== 写数据 ===========================//

void Write_Data(unsigned char DH,unsigned char DL)
{
 CS=0;
 
 RS=1;
 P1=DH;
 RW=0;
   RW=1;

 P1=DL; 
 RW=0;
 RW=1;
 CS=1;
}

//=======================================================
void delayms(unsigned int count)
{
    int i,j;                                                                               
    for(i=0;i<count;i++)                                                                   
       {
      for(j=0;j<260;j++);
       }                                                                                    
}
//===================== 初始化代码 =======================//

void ILI9325_Initial(void)          
{
  //////////////////////////////////////////////////////////
 delayms(150);                     //根据不同晶振速度可以调整延时,保障稳定显示
Init_data(0x00E5, 0x8000); // Set the Vcore voltage and this setting is must.
Init_data(0x0000, 0x0001); // Start internal OSC.
Init_data(0x0001, 0x0100); // set SS and SM bit
Init_data(0x0002, 0x0700); // set 1 line inversion
Init_data(0x0003, 0x0030); // set GRAM write direction and BGR=0.
Init_data(0x0004, 0x0000); // Resize register
Init_data(0x0008, 0x0202); // set the back porch and front porch
Init_data(0x0009, 0x0000); // set non-display area refresh cycle ISC[3:0]
Init_data(0x000A, 0x0000); // FMARK function
Init_data(0x000C, 0x0000); // RGB interface setting
Init_data(0x000D, 0x0000); // Frame marker Position
Init_data(0x000F, 0x0000); // RGB interface polarity
//*************Power On sequence ****************//
Init_data(0x0010, 0x0000); // SAP, BT[3:0], AP, DSTB, SLP, STB
Init_data(0x0011, 0x0007); // DC1[2:0], DC0[2:0], VC[2:0]
Init_data(0x0012, 0x0000); // VREG1OUT voltage
Init_data(0x0013, 0x0000); // VDV[4:0] for VCOM amplitude
delayms(200); // Dis-charge capacitor power voltage
Init_data(0x0010, 0x17B0); // SAP, BT[3:0], AP, DSTB, SLP, STB
Init_data(0x0011, 0x0037); // DC1[2:0], DC0[2:0], VC[2:0]
delayms(50); // Delay 50ms
Init_data(0x0012, 0x013E); // VREG1OUT voltage
delayms(50); // Delay 50ms
Init_data(0x0013, 0x1F00); // VDV[4:0] for VCOM amplitude
Init_data(0x0029, 0x0013); // VCM[4:0] for VCOMH
delayms(50);
Init_data(0x0020, 0x0000); // GRAM horizontal Address
Init_data(0x0021, 0x0000); // GRAM Vertical Address
// ----------- Adjust the Gamma Curve ----------//
Init_data(0x0030, 0x0000);
Init_data(0x0031, 0x0404);
Init_data(0x0032, 0x0404);
Init_data(0x0035, 0x0004);
Init_data(0x0036, 0x0404);
Init_data(0x0037, 0x0404);
Init_data(0x0038, 0x0404);
Init_data(0x0039, 0x0707);
Init_data(0x003C, 0x0500);
Init_data(0x003D, 0x0607);
//------------------ Set GRAM area ---------------//
Init_data(0x0050, 0x0000); // Horizontal GRAM Start Address

Init_data(0x0051, 0x00EF); // Horizontal GRAM End Address
Init_data(0x0052, 0x0000); // Vertical GRAM Start Address
Init_data(0x0053, 0x013F); // Vertical GRAM Start Address
Init_data(0x0060, 0x2700); // Gate Scan Line
Init_data(0x0061, 0x0001); // NDL,VLE, REV
Init_data(0x006A, 0x0000); // set scrolling line
//-------------- Partial Display Control ---------//
Init_data(0x0080, 0x0000);
Init_data(0x0081, 0x0000);
Init_data(0x0082, 0x0000);
Init_data(0x0083, 0x0000);
Init_data(0x0084, 0x0000);
Init_data(0x0085, 0x0000);
//-------------- Panel Control -------------------//
Init_data(0x0090, 0x0010);
Init_data(0x0092, 0x0000);
Init_data(0x0093, 0x0003);
Init_data(0x0095, 0x0110);
Init_data(0x0097, 0x0000);
Init_data(0x0098, 0x0000);
Init_data(0x0007, 0x0173); // 262K color and display ON
// Write_Cmd_Data(0x0022);//  

}

/*===========================================================*/

/*************************************************************
函数名称:LCD_DefineDispWindow
功    能:定义显示窗体
参    数:x0:  窗体中X坐标中较小者
  x1:  窗体中X坐标中较大者
  y0:  窗体中Y坐标中较小者
  y1:  窗体中Y坐标中较大者
返 回 值:无
*************************************************************/
static void LCD_SetPos(unsigned int x0,unsigned int x1,unsigned int y0,unsigned int y1)
{
  Init_data(WINDOW_XADDR_START,x0);
  Init_data(WINDOW_XADDR_END,x1);
  Init_data(WINDOW_YADDR_START,y0);
  Init_data(WINDOW_YADDR_END,y1);
  Init_data(GRAM_XADDR,x0);
  Init_data(GRAM_YADDR,y0);
  Write_Cmd (0x00,0x22);//LCD_WriteCMD(GRAMWR);
}

0x00, 0x00, 0x00, 0x00, 0x00, 0x00,// sp
0x00, 0x00, 0x00, 0x2f, 0x00, 0x00,// !
0x00, 0x00, 0x07, 0x00, 0x07, 0x00,// "
0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14,// #
0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12,// $
0x00, 0x62, 0x64, 0x08, 0x13, 0x23,// %
0x00, 0x36, 0x49, 0x55, 0x22, 0x50,// &
0x00, 0x00, 0x05, 0x03, 0x00, 0x00,// \'
0x00, 0x00, 0x1c, 0x22, 0x41, 0x00,// (
0x00, 0x00, 0x41, 0x22, 0x1c, 0x00,// )
0x00, 0x14, 0x08, 0x3E, 0x08, 0x14,// *
0x00, 0x08, 0x08, 0x3E, 0x08, 0x08,// +
0x00, 0x00, 0x00, 0xA0, 0x60, 0x00,// ,
0x00, 0x08, 0x08, 0x08, 0x08, 0x08,// -
0x00, 0x00, 0x60, 0x60, 0x00, 0x00,// .
0x00, 0x20, 0x10, 0x08, 0x04, 0x02,// /
0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E,// 0
0x00, 0x00, 0x42, 0x7F, 0x40, 0x00,// 1
0x00, 0x42, 0x61, 0x51, 0x49, 0x46,// 2
0x00, 0x21, 0x41, 0x45, 0x4B, 0x31,// 3
0x00, 0x18, 0x14, 0x12, 0x7F, 0x10,// 4
0x00, 0x27, 0x45, 0x45, 0x45, 0x39,// 5
0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30,// 6
0x00, 0x01, 0x71, 0x09, 0x05, 0x03,// 7
0x00, 0x36, 0x49, 0x49, 0x49, 0x36,// 8
0x00, 0x06, 0x49, 0x49, 0x29, 0x1E,// 9
0x00, 0x00, 0x36, 0x36, 0x00, 0x00,// :
0x00, 0x00, 0x56, 0x36, 0x00, 0x00,// ;
0x00, 0x08, 0x14, 0x22, 0x41, 0x00,// <
0x00, 0x14, 0x14, 0x14, 0x14, 0x14,// =
0x00, 0x00, 0x41, 0x22, 0x14, 0x08,// >
0x00, 0x02, 0x01, 0x51, 0x09, 0x06,// ?
0x00, 0x32, 0x49, 0x59, 0x51, 0x3E,// @
0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C,// A
0x00, 0x7F, 0x49, 0x49, 0x49, 0x36,// B
0x00, 0x3E, 0x41, 0x41, 0x41, 0x22,// C
0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C,// D
0x00, 0x7F, 0x49, 0x49, 0x49, 0x41,// E
0x00, 0x7F, 0x09, 0x09, 0x09, 0x01,// F
0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A,// G
0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F,// H
0x00, 0x00, 0x41, 0x7F, 0x41, 0x00,// I
0x00, 0x20, 0x40, 0x41, 0x3F, 0x01,// J
0x00, 0x7F, 0x08, 0x14, 0x22, 0x41,// K
0x00, 0x7F, 0x40, 0x40, 0x40, 0x40,// L
0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F,// M
0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F,// N
0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E,// O
0x00, 0x7F, 0x09, 0x09, 0x09, 0x06,// P
0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E,// Q
0x00, 0x7F, 0x09, 0x19, 0x29, 0x46,// R
0x00, 0x46, 0x49, 0x49, 0x49, 0x31,// S
0x00, 0x01, 0x01, 0x7F, 0x01, 0x01,// T
0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F,// U
0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F,// V
0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F,// W
0x00, 0x63, 0x14, 0x08, 0x14, 0x63,// X
0x00, 0x07, 0x08, 0x70, 0x08, 0x07,// Y
0x00, 0x61, 0x51, 0x49, 0x45, 0x43,// Z
0x00, 0x00, 0x7F, 0x41, 0x41, 0x00,// [
0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55,// 55
0x00, 0x00, 0x41, 0x41, 0x7F, 0x00,// ]
0x00, 0x04, 0x02, 0x01, 0x02, 0x04,// ^
0x00, 0x40, 0x40, 0x40, 0x40, 0x40,// _
0x00, 0x00, 0x01, 0x02, 0x04, 0x00,// \'
0x00, 0x20, 0x54, 0x54, 0x54, 0x78,// a
0x00, 0x7F, 0x48, 0x44, 0x44, 0x38,// b
0x00, 0x38, 0x44, 0x44, 0x44, 0x20,// c
0x00, 0x38, 0x44, 0x44, 0x48, 0x7F,// d
0x00, 0x38, 0x54, 0x54, 0x54, 0x18,// e
0x00, 0x08, 0x7E, 0x09, 0x01, 0x02,// f
0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C,// g
0x00, 0x7F, 0x08, 0x04, 0x04, 0x78,// h
0x00, 0x00, 0x44, 0x7D, 0x40, 0x00,// i
0x00, 0x40, 0x80, 0x84, 0x7D, 0x00,// j
0x00, 0x7F, 0x10, 0x28, 0x44, 0x00,// k
0x00, 0x00, 0x41, 0x7F, 0x40, 0x00,// l
0x00, 0x7C, 0x04, 0x18, 0x04, 0x78,// m
0x00, 0x7C, 0x08, 0x04, 0x04, 0x78,// n
0x00, 0x38, 0x44, 0x44, 0x44, 0x38,// o
0x00, 0xFC, 0x24, 0x24, 0x24, 0x18,// p
0x00, 0x18, 0x24, 0x24, 0x18, 0xFC,// q
0x00, 0x7C, 0x08, 0x04, 0x04, 0x08,// r
0x00, 0x48, 0x54, 0x54, 0x54, 0x20,// s
0x00, 0x04, 0x3F, 0x44, 0x40, 0x20,// t
0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C,// u
0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C,// v
0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C,// w
0x00, 0x44, 0x28, 0x10, 0x28, 0x44,// x
0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C,// y
0x00, 0x44, 0x64, 0x54, 0x4C, 0x44,// z
0x14, 0x14, 0x14, 0x14, 0x14, 0x14,// horiz lines