原创 stm32驱动2.8寸3.2寸液晶驱动

2010-9-1 20:01 1620 2 2 分类: MCU/ 嵌入式

982557ee-b151-4c60-ac0a-fccecb510dfb.jpg


/******************************************************************************
* 文件名称:ili932x.c
* 摘 要:支持ILI9320和ILI9325驱动IC控制的QVGA显示屏,使用16位并行传输
  到头文件中配置 屏幕使用方向和驱动IC类型
  注意:16位数据线色彩分布>>  BGR(565)


* 当前版本:V1.3
* 修改说明:版本修订说明:
  1.修改翻转模式下的ASCII字符写Bug
  2.增加可以在翻转模式下的自动行写
  3.优化刷图片 使用流水线方法提效率
*重要说明!
在.h文件中,#define Immediately时是立即显示当前画面
而如果#define Delay,则只有在执行了LCD_WR_REG(0x0007,0x0173);
之后才会显示,执行一次LCD_WR_REG(0x0007,0x0173)后,所有写入数
据都立即显示。
#define Delay一般用在开机画面的显示,防止显示出全屏图像的刷新
过程
******************************************************************************/
#include  "stm32f10x_lib.h"
#include  "ili932x.h"
#include  "HzLib_65k.h"
#include  "picdata.h"
/****************************************************************
函数名:Lcd配置函数
功能:配置所有和Lcd相关的GPIO和时钟
引脚分配为:
PB8--PB15——16Bit数据总线低8位
PC0--PC7 ——16Bit数据总线高8位
PC8 ——Lcd_cs
PC9 ——Lcd_rs*
PC10——Lcd_wr
PC11——Lcd_rd*
PC12——Lcd_rst
PC13——Lcd_blaklight 背光靠场效应管驱动背光模块
*****************************************************************/
void Lcd_Configuration(void)
{
 GPIO_InitTypeDef GPIO_InitStructure;
 /*开启相应时钟 */
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE); 
 /*所有Lcd引脚配置为推挽输出*/
 /*16位数据低8位*/
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
 GPIO_Init(GPIOB, &GPIO_InitStructure);
 /*16位数据高8位*/
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
 GPIO_Init(GPIOC, &GPIO_InitStructure);
 /*控制脚*/
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12;
 GPIO_Init(GPIOC, &GPIO_InitStructure);
 /*背光控制*/
 GPIO_InitStructure.GPIO_Pin =GPIO_Pin_13;
 GPIO_Init(GPIOC, &GPIO_InitStructure);
}
 
void DataToWrite(u16 data)
{
 u16 temp;
 temp = GPIO_ReadOutputData(GPIOB);
 GPIO_Write(GPIOB, (data<<8)|(temp&0x00ff));
 temp = GPIO_ReadOutputData(GPIOC);
 GPIO_Write(GPIOC, (data>>8)|(temp&0xff00));
}


/****************************************************************************
* 名    称:u16 CheckController(void)
* 功    能:返回控制器代码
* 入口参数:无
* 出口参数:控制器型号
* 说    明:调用后返回兼容型号的控制器型号
* 调用方法:code=CheckController();
****************************************************************************/
u16 CheckController(void)
{
   u16 tmp=0,tmp1=0,tmp2=0;
 GPIO_InitTypeDef GPIO_InitStructure;


   DataToWrite(0xffff);//数据线全高
 Set_Rst;
 Set_nWr;
 Set_Cs;
 Set_Rs;
 Set_nRd;
 Set_Rst;
 Delay_nms(1);
 Clr_Rst;
 Delay_nms(1);
 Set_Rst;
 Delay_nms(1);
 LCD_WR_REG(0x0000,0x0001);  //start oscillation
 Delay_nms(1);


 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
 GPIO_Init(GPIOB, &GPIO_InitStructure);
 /*16位数据高8位*/
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
 GPIO_Init(GPIOC, &GPIO_InitStructure);
 
   GPIO_ResetBits(GPIOC,GPIO_Pin_8);
 
   GPIO_SetBits(GPIOC,GPIO_Pin_9);
 
   GPIO_ResetBits(GPIOC,GPIO_Pin_11);


   tmp1 = GPIO_ReadInputData(GPIOB);
 tmp2 = GPIO_ReadInputData(GPIOC);


 tmp = (tmp1>>8) | (tmp2<<8);
 
   GPIO_SetBits(GPIOC,GPIO_Pin_11);
 
   GPIO_SetBits(GPIOC,GPIO_Pin_8);


 /*16位数据低8位*/
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
 GPIO_Init(GPIOB, &GPIO_InitStructure);
 /*16位数据高8位*/
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
 GPIO_Init(GPIOC, &GPIO_InitStructure);
 
   return tmp;
}


