#include "lcd.h"
unsigned short int BACK_COLOR, POINT_COLOR; //背景色,画笔色
unsigned short int LCD_Unicode_32[LCD_NUM_CHAR]={0}; //Unicode编码
unsigned char LCD_32_DispData[LCD_NUM_CHAR][132]={0}; //字库显示点阵数据
unsigned char LCD_32_DispWide; //字库字符宽度
#define LCD_HIDECOLOR BLACK //图片叠加时需要掩盖的颜色
/*********************************************************
函数名: LCD_Initcmmd
描 述: LCD初始化
输入值: 无
输出值: 无
返回值: 无
**********************************************************/
void LCD_Initcmmd(void)
{
LCDSPI_CS_LOW;
LCD_RES_LOW;
Delay_100us(200);
LCD_RES_HIGH;
Delay_100us(200);
//************* Start Initial Sequence **********//
SPIWriteCmmd(0x36);
SPIsenddata(0x00);
SPIWriteCmmd(0x3A);
SPIsenddata(0x05);
SPIWriteCmmd(0xB2);
SPIsenddata(0x0C);
SPIsenddata(0x0C);
SPIsenddata(0x00);
SPIsenddata(0x33);
SPIsenddata(0x33);
SPIWriteCmmd(0xB7);
SPIsenddata(0x35);
SPIWriteCmmd(0xBB);
SPIsenddata(0x19);
SPIWriteCmmd(0xC0);
SPIsenddata(0x2C);
SPIWriteCmmd(0xC2);
SPIsenddata(0x01);
SPIWriteCmmd(0xC3);
SPIsenddata(0x12);
SPIWriteCmmd(0xC4);
SPIsenddata(0x20);
SPIWriteCmmd(0xC6);
SPIsenddata(0x0F);
SPIWriteCmmd(0xD0);
SPIsenddata(0xA4);
SPIsenddata(0xA1);
SPIWriteCmmd(0xE0);
SPIsenddata(0xD0);
SPIsenddata(0x04);
SPIsenddata(0x0D);
SPIsenddata(0x11);
SPIsenddata(0x13);
SPIsenddata(0x2B);
SPIsenddata(0x3F);
SPIsenddata(0x54);
SPIsenddata(0x4C);
SPIsenddata(0x18);
SPIsenddata(0x0D);
SPIsenddata(0x0B);
SPIsenddata(0x1F);
SPIsenddata(0x23);
SPIWriteCmmd(0xE1);
SPIsenddata(0xD0);
SPIsenddata(0x04);
SPIsenddata(0x0C);
SPIsenddata(0x11);
SPIsenddata(0x13);
SPIsenddata(0x2C);
SPIsenddata(0x3F);
SPIsenddata(0x44);
SPIsenddata(0x51);
SPIsenddata(0x2F);
SPIsenddata(0x1F);
SPIsenddata(0x1F);
SPIsenddata(0x20);
SPIsenddata(0x23);
SPIWriteCmmd(0x21);
SPIWriteCmmd(0x11);
//Delay (120);
SPIWriteCmmd(0x29);
}
/*********************************************************
函数名: LCD_32Fontlib
描 述: 读FLASH芯片字库数据并显示 中英文字符通用,
输入值: *unicode 字符unicode编码
num 字符个数
arae 显示区域(1、2、3、4象限)
Flag 是否叠加显示 1:叠加 0:不叠加
输出值: 无
返回值: 无
**********************************************************/
void LCD_32Fontlib(unsigned short int *unicode,unsigned char num,unsigned char arae,unsigned char Flag)
{
unsigned char LCD_32_DispList[LCD_NUM_CHAR][8]={0}; //字库检索表信息
unsigned char i,j,flag=0,flag1=0;
unsigned int add=0,adder=0;
unsigned short int X_Axis,Y_Axis;
switch(arae)
{
case 1: //第一象限坐标
X_Axis=142;
Y_Axis=75;
break;
case 2: //第二象限坐标
X_Axis=28;
Y_Axis=75;
break;
case 3: //第三象限坐标
X_Axis=28;
Y_Axis=283;
break;
case 4: //第四象限坐标
X_Axis=142;
Y_Axis=283;
break;
default:
break;
}
for(i=0;i<num;i++)
{
add=(unicode[i]-0x20)*4+0x18; //计算点阵信息起始地址
T25S40_ReadData(add,&LCD_32_DispList[i][0],8); //读点阵信息数据(检索表)
for(j=0;j<8;j++)
{
if(LCD_32_DispList[i][j]==0xff) //判断信息是否有误(存在读回信息全部为0或ff的情况)
{
flag++;
}
else if(LCD_32_DispList[i][j]==0x00)
{
flag1++;
}
}
if(flag>=6||flag1>=6)
{
flag=0;
flag1=0;
i--;
}
}
for(i=0;i<num;i++)
{ //计算点阵数据信息 低位在前 高6位为字符宽度 低26位为点阵数据偏移地址
adder=(unsigned int)(LCD_32_DispList[i][7]<<24)|(unsigned int)(LCD_32_DispList[i][6]<<16)|(unsigned int)(LCD_32_DispList[i][5]<<8)|LCD_32_DispList[i][4];
LCD_32_DispWide=(unsigned char)(adder>>26); //字符宽度
LCD_32_DispWide=(LCD_32_DispWide<16&&LCD_32_DispWide>8)?16:LCD_32_DispWide; //字符宽度信息保存到字符数据最后一位 个别英文字符和数字不是标准16位宽度
adder=adder&0x03ffffff; //计算点阵数据起始地址
T25S40_ReadData(adder,&LCD_32_DispData[i][0],32*((LCD_32_DispWide+7)/8)+4); //点阵数据长度=点阵高度*((点阵宽度+8-1)/8)
for(j=0;j<100;j++) //后面加4为每次读取前4字节为0或ff
{
if(LCD_32_DispList[i][j]==0xff)
{
flag++;
}
}
if(flag>=90)
{
flag=0;
i--;
}
}
LCD_ContinuousDisp_32Char(&LCD_32_DispData[0],X_Axis,Y_Axis,num,Flag); //显示函数
}
/*********************************************************
函数名: LCD_IconDisp
描 述: 图标显示(点阵显示方式)
输入值: *psr 图标显示数据
arae 显示区域(1、2、3、4象限)
color 图标显示颜色
Flag 是否叠加显示 1:叠加 0:不叠加
输出值: 无
返回值: 无
**********************************************************/
void LCD_IconDisp(const unsigned char *psr,unsigned char Length,unsigned char Width,unsigned char arae,unsigned short int color,unsigned char flag)
{
// unsigned int add,adder;
// unsigned char list[9]={0};
unsigned short int X_Axis,Y_Axis;
switch(arae)
{
case 1: //第一象限坐标
X_Axis=142;
Y_Axis=12;
break;
case 2: //第二象限坐标
X_Axis=28;
Y_Axis=12;
break;
case 3: //第三象限坐标
X_Axis=28;
Y_Axis=218;
break;
case 4: //第四象限坐标
X_Axis=142;
Y_Axis=218;
break;
default:
break;
}
// add=num*5;
// for(i=0;i<1;i++)
// {
// T25S40_ReadData(add,&list[0],9);
// if(list[4]==num)
// {
//// LCD_Cache=(unsigned char*)malloc(sizeof(list[5]/8*list[6]+4));
//// adder=list[8]*256+list[7]+0x5a;
//// T25S40_ReadData(adder,&LCD_Cache[0],list[5]/8*list[6]+4);
// }
// else
// {
// i--;
// }
// }
// LCD_DispAll_Char(&Shadow_6464[0],list[6],list[5],X_Axis+(32-list[5]/2),Y_Axis+(32-list[6]/2),0x571a,1); //阴影
LCD_DispAll_Char(&psr[0],Width,Length,X_Axis+(32-Length/2),Y_Axis+(32-Width/2),color,flag); //显示函数
}
/*********************************************************
函数名: LCD_Address_set
描 述: 显示窗口设置
输入值: x1 显示起点x坐标
y1 显示起点y坐标
x2 显示终点x坐标
y2 显示终点y坐标
返回值: 无
**********************************************************/
void LCD_Address_set(unsigned short int x1,unsigned short int y1,unsigned short int x2,unsigned short int y2)
{
unsigned char rgb_data[4]={0x00};
SPIWriteCmmd(0x2a); //设置命令
rgb_data[0]=x1>>8; //拆分显示坐标
rgb_data[1]=x1;
rgb_data[2]=x2>>8;
rgb_data[3]=x2;
SPIWriteData(&rgb_data[0],4); //SPI发送数据
memset(rgb_data,0,sizeof(rgb_data));
SPIWriteCmmd(0x2b); //设置命令
rgb_data[0]=y1>>8;
rgb_data[1]=y1;
rgb_data[2]=y2>>8;
rgb_data[3]=y2;
SPIWriteData(&rgb_data[0],4);
SPIWriteCmmd(0x2c);
}
//取模方式 水平扫描 从左到右 低位在前
/*********************************************************
函数名: LCD_ShowImage
描 述: 显示图片
输入值: *p 图片数据
Length 图片像素长度
Width 图片像素宽度
X_Axis 显示X轴起始坐标
Y_Axis 显示Y轴起始坐标
Flag 是否叠加显示 (1: 叠加 0: 不叠加)
输出值: 无
返回值: 无
**********************************************************/
void LCD_ShowImage(const unsigned char *p,unsigned char Length,unsigned char Width,unsigned short int X_Axis,unsigned short int Y_Axis,unsigned char Flag) //
{
unsigned short int i,Temp;
unsigned char Color_H,Color_L,X_Axis_Temp=0,Y_Axis_Temp=0;
LCD_Address_set(X_Axis,Y_Axis,X_Axis+Length-1,Y_Axis+Width-1); //坐标设置
for(i=0;i<Length*Width;i++)
{
Color_H=p[i*2]; //提取显示数据(图片颜色数据)
Color_L=p[i*2+1];
Temp=Color_H*256+Color_L;
if(Flag==1)
{
if(Temp!=LCD_HIDECOLOR) //叠加方式
{
LCD_DrawPointx(X_Axis+X_Axis_Temp,Y_Axis+Y_Axis_Temp,Temp); //画点