/******************************************************************************
* 文件名称: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); //列首址
}
文章评论(0条评论)
登录后参与讨论