/**********************************************
函数名:Lcd初始化函数
功能:初始化Lcd
入口参数:无
返回值:无
***********************************************/
void Lcd_Initialize(void)
{
   u16 i;
 Lcd_Light_ON;
 DataToWrite(0xffff);//数据线全高
 Set_Rst;
 Set_nWr;
 Set_Cs;
 Set_Rs;
 Set_nRd;
 Set_Rst;
 Delay_nms(1);
 Clr_Rst;
 Delay_nms(1);
 Set_Rst;
 Delay_nms(1);
 
 LCD_WR_REG(0x0000,0x0001);      //打开晶振
    LCD_WR_REG(0x0003,0xA8A4);      //0xA8A4
    LCD_WR_REG(0x000C,0x0000);      
    LCD_WR_REG(0x000D,0x080C);    
    LCD_WR_REG(0x000E,0x2B00);     
    LCD_WR_REG(0x001E,0x00B0);    
    LCD_WR_REG(0x0001,0x2B3F);     //驱动输出控制320*240  0x6B3F
    LCD_WR_REG(0x0002,0x0600); 
    LCD_WR_REG(0x0010,0x0000);   
    LCD_WR_REG(0x0011,0x6070);       //6070   0x4030           //定义数据格式  16位色
    LCD_WR_REG(0x0005,0x0000);  
    LCD_WR_REG(0x0006,0x0000);  
    LCD_WR_REG(0x0016,0xEF1C);  
    LCD_WR_REG(0x0017,0x0003);  
    LCD_WR_REG(0x0007,0x0233);     
    LCD_WR_REG(0x000B,0x0000);   
    LCD_WR_REG(0x000F,0x0000);   
    LCD_WR_REG(0x0041,0x0000);   
    LCD_WR_REG(0x0042,0x0000);   
    LCD_WR_REG(0x0048,0x0000);   
    LCD_WR_REG(0x0049,0x013F);   
    LCD_WR_REG(0x004A,0x0000); 
    LCD_WR_REG(0x004B,0x0000);   
    LCD_WR_REG(0x0044,0xEF00);   
    LCD_WR_REG(0x0045,0x0000);   
    LCD_WR_REG(0x0046,0x013F);   
    LCD_WR_REG(0x0030,0x0707);   
    LCD_WR_REG(0x0031,0x0204);   
    LCD_WR_REG(0x0032,0x0204);  
    LCD_WR_REG(0x0033,0x0502);   
    LCD_WR_REG(0x0034,0x0507);   
    LCD_WR_REG(0x0035,0x0204);   
    LCD_WR_REG(0x0036,0x0204);  
    LCD_WR_REG(0x0037,0x0502);   
    LCD_WR_REG(0x003A,0x0302);   
    LCD_WR_REG(0x003B,0x0302);   
    LCD_WR_REG(0x0023,0x0000);   
    LCD_WR_REG(0x0024,0x0000);   
    LCD_WR_REG(0x0025,0x8000);   
    LCD_WR_REG(0x004f,5);        //行首址0
    LCD_WR_REG(0x004e,5);        //列首址0   
   /* LCD_WR_REG(0x0000,0x0001);  //打开晶振
     LCD_WR_REG(0x0003,0xA8A4);  //0xA8A4
     LCD_WR_REG(0x000C,0x0000);       
     LCD_WR_REG(0x000D,0x080C);       
     LCD_WR_REG(0x000E,0x2B00);       
     LCD_WR_REG(0x001E,0x00B0);       
     LCD_WR_REG(0x0001,0x2B3F);  //驱动输出控制320*240  0x6B3F
     LCD_WR_REG(0x0002,0x0600);     //LCD Driving Waveform control
     LCD_WR_REG(0x0010,0x0000);    
     LCD_WR_REG(0x0011,0x60b0);  //0x4030 //定义数据格式  16位色 横屏 0x6058   6070
     LCD_WR_REG(0x0005,0x0000);    
     LCD_WR_REG(0x0006,0x0000);    
     LCD_WR_REG(0x0016,0xEF1C);    
     LCD_WR_REG(0x0017,0x0003);    
     LCD_WR_REG(0x0007,0x0233);  //0x0233      
     LCD_WR_REG(0x000B,0x0000);    
     LCD_WR_REG(0x000F,0x0000);  //扫描开始地址
     LCD_WR_REG(0x0041,0x0000);    
     LCD_WR_REG(0x0042,0x0000);    
     LCD_WR_REG(0x0048,0x0000);    
     LCD_WR_REG(0x0049,0x013F);    
     LCD_WR_REG(0x004A,0x0000);    
     LCD_WR_REG(0x004B,0x0000);    
     LCD_WR_REG(0x0044,0xEF00);    
     LCD_WR_REG(0x0045,0x0000);    
     LCD_WR_REG(0x0046,0x013F);    
     LCD_WR_REG(0x0030,0x0707);    
     LCD_WR_REG(0x0031,0x0204);    
     LCD_WR_REG(0x0032,0x0204);    
     LCD_WR_REG(0x0033,0x0502);    
     LCD_WR_REG(0x0034,0x0507);    
     LCD_WR_REG(0x0035,0x0204);    
     LCD_WR_REG(0x0036,0x0204);    
     LCD_WR_REG(0x0037,0x0502);    
     LCD_WR_REG(0x003A,0x0302);    
     LCD_WR_REG(0x003B,0x0302);    
     LCD_WR_REG(0x0023,0x0000);    
     LCD_WR_REG(0x0024,0x0000);    
     LCD_WR_REG(0x0025,0x8000);   */
     /*LCD_WR_REG(0x0000,0x0001);  //打开晶振
     LCD_WR_REG(0x0003,0xA8A4);  //0xA8A4
     LCD_WR_REG(0x000C,0x0000);       
     LCD_WR_REG(0x000D,0x080C);       
     LCD_WR_REG(0x000E,0x2B00);       
     LCD_WR_REG(0x001E,0x00B0);       
     LCD_WR_REG(0x0001,0x2B3F);  //驱动输出控制320*240  0x6B3F
     LCD_WR_REG(0x0002,0x0600);     //LCD Driving Waveform control
     LCD_WR_REG(0x0010,0x0000);    
     LCD_WR_REG(0x0011,0x6018);  //0x4030 //定义数据格式  16位色 横屏 0x6058   6070   60b0
     LCD_WR_REG(0x0005,0x0000);    
     LCD_WR_REG(0x0006,0x0000);    
     LCD_WR_REG(0x0016,0xEF1C);    
     LCD_WR_REG(0x0017,0x0003);    
     LCD_WR_REG(0x0007,0x0233);  //0x0233      
     LCD_WR_REG(0x000B,0x0000);    
     LCD_WR_REG(0x000F,0x0000);  //扫描开始地址
     LCD_WR_REG(0x0041,0x0000);    
     LCD_WR_REG(0x0042,0x0000);    
     LCD_WR_REG(0x0048,0x0000);    
     LCD_WR_REG(0x0049,0x013F);    
     LCD_WR_REG(0x004A,0x0000);    
     LCD_WR_REG(0x004B,0x0000);    
     LCD_WR_REG(0x0044,0xEF00);    
     LCD_WR_REG(0x0045,0x0000);    
     LCD_WR_REG(0x0046,0x013F);    
     LCD_WR_REG(0x0030,0x0707);    
     LCD_WR_REG(0x0031,0x0204);    
     LCD_WR_REG(0x0032,0x0204);    
     LCD_WR_REG(0x0033,0x0502);    
     LCD_WR_REG(0x0034,0x0507);    
     LCD_WR_REG(0x0035,0x0204);    
     LCD_WR_REG(0x0036,0x0204);    
     LCD_WR_REG(0x0037,0x0502);    
     LCD_WR_REG(0x003A,0x0302);    
     LCD_WR_REG(0x003B,0x0302);    
     LCD_WR_REG(0x0023,0x0000);    
     LCD_WR_REG(0x0024,0x0000);    
     LCD_WR_REG(0x0025,0x8000);    */


}



/******************************************
函数名:Lcd写命令函数
功能:向Lcd指定位置写入应有命令或数据
入口参数:Index 要寻址的寄存器地址
          ConfigTemp 写入的数据或命令值
返回值:无
******************************************/
void LCD_WR_REG(u16 Index,u16 CongfigTemp)
{
 Clr_Cs;
 Clr_Rs;
 Set_nRd;
 DataToWrite(Index);
 Clr_nWr;
 Set_nWr;
 Set_Rs;      
 DataToWrite(CongfigTemp);      
 Clr_nWr;
 Set_nWr;
 Set_Cs;
}



/************************************************
函数名:Lcd写开始函数
功能:控制Lcd控制引脚 执行写操作
入口参数:无
返回值:无
************************************************/
void Lcd_WR_Start(void)
{
 Clr_Cs;
 Clr_Rs;
 Set_nRd;
 DataToWrite(0x0022);
 Clr_nWr;
 Set_nWr;
 Set_Rs;
}



/*************************************************
函数名:Lcd光标起点定位函数
功能:指定320240液晶上的一点作为写数据的起始点
入口参数:x 坐标 0~239
          y 坐标 0~319
返回值:无
*************************************************/
void Lcd_SetCursor(u8 x,u16 y)
{
 LCD_WR_REG(0x20,x);
 LCD_WR_REG(0x21,y);   
}



   /****************************************************************************
* 名    称:void ili9320_SetPoint(u16 x,u16 y,u16 point)
* 功    能:在指定座标画点
* 入口参数:x      行座标
*           y      列座标
*           point  点的颜色
* 出口参数:无
* 说    明:
* 调用方法:ili9320_SetPoint(10,10,0x0fe0);
****************************************************************************/
void Lcd_putPixel(u8 x, u16 y ,u16 Color )
  {
   if ( (x>320)||(y>240) ) return;
  LCD_WR_REG(0x4F, x);  // 20  4F
  LCD_WR_REG(0x4E, y);    // 21  4E
  LCD_WR_REG(0x22,Color);
  }
/**********************************************
函数名:Lcd全屏擦除函数
功能:将Lcd整屏擦为指定颜色
入口参数:color 指定Lcd全屏颜色 RGB(5-6-5)
返回值:无
***********************************************/
void Lcd_Clear(u16 Color)
{
 u32 temp;
 
 Lcd_SetCursor(0x00, 0x0000);
 LCD_WR_REG(0x0050,0x00);//水平 GRAM起始位置
 LCD_WR_REG(0x0051,239);//水平GRAM终止位置
 LCD_WR_REG(0x0052,0x00);//垂直GRAM起始位置
 LCD_WR_REG(0x0053,319);//垂直GRAM终止位置  
 Lcd_WR_Start();
 Set_Rs;
 
 for (temp = 0; temp < 76800; temp++)
 {
  DataToWrite(Color);
  Clr_nWr;
  Set_nWr;
 }
 
 Set_Cs;
}
/**********************************************
函数名:Lcd块选函数
功能:选定Lcd上指定的矩形区域


注意:xStart和 yStart随着屏幕的旋转而改变,位置是矩形框的四个角


入口参数:xStart x方向的起始点
          ySrart y方向的终止点
          xLong 要选定矩形的x方向长度
          yLong  要选定矩形的y方向长度
返回值:无
***********************************************/
void Lcd_SetBox(u8 xStart,u16 yStart,u8 xLong,u16 yLong,u16 x_offset,u16 y_offset)
{
 
/*#if ID_AM==000   
 Lcd_SetCursor(xStart+xLong-1+x_offset,yStart+yLong-1+y_offset);  //2


#elif ID_AM==001
 Lcd_SetCursor(xStart+xLong-1+x_offset,yStart+yLong-1+y_offset);
    
#elif ID_AM==010
 Lcd_SetCursor(xStart+x_offset,yStart+yLong-1+y_offset);
    
#elif ID_AM==011
 Lcd_SetCursor(xStart+x_offset,yStart+yLong-1+y_offset);  //1
    
#elif ID_AM==100
 Lcd_SetCursor(xStart+xLong-1+x_offset,yStart+y_offset);    
    
#elif ID_AM==101
 Lcd_SetCursor(xStart+xLong-1+x_offset,yStart+y_offset);    
    
#elif ID_AM==110
 Lcd_SetCursor(xStart+x_offset,yStart+y_offset);
    
#elif ID_AM==111
 Lcd_SetCursor(xStart+x_offset,yStart+y_offset); 
    
#endif */
     Lcd_SetCursor(xStart+xLong-1+x_offset,yStart+yLong-1+y_offset);  
 LCD_WR_REG(0x0050,xStart+x_offset);//水平 GRAM起始位置
 LCD_WR_REG(0x0051,xStart+xLong-1+x_offset);//水平GRAM终止位置
 LCD_WR_REG(0x0052,yStart+y_offset);//垂直GRAM起始位置
 LCD_WR_REG(0x0053,yStart+yLong-1+y_offset);//垂直GRAM终止位置
}



void Lcd_ColorBox(u8 xStart,u16 yStart,u8 xLong,u16 yLong,u16 Color)
{
 u32 temp;
 
 Lcd_SetBox(xStart,yStart,xLong,yLong,0,0);
 Lcd_WR_Start();
 Set_Rs;
 
 for (temp=0; temp<xLong*yLong; temp++)
 {
  DataToWrite(Color);
  Clr_nWr;
  Set_nWr;
 }


 Set_Cs;
}



void Lcd_ClearCharBox(u8 x,u16 y,u16 Color)
{
 u32 temp;
 
 Lcd_SetBox(x*8,y*16,8,16,0,0);
 Lcd_WR_Start();
 Set_Rs;
 
 for (temp=0; temp < 128; temp++)
 {
  DataToWrite(Color);
  Clr_nWr;
  //Delay_nus(22);
  Set_nWr;
 }
 
 Set_Cs;
}



/****************************************************************
函数名:Lcd写1个ASCII字符函数
入口参数:x,横向坐标,由左到右分别是0~29
          y,纵向坐标,由上到下分别为0~19
          CharColaor,字符的颜色
          CharBackColor,字符背景颜色
         ASCIICode,相应字符的ASCII码
也就是说,320240分辨率的显示屏,横向能显示30个ASCII字符,竖向能显示20行
返回值:无


注意!!!!!如果单独使用此函数则应该加上Lcd_Rs_H()和Set_Cs;为了优化系统省去了
这个指令,假设此函数执行的上一条语句是写命令,(RS_L情况)则写入将出错
,因为ILI9320认为当RS_L时写入的是命令
*****************************************************************/
void Lcd_WriteASCII(u8 x,u8 y,u16 x_offset,u16 y_offset,u16 CharColor,u16 CharBackColor,u8 ASCIICode)
{
 u8 RowCounter,BitCounter;
 u8 *ASCIIPointer;
 u8 ASCIIBuffer[16];
 
//#if (ID_AM==000)|(ID_AM==010)|(ID_AM==100)|(ID_AM==110)
// Lcd_SetBox(x*8,y*16,8,16,x_offset,y_offset);   
//#else
 Lcd_SetBox(x*16,y*8,16,8,x_offset,y_offset);   
//#endif
       
 Lcd_WR_Start();
 GetASCIICode(ASCIIBuffer,ASCIICode,ASCII_Offset);//取这个字符的显示代码
 ASCIIPointer=ASCIIBuffer;
 
 for (RowCounter=0; RowCounter<16; RowCounter++)
 {
  for (BitCounter=0; BitCounter<8; BitCounter++)
  {
   if ((*ASCIIPointer&(0x80 >> BitCounter)) == 0x00)
   {
    //Set_Rs;
    DataToWrite(CharBackColor);
    Clr_nWr;
    Set_nWr;
   }
   else
   {
    //Set_Rs;
    DataToWrite(CharColor);
    Clr_nWr;
    Set_nWr;
   }
  }
  ASCIIPointer++;
 }
 // Set_Cs;
}



void Lcd_WriteASCIIClarity(u8 x,u8 y,u8 x_offset,u8 y_offset,u16 CharColor,u8 ASCIICode)
{
 
  GPIO_InitTypeDef GPIO_InitStructure;
  u8 RowCounter,BitCounter;
  u8 *ASCIIPointer;
  u8 ASCIIBuffer[16];
  u16 Temp;
       
#if (ID_AM==000)|(ID_AM==010)|(ID_AM==100)|(ID_AM==110)
  Lcd_SetBox(x*8,y*16,8,16,x_offset,y_offset);   
#else
  Lcd_SetBox(x*16,y*8,16,8,x_offset,y_offset);   
#endif
   
  Lcd_WR_Start();
  GetASCIICode(ASCIIBuffer,ASCIICode,ASCII_Offset);//取这个字符的显示代码
  ASCIIPointer=ASCIIBuffer;
 
  for (RowCounter=0; RowCounter<16; RowCounter++)
  {
    for(BitCounter=0;BitCounter<8;BitCounter++)
    {
      if((*ASCIIPointer  & (0x80 >> BitCounter)) == 0x00)
      {
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOE, &GPIO_InitStructure);
              
        Clr_nRd;
        Set_nRd;
              
        Temp=GPIO_ReadInputData(GPIOE);
              
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init(GPIOE, &GPIO_InitStructure);
              
        DataToWrite(Temp);
        Clr_nWr;
        Set_nWr;
      }
      else
      {
        //Set_Rs;
        DataToWrite(CharColor);
        Clr_nWr;
        Set_nWr;
      }
    }
    ASCIIPointer++;
  }
  // Set_Cs;
 
}
/**************************************************************
向液晶屏写入32*16的ASCII字符
输入参数:
x向坐标   x 0~14)
y向坐标   y 0~9)
x向偏移量 x_offset理论上是0~239)
y向偏移量 y_offset理论上是0~319)  注意:偏移量不能过大,当x轴向超出16,y轴向超过32
                                          也就是32*16字符大小时强烈建议使用x和y调整,
                                          虽然偏移量可以实现大范围偏移但是可读性和维
                                          护性都较差
字符颜色 CharColor:字符颜色
背景颜色 CharBackColor:背景颜色
***************************************************************/
void Lcd_Write32X16ASCII(u8 x,u8 y,u8 x_offset,u8 y_offset,u16 CharColor,u16 CharBackColor,u8 ASCIICode)
{


  u8 RowCounter,BitCounter;
  u8 *ASCIIPointer;
  u8 ASCIIBuffer[16];
 
//#if (ID_AM==000)|(ID_AM==010)|(ID_AM==100)|(ID_AM==110)
 // Lcd_SetBox(x*16,y*32,16,32,x_offset,y_offset);   
//#else
 Lcd_SetBox(x*32,y*16,32,16,x_offset,y_offset);   
//#endif    
   
  Lcd_WR_Start();
  GetASCIICode(ASCIIBuffer,ASCIICode,ASCII_Offset);//取这个字符的显示代码
  ASCIIPointer=ASCIIBuffer;
 
  for(RowCounter=0; RowCounter<16; RowCounter++)
  {
    for(BitCounter=0; BitCounter<8; BitCounter++)
    {
      if((*ASCIIPointer  & (0x80 >> BitCounter)) == 0x00)
      {
        //Set_Rs;
        DataToWrite(CharBackColor);
        Clr_nWr;
        Set_nWr;
        DataToWrite(CharBackColor);
        Clr_nWr;
        Set_nWr;
      }
      else
      {
        //Set_Rs;
        DataToWrite(CharColor);
        Clr_nWr;
        Set_nWr;
        DataToWrite(CharColor);
        Clr_nWr;
        Set_nWr;
      }     
    }    
    for(BitCounter=0; BitCounter<8; BitCounter++)
    {
      if((*ASCIIPointer  & (0x80 >> BitCounter)) == 0x00)
      {        
        //Set_Rs;
        DataToWrite(CharBackColor);
        Clr_nWr;
        Set_nWr;
        DataToWrite(CharBackColor);
        Clr_nWr;
        Set_nWr;
      }
      else
      {
        //Set_Rs;
        DataToWrite(CharColor);
        Clr_nWr;
        Set_nWr;
        DataToWrite(CharColor);
        Clr_nWr;
        Set_nWr;
      }
    }
    ASCIIPointer++;
  }
  // Set_Cs;
}
//可以单独使用的写一个ASCII字符函数
void Lcd_Write32X16ASCIIWrite(u8 x,u8 y,u8 x_offset,u8 y_offset,u16 CharColor,u16 CharBackColor,u8 ASCIICode)
{
        u8 RowCounter,BitCounter;
        u8 *ASCIIPointer;
       
        //配置ASCII字符位置
#if   (ID_AM==000)|(ID_AM==010)|(ID_AM==100)|(ID_AM==110)
       
        Lcd_SetBox(x*16,y*32,16,32,x_offset,y_offset);
       
#else
       
        Lcd_SetBox(x*32,y*16,32,16,x_offset,y_offset);
       
#endif
       
        Lcd_WR_Start();
//        CatchASCII(ASCIICode,ASCII_Offset);//取这个字符的显示代码
//        ASCIIPointer=CharBuffer;
        for(RowCounter=0;RowCounter<16;RowCounter++)
        {
          for(BitCounter=0;BitCounter<8;BitCounter++)
          {
            if((*ASCIIPointer  & (0x80 >> BitCounter)) == 0x00)
            {
              
               Set_Rs;
               DataToWrite(CharBackColor);
               Clr_nWr;
               Set_nWr;
               DataToWrite(CharBackColor);
               Clr_nWr;
               Set_nWr;


            }
            else
            {
               Set_Rs;
               DataToWrite(CharColor);
               Clr_nWr;
               Set_nWr;
               DataToWrite(CharColor);
               Clr_nWr;
               Set_nWr;
            }
           
          }
         
        for(BitCounter=0;BitCounter<8;BitCounter++)
          {
            if((*ASCIIPointer  & (0x80 >> BitCounter)) == 0x00)
            {
              
               Set_Rs;
               DataToWrite(CharBackColor);
               Clr_nWr;
               Set_nWr;
               DataToWrite(CharBackColor);
               Clr_nWr;
               Set_nWr;


            }
            else
            {
               Set_Rs;
               DataToWrite(CharColor);
               Clr_nWr;
               Set_nWr;
               DataToWrite(CharColor);
               Clr_nWr;
               Set_nWr;
            }
           
          }
           ASCIIPointer++;
        }
         Set_Cs;
}
void Lcd_Write32X16ASCIIClarity(u8 x,u8 y,u8 x_offset,u8 y_offset,u16 CharColor,u8 ASCIICode)
{


  GPIO_InitTypeDef GPIO_InitStructure;
  u8 RowCounter,BitCounter;
  u8 *ASCIIPointer;
  u8 ASCIIBuffer[16];
  u16 Temp;


#if (ID_AM==000)|(ID_AM==010)|(ID_AM==100)|(ID_AM==110)
  Lcd_SetBox(x*16,y*32,16,32,x_offset,y_offset);   
#else
  Lcd_SetBox(x*32,y*16,32,16,x_offset,y_offset);   
#endif
   
  Lcd_WR_Start();
  GetASCIICode(ASCIIBuffer,ASCIICode,ASCII_Offset);//取这个字符的显示代码
  ASCIIPointer=ASCIIBuffer;
 
  for(RowCounter=0; RowCounter<16; RowCounter++)
  {
    for(BitCounter=0; BitCounter<8; BitCounter++)
    {
      if((*ASCIIPointer  & (0x80 >> BitCounter)) == 0x00)
      {
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOE, &GPIO_InitStructure);
              
        Clr_nRd;
        Set_nRd;
              
        Temp=GPIO_ReadInputData(GPIOE);
              
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init(GPIOE, &GPIO_InitStructure);
              
        DataToWrite(Temp);
        Clr_nWr;
        Set_nWr;
                    
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOE, &GPIO_InitStructure);
              
        Clr_nRd;
        Set_nRd;
              
        Temp=GPIO_ReadInputData(GPIOE);
              
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init(GPIOE, &GPIO_InitStructure);
              
        DataToWrite(Temp);
        Clr_nWr;
        Set_nWr;
      }
      else
      {
        //Set_Rs;
        DataToWrite(CharColor);
        Clr_nWr;
        Set_nWr;
        DataToWrite(CharColor);
        Clr_nWr;
        Set_nWr;
      }   
    }
         
    for(BitCounter=0; BitCounter<8; BitCounter++)
    {
      if((*ASCIIPointer  & (0x80 >> BitCounter)) == 0x00)
      {
        //Set_Rs;
             
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;      
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;         
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;    
        GPIO_Init(GPIOE, &GPIO_InitStructure);
              
        Clr_nRd;
        Set_nRd;
              
        Temp=GPIO_ReadInputData(GPIOE);
              
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init(GPIOE, &GPIO_InitStructure);
              
        DataToWrite(Temp);
        Clr_nWr;
        Set_nWr;
              
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOE, &GPIO_InitStructure);
              
        Clr_nRd;
        Set_nRd;
              
        Temp=GPIO_ReadInputData(GPIOE);
              
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init(GPIOE, &GPIO_InitStructure);
              
        DataToWrite(Temp);
        Clr_nWr;
        Set_nWr;
      }
      else
      {
        //Set_Rs;
        DataToWrite(CharColor);
        Clr_nWr;
        Set_nWr;
        DataToWrite(CharColor);
        Clr_nWr;
        Set_nWr;
      }           
    }
    ASCIIPointer++;
  }
  // Set_Cs;
}
/************************************************************
函数名:Lcd写字符串函数
功能:向指定位置写入一个或多个字符,本函数带自动换行功能
入口参数:x,横向坐标,由左到右分别是0~29
          y,纵向坐标,由上到下分别为0~19
          CharColaor,字符的颜色
          CharBackColor,字符背景颜色
          *s 指向要写的字符串
返回值:无
*************************************************************/
void Lcd_WriteString(u8 x,u8 y,u16 x_offset,u16 y_offset,u16 CharColor,u16 CharBackColor,char *s)
{


  u8 databuff;
  Set_Rs;


  do
  {
    databuff=*s++; 
    Lcd_WriteASCII(x,y,x_offset,y_offset,CharColor,CharBackColor,databuff);
   
//* #if(ID_AM==000)|(ID_AM==010)|(ID_AM==100)|(ID_AM==110) 
  //  if (x<29)
  //  {
  //    x++;
 //   }
 //   else if (y<19)
 //   {
 //     x=0;
  //    y++;
 //   }  
 //   else
 //   {
  //    x=0;
  //    y=0;
  //  }
      
//#else
    if (y<39)
   {
      y++;
   }
    else if (x<14)
   {
      y=0;
      x++;
   }
   else
   {
     x=0;
     y=0;
   }
//#endif  
      
  }
  while (*s!=0);
 
  Set_Cs;
 
}
void Lcd_WriteStringClarity(u8 x,u8 y,u8 x_offset,u8 y_offset,u16 CharColor,char *s)
{


  u8 databuff;
  Set_Rs;


  do
  {
    databuff=*s++; 
    Lcd_WriteASCIIClarity(x,y,x_offset,y_offset,CharColor,databuff);
   
//#if (ID_AM==000)|(ID_AM==010)|(ID_AM==100)|(ID_AM==110) 
    if (x<29)
    {
      x++;
    }
    else if (y<19)
    {
      x=0;
      y++;
    }  
    else
    {
      x=0;
      y=0;
    }      
//#else
   // if (y<39)
   // {
   //   y++;
  //  }
   // else if (x<14)
 //   {
  //    y=0;
 //     x++;
 //   }
  //  else
  //  {
  //    x=0;
   //   y=0;
  //  }
//#endif
   
  }
  while(*s!=0);
 
  Set_Cs;
 
}
/****************************************
写入32X16的ASCII字符串
*****************************************/
void Lcd_Write32X16String(u8 x,u8 y,u8 x_offset,u8 y_offset,u16 CharColor,u16 CharBackColor,char *s)
{


  u8 databuff;
  Set_Rs;
 
  do
  {
    databuff=*s++; 
    Lcd_Write32X16ASCII(x,y,x_offset,y_offset,CharColor,CharBackColor,databuff);
/*   
#if (ID_AM==000)|(ID_AM==010)|(ID_AM==100)|(ID_AM==110) 
    if (x<14)
    {
      x++;
    }
    else if (y<9)
    {
      x=0;
      y++;
    }  
    else
    {
      x=0;
      y=0;
    }  
#else
    if (y<6)
    {
      y++;
    }
    else if (x<19)
    {
      y=0;
      x++;
    }
    else
    {
      x=0;
      y=0;
    }  
#endif
     
  } */
  }
  while (*s!=0);
   
  Set_Cs;
 
}
void Lcd_Write32X16StringClarity(u8 x,u8 y,u8 x_offset,u8 y_offset,u16 CharColor,char *s)
{


  u8 databuff;
  Set_Rs;
 
  do
  {
    databuff=*s++; 
    Lcd_Write32X16ASCIIClarity(x,y,x_offset,y_offset,CharColor,databuff);


#if (ID_AM==000)|(ID_AM==010)|(ID_AM==100)|(ID_AM==110) 
    if (x<14)
    {
      x++;
    }
    else if (y<9)
    {
      x=0;
      y++;
    }  
    else
    {
      x=0;
      y=0;
    }    
#else
    if (y<6)
    {
      y++;
    }
    else if (x<19)
    {
      y=0;
      x++;
    }
    else
    {
      x=0;
      y=0;
    }
#endif
   
  }
  while(*s!=0);
 
  Set_Cs;
 
}
/****************************************************************
函数名:Lcd写1个中文函数
入口参数:x,横向坐标,由左到右分别是0~15
          y,纵向坐标,由上到下分别为0~19
          CharColaor,字符的颜色
          CharBackColor,字符背景颜色
         ASCIICode,相应中文的编码
也就是说,320240分辨率的显示屏,横向能显示15中文字符,竖向能显示20行
返回值:无


注意!!!!!如果单独使用此函数则应该加上Lcd_Rs_H()和Set_Cs;为了优化系统省去了
这个指令,假设此函数执行的上一条语句是写命令,(RS_L情况)则写入将出错
,因为ILI9320认为当RS_L时写入的是命令
*****************************************************************/
void Lcd_WriteChinese(u8 x,u8 y,u16 x_offset,u16 y_offset,u16 CharColor,u16 CharBackColor,u16 ChineseCode)
{


  u8 ByteCounter,BitCounter;
  u8 *ChinesePointer;
  u8 ChineseBuffer[32];
       
  Lcd_SetBox(x*16,y*16,16,16,x_offset,y_offset);        
  Lcd_WR_Start();
  GetChineseCode(ChineseBuffer,ChineseCode,Chinese_Offset);
  ChinesePointer=ChineseBuffer;
       
  for(ByteCounter=0; ByteCounter<32; ByteCounter++)
  {
    for(BitCounter=0;BitCounter<8;BitCounter++)
    {
      if((*ChinesePointer & (0x80 >> BitCounter)) == 0x00)
      {
        //Set_Rs;
        DataToWrite(CharBackColor);
        Clr_nWr;
        Set_nWr;
      }
      else
      {
        //Set_Rs;
        DataToWrite(CharColor);
        Clr_nWr;
        Set_nWr;
      }    
    }
    ChinesePointer++;
  }
  //Set_Cs;
 
}
void Lcd_WriteChineseClarity(u8 x,u8 y,u8 x_offset,u8 y_offset,u16 CharColor,u16 ChineseCode)
{


  GPIO_InitTypeDef GPIO_InitStructure;
  u16 Temp;
  u8 ByteCounter,BitCounter;
  u8 *ChinesePointer;
  u8 ChineseBuffer[32];
 
  Lcd_SetBox(x*16,y*16,16,16,x_offset,y_offset);        
  Lcd_WR_Start();
  GetChineseCode(ChineseBuffer,ChineseCode,Chinese_Offset);
  ChinesePointer=ChineseBuffer;
 
  for(ByteCounter=0; ByteCounter<32; ByteCounter++)
  {
    for(BitCounter=0; BitCounter<8; BitCounter++)
    {
      if((*ChinesePointer & (0x80 >> BitCounter)) == 0x00)
      {
        //Set_Rs;
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOE, &GPIO_InitStructure);
              
        Clr_nRd;
        Set_nRd;
              
        Temp=GPIO_ReadInputData(GPIOE);
              
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init(GPIOE, &GPIO_InitStructure);
              
        DataToWrite(Temp);
        Clr_nWr;
        Set_nWr;
      }
      else
      {
        //Set_Rs;
        DataToWrite(CharColor);
        Clr_nWr;
        Set_nWr;
      }    
    }
  ChinesePointer++;
  }
  //Set_Cs;
 
}
/****************************************************************
函数名:Lcd写1个32X32中文函数
入口参数:x,横向坐标,由左到右分别是0~7
          y,纵向坐标,由上到下分别为0~9
          CharColaor,字符的颜色
          CharBackColor,字符背景颜色
         ASCIICode,相应中文的编码
也就是说,320240分辨率的显示屏,横向能显示7中文字符,竖向能显示10行
返回值:无


注意!!!!!如果单独使用此函数则应该加上Lcd_Rs_H()和Set_Cs;为了优化系统省去了
这个指令,假设此函数执行的上一条语句是写命令,(RS_L情况)则写入将出错
,因为ILI9320认为当RS_L时写入的是命令
*****************************************************************/
void Lcd_Write32X32Chinese(u8 x,u8 y,u8 x_offset,u8 y_offset,u16 CharColor,u16 CharBackColor,u16 ChineseCode)
{
       
  u8 ByteCounter,BitCounter;
  u8 *ChinesePointer;
  u8 ChineseBuffer[32];
 
  Lcd_SetBox(x*32,y*32,32,32,x_offset,y_offset);        
  Lcd_WR_Start();
  GetChineseCode(ChineseBuffer,ChineseCode,Chinese_Offset);
  ChinesePointer=ChineseBuffer;
 
  for(ByteCounter=0; ByteCounter<16; ByteCounter++)
  {
    for(BitCounter=0; BitCounter<8; BitCounter++)
    {
      if (((*ChinesePointer)&(0x80 >> BitCounter)) == 0x00)
      {
        //Set_Rs;
        DataToWrite(CharBackColor);
        Clr_nWr;
        Set_nWr;
        DataToWrite(CharBackColor);
        Clr_nWr;
        Set_nWr;
      }
      else
      {
        //Set_Rs;
        DataToWrite(CharColor);
        Clr_nWr;
        Set_nWr;
        DataToWrite(CharColor);
        Clr_nWr;
        Set_nWr;
      }
    }
    for (BitCounter=0; BitCounter<8; BitCounter++)
    {
      if (((*(ChinesePointer+1)) & (0x80 >> BitCounter)) == 0x00)
      {
        //Set_Rs;
        DataToWrite(CharBackColor);
        Clr_nWr;
        Set_nWr;
        DataToWrite(CharBackColor);
        Clr_nWr;
        Set_nWr;
      }
      else
      {
        //Set_Rs;
        DataToWrite(CharColor);
        Clr_nWr;
        Set_nWr;
        DataToWrite(CharColor);
        Clr_nWr;
        Set_nWr;
      }
    }         
    for (BitCounter=0; BitCounter<8; BitCounter++)
    {
      if (((*ChinesePointer) & (0x80 >> BitCounter)) == 0x00)
      {
        //Set_Rs;
        DataToWrite(CharBackColor);
        Clr_nWr;
        Set_nWr;
        DataToWrite(CharBackColor);
        Clr_nWr;
        Set_nWr;
      }
      else
      {
        //Set_Rs;
        DataToWrite(CharColor);
        Clr_nWr;
        Set_nWr;
        DataToWrite(CharColor);
        Clr_nWr;
        Set_nWr;
      }
    }       
    for (BitCounter=0; BitCounter<8; BitCounter++)
    {
      if (((*(ChinesePointer+1)) & (0x80 >> BitCounter)) == 0x00)
      {
        //Set_Rs;
        DataToWrite(CharBackColor);
        Clr_nWr;
        Set_nWr;
        DataToWrite(CharBackColor);
        Clr_nWr;
        Set_nWr;
      }
      else
      {
        //Set_Rs;
        DataToWrite(CharColor);
        Clr_nWr;
        Set_nWr;
        DataToWrite(CharColor);
        Clr_nWr;
        Set_nWr;
      }
    }
    ChinesePointer+=2;
  }
  //Set_Cs;
 }
void Lcd_Write32X32ChineseClarity(u8 x,u8 y,u8 x_offset,u8 y_offset,u16 CharColor,u16 ChineseCode)
{
       
  GPIO_InitTypeDef GPIO_InitStructure;
  u8 ByteCounter,BitCounter;
  u8 *ChinesePointer;
  u8 ChineseBuffer[32];
  u16 Temp;


  Lcd_SetBox(x*32,y*32,32,32,x_offset,y_offset);        
  Lcd_WR_Start();
  GetChineseCode(ChineseBuffer,ChineseCode,Chinese_Offset);
  ChinesePointer=ChineseBuffer;      
 
  for(ByteCounter=0; ByteCounter<16; ByteCounter++)
  {
    for(BitCounter=0; BitCounter<8; BitCounter++)
    {
      if (((*ChinesePointer)&(0x80 >> BitCounter)) == 0x00)
      {
        //Set_Rs;
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOE, &GPIO_InitStructure);
              
        Clr_nRd;
        Set_nRd;
              
        Temp=GPIO_ReadInputData(GPIOE);
              
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init(GPIOE, &GPIO_InitStructure);
              
        DataToWrite(Temp);
        Clr_nWr;
        Set_nWr;
                    
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOE, &GPIO_InitStructure);
              
        Clr_nRd;
        Set_nRd;
              
        Temp=GPIO_ReadInputData(GPIOE);
              
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init(GPIOE, &GPIO_InitStructure);
              
        DataToWrite(Temp);
        Clr_nWr;
        Set_nWr;
      }
      else
      {
        //Set_Rs;
        DataToWrite(CharColor);
        Clr_nWr;
        Set_nWr;
        DataToWrite(CharColor);
        Clr_nWr;
        Set_nWr;
      }
    }
         
    for(BitCounter=0; BitCounter<8; BitCounter++)
    {
      if (((*(ChinesePointer+1))&(0x80 >> BitCounter)) == 0x00)
      {
        //Set_Rs;
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOE, &GPIO_InitStructure);
              
        Clr_nRd;
        Set_nRd;
              
        Temp=GPIO_ReadInputData(GPIOE);
              
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init(GPIOE, &GPIO_InitStructure);
              
        DataToWrite(Temp);
        Clr_nWr;
        Set_nWr;
                    
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOE, &GPIO_InitStructure);
              
        Clr_nRd;
        Set_nRd;
              
        Temp=GPIO_ReadInputData(GPIOE);
              
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init(GPIOE, &GPIO_InitStructure);
              
        DataToWrite(Temp);
        Clr_nWr;
        Set_nWr;
      }
      else
      {
        //Set_Rs;
        DataToWrite(CharColor);
        Clr_nWr;
        Set_nWr;
        DataToWrite(CharColor);
        Clr_nWr;
        Set_nWr;
      }
    }


         
         
    for(BitCounter=0; BitCounter<8; BitCounter++)
    {
      if (((*ChinesePointer)&(0x80 >> BitCounter)) == 0x00)
      {
        //Set_Rs;
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOE, &GPIO_InitStructure);
              
        Clr_nRd;
        Set_nRd;
              
        Temp=GPIO_ReadInputData(GPIOE);
              
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init(GPIOE, &GPIO_InitStructure);
              
        DataToWrite(Temp);
        Clr_nWr;
        Set_nWr;
                    
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOE, &GPIO_InitStructure);
              
        Clr_nRd;
        Set_nRd;
              
        Temp=GPIO_ReadInputData(GPIOE);
              
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init(GPIOE, &GPIO_InitStructure);
              
        DataToWrite(Temp);
        Clr_nWr;
        Set_nWr;
      }
      else
      {
        //Set_Rs;
        DataToWrite(CharColor);
        Clr_nWr;
        Set_nWr;
        DataToWrite(CharColor);
        Clr_nWr;
        Set_nWr;
      }
    }
         
    for(BitCounter=0; BitCounter<8; BitCounter++)
    {
      if (((*(ChinesePointer+1))&(0x80 >> BitCounter)) == 0x00)
      {
        //Set_Rs;
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOE, &GPIO_InitStructure);
              
        Clr_nRd;
        Set_nRd;
              
        Temp=GPIO_ReadInputData(GPIOE);
              
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init(GPIOE, &GPIO_InitStructure);
              
        DataToWrite(Temp);
        Clr_nWr;
        Set_nWr;
                    
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOE, &GPIO_InitStructure);
              
        Clr_nRd;
        Set_nRd;
              
        Temp=GPIO_ReadInputData(GPIOE);
              
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init(GPIOE, &GPIO_InitStructure);
              
        DataToWrite(Temp);
        Clr_nWr;
        Set_nWr;
      }
      else
      {
        //Set_Rs;
        DataToWrite(CharColor);
        Clr_nWr;
        Set_nWr;
        DataToWrite(CharColor);
        Clr_nWr;
        Set_nWr;
      }
    }
      ChinesePointer+=2;
  }
  //Set_Cs;
 
}
void Lcd_WriteChineseString(u8 x,u8 y,u8 x_offset,u8 y_offset,u16 CharColor,u16 CharBackColor,char *s)
{
  
  u8 databuffer;
  u16 ChineseCode;
  Set_Rs;
 
  do
  {
    databuffer=*s++;
    ChineseCode=databuffer<<8;
    ChineseCode=ChineseCode|*s++;
    Lcd_WriteChinese(x,y,x_offset,y_offset,CharColor,CharBackColor,ChineseCode);
   
#if (ID_AM==000)|(ID_AM==010)|(ID_AM==100)|(ID_AM==110) 
    if (x<14)
    {
      x++;
    }
    else if (y<19)
    {
      x=0;
      y++;
    }
    else
    {
      x=0;
      y=0;
    }    
#else
    if (y<19)
    {
      y++;
    }
    else if (x<14)
    {
      y=0;
      x++;
    }
    else
    {
      x=0;
      y=0;
    } 
#endif
     
  }
  while(*s!=0);
   
  Set_Cs;


}
void Lcd_WriteChineseStringClarity(u8 x,u8 y,u8 x_offset,u8 y_offset,u16 CharColor,char *s)
{
   u8 databuffer;
   u16 ChineseCode;
   Set_Rs;
    do
   {
       databuffer=*s++;
       ChineseCode=databuffer<<8;
       ChineseCode=ChineseCode|*s++;
       Lcd_WriteChineseClarity(x,y,x_offset,y_offset,CharColor,ChineseCode);
      
#if (ID_AM==000)|(ID_AM==010)|(ID_AM==100)|(ID_AM==110) 
       if (x<14)
       {
         x++;
       }
       else if (y<19)
       {
         x=0;
         y++;
       }
       else
       {
         x=0;
         y=0;
       }    
#else
       if (y<19)
       {
         y++;
       }
       else if (x<14)
       {
         y=0;
         x++;
       }
       else
       {
         x=0;
         y=0;
       } 
#endif
      
   }
     while(*s!=0);
    Set_Cs;
}
void Lcd_Write32X32ChineseString(u8 x,u8 y,u8 x_offset,u8 y_offset,u16 CharColor,u16 CharBackColor,char *s)
{
  
  u8 databuffer;
  u16 ChineseCode;
  
  Set_Rs;
  do
  {
    databuffer=*s++;
    ChineseCode=databuffer<<8;
    ChineseCode=ChineseCode|*s++;
    Lcd_Write32X32Chinese(x,y,x_offset,y_offset,CharColor,CharBackColor,ChineseCode);
      
#if (ID_AM==000)|(ID_AM==010)|(ID_AM==100)|(ID_AM==110) 
    if (x<6)
    {
      x++;
    }
    else if (y<9)
    {
      x=0;
      y++;
    }
    else
    {
      x=0;
      y=0;
    }    
#else
    if (y<9)
    {
      y++;
    }
    else if (x<6)
    {
      y=0;
      x++;
    }
    else
    {
      x=0;
      y=0;
    } 
#endif
    
  }
  while(*s!=0);


  Set_Cs;


}
void Lcd_Write32X32ChineseStringClarity(u8 x,u8 y,u8 x_offset,u8 y_offset,u16 CharColor,char *s)
{
  u8 databuffer;
  u16 ChineseCode;
  Set_Rs;


  do
  {
   databuffer=*s++;
   ChineseCode=databuffer<<8;
   ChineseCode=ChineseCode|*s++;
   Lcd_Write32X32ChineseClarity(x,y,x_offset,y_offset,CharColor,ChineseCode);
   
#if (ID_AM==000)|(ID_AM==010)|(ID_AM==100)|(ID_AM==110) 


  if (x<6)
  {
   x++;
  }
  else if (y<9)
  {
   x=0;
   y++;
  }
  else
  {
   x=0;
   y=0;
  }    
#else
  if (y<9)
  {
   y++;
  }
  else if (x<6)
  {
   y=0;
   x++;
  }
   else
  {
   x=0;
   y=0;
  } 
#endif
   
 }
 while (*s!=0);
 
 Set_Cs;
}
/*********************************************************
这是画图函数
**********************************************************/
void LcdWritePictureFromSPI(u8 xStart,u16 yStart,u8 xLong,u16 yLong,u32 BaseAddr)
{
 ColorTypeDef color;
 u32 pixels;
 
 Lcd_SetBox(xStart,yStart,xLong,yLong,0,0);
 Lcd_WR_Start();
 Set_Rs;
 
// SPI_FLASH_CS_LOW();
// SPI_FLASH_SendByte(0x0B);//FSTREAD
// SPI_FLASH_SendByte((BaseAddr & 0xFF0000) >> 16);
// SPI_FLASH_SendByte((BaseAddr& 0xFF00) >> 8);
// SPI_FLASH_SendByte(BaseAddr & 0xFF);
// SPI_FLASH_SendByte(0);//Dummy_Byte
 
 SPI2->DR = 0;//Dummy_Byte
 while((SPI2->SR & SPI_I2S_FLAG_RXNE) == (u16) RESET);
 color.U8[1] = SPI2->DR; 
 
 SPI2->DR = 0;//Dummy_Byte
 
 for (pixels=0; pixels<(xLong*yLong); pixels++)
 {


  while((SPI2->SR & SPI_I2S_FLAG_RXNE) == (u16) RESET);
  color.U8[0] = SPI2->DR;
  
  SPI2->DR = 0;//Dummy_Byte
  
  DataToWrite(color.U16);
  Clr_nWr;
  Set_nWr;
  
  while((SPI2->SR & SPI_I2S_FLAG_RXNE) == (u16) RESET);
  color.U8[1] = SPI2->DR;
  
  SPI2->DR = 0;//Dummy_Byte
 }


// SPI_FLASH_CS_HIGH();
 Set_Cs; 
}
/**************************************************************************************
* 名    称: DrawSingleAscii
* 功    能: 在指定的位置单个字符
* 参    数: x           : x坐标
*                       y         : y坐标
*               LineColor : 字符的颜色
*           FillColor   : 字符背景颜色
* 返 回 值: 无
*
* 修改历史:
*   版本    日期     作者     改动内容和原因
*   ----------------------------------------------------
*   1.0   2007.6.13  lcf       基本的功能完成
**************************************************************************************/
void DrawSingleAscii(u8 x, u8 y, u16 *pAscii,u16 CharColor,u16 CharBackColor )
{
    u8 i, j;
    u8 str;
    u16 OffSet;


    OffSet = (*pAscii - 32)*16;


    for (i=0;i<16;i++)
    {
        Set_ramaddr(x,y+i);
        DataToWrite(0x22);
        str = *(AsciiLib + OffSet + i); 
        for (j=0;j<8;j++)
        {
            if ( str & (0x80>>j) )     //0x80>>j
            {
                DataToWrite((u16)(CharColor&0xffff));
            }
            else
            {
              // if (NORMAL == Mod)
                //    DataToWrite((u16)(CharBackColor&0xffff));
              //  else
              //  {
                   Set_ramaddr(x+j+1,y+i);
                    DataToWrite(0x22); 
                //}
            }              
        }
    }
}
/*********************************************************
函数名:SPI取ASCII码子程序
输入参数:u8 ASCII 输入的ASCII码,如'A'
          BaseAddr 基址 即ASCII显示代码在FLASH中的启示位置
返回值:无
说明:输入一个ASCII码,取得它在SPI FLASH中的16Byte显示代码
并将其存放到一个16byte的ASCII显示缓冲CharBuffer[]中
**********************************************************/
void GetASCIICode(u8* pBuffer,u8 ASCII,u32 BaseAddr)
{  u8 i;
   for(i=0;i<16;i++)
    *(pBuffer+i)=*(AsciiLib + (ASCII - 32)*16 + i);//    OffSet = (*pAscii - 32)*16;


 // SPI_FLASH_BufferRead(pBuffer,BaseAddr+16*ASCII,16);


}
/*********************************************************
函数名:SPI中文显示码子程序
输入参数:u16 ASCII 输入的中文,如"我"
          BaseAddr 基地 即显示代码在FLASH中的起始位置
返回值:无
说明:输入一个中文,取得它在SPI FLASH中的32Byte显示代码
并将其存放到一个32byte的显示缓冲ChineseBuffer[]
**********************************************************/
void GetChineseCode(u8* pBuffer,u16 ChineseCode,u32 BaseAddr)
{
 
  u8 High8bit,Low8bit,i;
  u16 temp;
 
 // temp=ChineseCode-0xA0A0;//算出汉字区位码
  temp=ChineseCode;
  High8bit=(temp>>8);
  Low8bit=(temp&0x00FF);
 
//  for(i=0;i<32;i++)
//      *(pBuffer+i)= *(HzLib + 32*((High8bit-0xb0)*94+Low8bit-0xa1) + i);
//  SPI_FLASH_BufferRead(pBuffer,BaseAddr+32*((High8bit-1)*94+Low8bit-1),32);


}
void Get320240PictureCode(u8* pBuffer,u32 BufferCounter,u32 BaseAddr)
{
 //   SPI_FLASH_BufferRead(pBuffer,BaseAddr+BufferCounter*32,32);
}


void Delay_nms(int n)
{
 
  u32 f=n,k;
  for (; f!=0; f--)
  {
    for(k=0xFFF; k!=0; k--);
  }
 
}
void DrawPixel(u8 x, u8 y, int Color)
{
 Lcd_SetCursor(x,y);
    Lcd_WR_Start();
 Set_Rs;
    DataToWrite(Color);
 Clr_nWr;
 Set_nWr;
 Set_Cs;
}
void DispPic240_320(const unsigned char *str)
{


 u32 temp;
 ColorTypeDef color;
 Lcd_SetCursor(0x00, 0x0000);
 LCD_WR_REG(0x0050,0x00);//水平 GRAM起始位置
 LCD_WR_REG(0x0051,100);//水平GRAM终止位置    239
 LCD_WR_REG(0x0052,0);//垂直GRAM起始位置
 LCD_WR_REG(0x0053,100);//垂直GRAM终止位置    319
 Lcd_WR_Start();
 Set_Rs;
 
 for (temp = 0; temp < 240*320; temp++)
 { 
  color.U8[1] =*(unsigned short *)(&str[ 2 * temp]);
  color.U8[0]=*(unsigned short *)(&str[ 2 * temp+1]);
  //DataToWrite(i);
 
  DataToWrite(color.U16);
  Clr_nWr;
  Set_nWr;
 }


//============================== 
}
void test_color(){
  u8  R_data,G_data,B_data,i,j;


 Lcd_SetCursor(0x00, 0x0000);
 LCD_WR_REG(0x0050,0x00);//水平 GRAM起始位置
 LCD_WR_REG(0x0051,239);//水平GRAM终止位置
 LCD_WR_REG(0x0052,0);//垂直GRAM起始位置
 LCD_WR_REG(0x0053,319);//垂直GRAM终止位置  
 Lcd_WR_Start();
 Set_Rs;
    R_data=0;G_data=0;B_data=0;    
    for(j=0;j<50;j++)//红色渐强条
    {
        for(i=0;i<240;i++)
            {R_data=i/8;DataToWrite(R_data<<11|G_data<<5|B_data);
   Clr_nWr;Set_nWr;}
    }
    R_data=0x1f;G_data=0x3f;B_data=0x1f;
    for(j=0;j<50;j++)
    {
        for(i=0;i<240;i++)
            {
            G_data=0x3f-(i/4);
            B_data=0x1f-(i/8);
            DataToWrite(R_data<<11|G_data<<5|B_data);
   Clr_nWr;
   Set_nWr;
   }
    }
//----------------------------------
   R_data=0;G_data=0;B_data=0;
    for(j=0;j<50;j++)//绿色渐强条
    {
        for(i=0;i<240;i++)
            {G_data=i/4;
   DataToWrite(R_data<<11|G_data<<5|B_data);
   Clr_nWr;
   Set_nWr;}
    }


    R_data=0x1f;G_data=0x3f;B_data=0x1f;
    for(j=0;j<50;j++)
    {
        for(i=0;i<240;i++)
            {
            R_data=0x1f-(i/8);
            B_data=0x1f-(i/8);
            DataToWrite(R_data<<11|G_data<<5|B_data);
   Clr_nWr;
   Set_nWr;
  }
    }
//----------------------------------
 
    R_data=0;G_data=0;B_data=0;
    for(j=0;j<60;j++)//蓝色渐强条
    {
        for(i=0;i<240;i++)
            {B_data=i/8;DataToWrite(R_data<<11|G_data<<5|B_data);
   Clr_nWr;
   Set_nWr;}
    }


    B_data=0;
    R_data=0x1f;G_data=0x3f;B_data=0x1f;


    for(j=0;j<60;j++)
    {
        for(i=0;i<240;i++)
            {
            G_data=0x3f-(i/4);
            R_data=0x1f-(i/8);
            DataToWrite(R_data<<11|G_data<<5|B_data);
   Clr_nWr;
   Set_nWr;
  }
    }  
 Set_Cs;

//====================================================================================
/*
void DrawSingleAscii(u16 x, u16 y, u8 *pAscii, u16 LineColor,u16 FillColor, u8 Mod)
{
    u8 i, j;
    u8 str;
    u16 OffSet;


 Lcd_SetCursor(0x00, 0x0000);
 LCD_WR_REG(0x0050,0x00);//水平 GRAM起始位置
 LCD_WR_REG(0x0051,239);//水平GRAM终止位置
 LCD_WR_REG(0x0052,0);//垂直GRAM起始位置
 LCD_WR_REG(0x0053,319);//垂直GRAM终止位置
 Lcd_WR_Start();
 Set_Rs;


    OffSet = (*pAscii - 32)*16;
    for (i=0;i<16;i++)
    {
        Lcd_SetCursor(x,y+i);
        Lcd_WR_Start();
  Set_Rs;


        str = *(AsciiLib + OffSet + i); 
        for (j=0;j<8;j++)
        {
            if ( str & (0x80>>j) )     //0x80>>j
            {
                DataToWrite((u16)(LineColor&0xffff));
    Clr_nWr;
    Set_nWr;
            }
            else
            {
                if (NORMAL == Mod)
                    DataToWrite((u16)(FillColor&0xffff));
     Clr_nWr;
     Set_nWr;
                else
                {
                    Lcd_SetCursor(x+j+1,y+i);
                    Lcd_WR_Start();
     Set_Rs;
                }
            }              
        }
    }
}
 */
/**************************************************************************************
* 名    称: DispSmallPic
* 功    能: 在指定的位置显示一张65K色的图片
* 参    数: str     : 图片数组名
* 返 回 值: 无
*
* 修改历史:
*   版本    日期     作者     改动内容和原因
*   ----------------------------------------------------
*   1.0   2007.6.13  lcf       基本的功能完成
**************************************************************************************/
/*void DispSmallPic(u8 x, u16 y , u16 w, u16 h,u32 picdata)
{
    u16 i,j,temp;
    for(j=0;j<h;j++)
    {
        Set_ramaddr(x,y+j);
        DataToWrite(0x22);
        for(i=0;i<w;i++)
        {   //send_data(*(unsigned short *)(&str[(j*w+i)*2]));       //高位在前
            temp=str[(j*w+i)*2+1]<<8;     //低位在前
            temp|=str[(j*w+i)*2];
            DataToWrite(temp);
        }
    }
}
void Set_ramaddr(u8 x,u16 y)
{
    LCD_WR_REG(0x004f,y);        //行首址
 LCD_WR_REG(0x004e,x);        //列首址
}   */


  /**************************************************************************************
* 名    称: DispSmallPic
* 功    能: 在指定的位置显示一张65K色的图片
* 参    数: str     : 图片数组名
* 返 回 值: 无
*
* 修改历史:
*   版本    日期     作者    
*   ----------------------------------------------------
*
**************************************************************************************/
/*void DispSmallPic(u16 x, u16 y, u16 w, u16 h, const unsigned char *str)
{ //x:x轴坐标  y:y坐标  w:宽  h:高  str:像素
    u16 i,j,temp;
    for(j=0;j<h;j++)
    {
        Set_ramaddr(x,y+j);
        DataToWrite(0x22);
        for(i=0;i<w;i++)
        { // wr_dat(*(unsigned short *)(&str[(j*w+i)*2]));       //高位在前
            temp=str[(j*w+i)*2+1]<<8;     //低位在前
            temp|=str[(j*w+i)*2];
            DataToWrite(temp);
        }
    }
}  */
 /**************************************************************************************
* 名    称:
* 功    能:
* 参    数:
* 返 回 值:   
**************************************************************************************/
void Set_ramaddr(u16 x,u16 y)
{
    LCD_WR_REG(0x004f,y);        //行首址
 LCD_WR_REG(0x004e,x);        //列首址
}

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
2
关闭 站长推荐上一条 /1 下一条