2
本帖最后由 小芸芸 于 2013-8-28 23:38 编辑
现在的ITL9341网上的资料比较少,现上传个调试OK的程序和大家分享下。
#include "STC15F2KXX.H"
#include "LCD.H"
#include
void Delay_ms(u16 k)
{
u16 i,q;
for(q=0;q
{
i =800;
while (--i);
}
}
void LCD_WRITE_CMD(u16 _DATA) //写命令
{
LCD_RS=0;
LCD_RD=1;
LCD_WR=1;
LCD_CS=0;
LCD_DATA_L=_DATA;
LCD_DATA_H=_DATA>>8;
LCD_WR=0;
LCD_WR=1;
LCD_CS=1;
}
void LCD_WRITE_DATA(u16 _DATA) //写数据
{
LCD_RS=1;
LCD_RD=1;
LCD_WR=1;
LCD_CS=0;
LCD_DATA_L=_DATA; //低8位
LCD_DATA_H=_DATA>>8; //高8位
LCD_WR=0;
LCD_WR=1; //高跳变写入
LCD_CS=1;
}
void LCD_INIT()
{
LCD_VCC = 0; Delay_ms(1); //电源控制
LCD_RST=1; Delay_ms(1); //复位
LCD_RST=0; Delay_ms(120);
LCD_RST=1; Delay_ms(10);
LCD_WRITE_CMD(0xCF);//写命令
LCD_WRITE_DATA(0x00);//写数据,参数
LCD_WRITE_DATA(0xC3); //0xC1
LCD_WRITE_DATA(0x30);
LCD_WRITE_CMD(0xED);
LCD_WRITE_DATA(0x64); LCD_WRITE_DATA(0x03);
LCD_WRITE_DATA(0x12); LCD_WRITE_DATA(0x81);
LCD_WRITE_CMD(0xE8);
LCD_WRITE_DATA(0x85); LCD_WRITE_DATA(0x00); //0x10
LCD_WRITE_DATA(0x78); //0x7A
LCD_WRITE_CMD(0xCB);
LCD_WRITE_DATA(0x39); LCD_WRITE_DATA(0x2C);
LCD_WRITE_DATA(0x00); LCD_WRITE_DATA(0x34);
LCD_WRITE_DATA(0x02);
LCD_WRITE_CMD(0xF7);
LCD_WRITE_DATA(0x20);
LCD_WRITE_CMD(0xEA);
LCD_WRITE_DATA(0x00); LCD_WRITE_DATA(0x00);
LCD_WRITE_CMD(0xB1);
LCD_WRITE_DATA(0x00); LCD_WRITE_DATA(0x1B);
LCD_WRITE_CMD(0xB6);
LCD_WRITE_DATA(0x0A); LCD_WRITE_DATA(0xE2);
LCD_WRITE_CMD(0xC0);
LCD_WRITE_DATA(0x1D); //0x21
LCD_WRITE_CMD(0xC1);
LCD_WRITE_DATA(0x10); //0x11
LCD_WRITE_CMD(0xC5);
LCD_WRITE_DATA(0x3F); LCD_WRITE_DATA(0x3C);
LCD_WRITE_CMD(0xC7);
LCD_WRITE_DATA(0x81); //81-FF
LCD_WRITE_CMD(0xF2);
LCD_WRITE_DATA(0x00);
LCD_WRITE_CMD(0x26);
LCD_WRITE_DATA(0x01);
LCD_WRITE_CMD(0xE0);
LCD_WRITE_DATA(0x0F); LCD_WRITE_DATA(0x23);
LCD_WRITE_DATA(0x1F); LCD_WRITE_DATA(0x0B);
LCD_WRITE_DATA(0x0E); LCD_WRITE_DATA(0x08);
LCD_WRITE_DATA(0x4B); LCD_WRITE_DATA(0xA8);
LCD_WRITE_DATA(0x3B); LCD_WRITE_DATA(0x0A);
LCD_WRITE_DATA(0x14); LCD_WRITE_DATA(0x06);
LCD_WRITE_DATA(0x10); LCD_WRITE_DATA(0x09);
LCD_WRITE_DATA(0x00);
LCD_WRITE_CMD(0xE1);
LCD_WRITE_DATA(0x00); LCD_WRITE_DATA(0x1C);
LCD_WRITE_DATA(0x20); LCD_WRITE_DATA(0x04);
LCD_WRITE_DATA(0x10); LCD_WRITE_DATA(0x08);
LCD_WRITE_DATA(0x34); LCD_WRITE_DATA(0x47);
LCD_WRITE_DATA(0x44); LCD_WRITE_DATA(0x05);
LCD_WRITE_DATA(0x0B); LCD_WRITE_DATA(0x09);
LCD_WRITE_DATA(0x2F); LCD_WRITE_DATA(0x36);
LCD_WRITE_DATA(0x0F);
LCD_WRITE_CMD(0x36); //set the model of scanning
LCD_WRITE_DATA(0xE8); //0xE8 水平320 0x88 水平240
LCD_WRITE_CMD(0x3A);
LCD_WRITE_DATA(0x55); //16pixel
LCD_WRITE_CMD(0x11);
Delay_ms(120);
LCD_WRITE_CMD(0x29);
}
void LCD_XY(u16 start_column, u16 end_column, u16 start_page, u16 end_page) //设置开始行,列地址
{
LCD_WRITE_CMD(0X2A);
LCD_WRITE_DATA(start_column >> 8);
LCD_WRITE_DATA(start_column & 0xff);
LCD_WRITE_DATA(end_column >> 8);
LCD_WRITE_DATA(end_column & 0xff);
LCD_WRITE_CMD(0X2B);
LCD_WRITE_DATA(start_page >> 8);
LCD_WRITE_DATA(start_page & 0xff);
LCD_WRITE_DATA(end_page >> 8);
LCD_WRITE_DATA(end_page & 0xff);
}
void LCD_CLS_COLOR(u16 Color) //整屏充色
{
u16 _i,_j;
LCD_XY(0,319,0,239);
LCD_WRITE_CMD(0x2C);
for(_i=0;_i<240;_i++)//x
{
for(_j=0;_j<320;_j++)//y
{
LCD_WRITE_DATA(Color);
}
}
}
void LCD_xyzuobiao(u16 Xpos, u16 Ypos) //设置X,Y坐标
{
LCD_XY(Xpos, Xpos, Ypos, Ypos);
}
//指定的坐标画点 //x:0~239 //y:0~319 //Color:此点的颜色
void LCD_SetPoint(u16 x,u16 y,u16 Color)
{
LCD_xyzuobiao(x,y); //设置光标位置
LCD_WRITE_CMD(0x2C); //写入GRAM前命令
LCD_WRITE_DATA(Color);
}
//指定坐标画一条垂直长度为CD的线,第3个参数为线的颜色
void LCD_cuizhi(u16 x1, u16 y1, u16 cd,u16 Color)
{
u16 _j,_i=y1;
for(_j=0;_j
{
LCD_SetPoint(x1,_i,Color);
_i++;
}
}
//指定坐标画一条水平长度为CD的线,第3个参数为线的颜色
void LCD_shuiping(u16 x1, u16 y1, u16 cd,u16 Color)
{
u16 _j,_i=x1;
for(_j=0;_j
{
LCD_SetPoint(_i,y1,Color);
_i++;
}
}
/*****************************************************************/
/*****************************************************************/
//在指定位置画一个指定大小的圆
// (x,y):中心点
// r :半径
// u16 color:颜色
void LCD_huayuan(u16 x0,u16 y0,u8 r,u16 Color)
{
int a,b;
int di;
a=0;b=r;
di=3-(r<<1); //判断下个点位置的标志
while(a<=b)
{
LCD_SetPoint(x0-b,y0-a,Color); //3
LCD_SetPoint(x0+b,y0-a,Color); //0
LCD_SetPoint(x0-a,y0+b,Color); //1
LCD_SetPoint(x0-b,y0-a,Color); //7
LCD_SetPoint(x0-a,y0-b,Color); //2
LCD_SetPoint(x0+b,y0+a,Color); //4
LCD_SetPoint(x0+a,y0-b,Color); //5
LCD_SetPoint(x0+a,y0+b,Color); //6
LCD_SetPoint(x0-b,y0+a,Color);
a++;
if(di<0)di +=4*a+6; //使用Bresenham算法画圆
else
{
di+=10+4*(a-b);
b--;
}
LCD_SetPoint(x0+a,y0+b,Color);
}
}
void LCD_hanzi(u16 x, u16 y,u16 PenColor,u16 BackColor,u8 HZ[],u8 Number) //填充法写汉字,相对打点方法要快
{
u8 i,j,temp;
LCD_XY(x,x+15,y,y+15);//设置行列开始地址
LCD_WRITE_CMD(0x2C);
for(i=0; i<32; i++)
{
temp = HZ[Number*32+i];
for(j=0; j<8; j++)
{
if((temp&0x80)==0x80)
LCD_WRITE_DATA(PenColor);
else
LCD_WRITE_DATA(BackColor);
temp=temp<<1;
}
}
}
void LCD_suzi(u16 x, u16 y,u16 PenColor,u16 BackColor,u8 SZ[],u8 Number)
{
u8 i,j,temp; //横向取模方式
LCD_XY(x,x+7,y,y+15); //设置行列开始地址
LCD_WRITE_CMD(0x2C);
for(i=0; i<16; i++)
{
temp=SZ[Number*16+i];
for(j=0; j<8; j++)
{
if((temp&0x80)==0x80)
LCD_WRITE_DATA(PenColor);
else
LCD_WRITE_DATA(BackColor);
temp=temp<<1;
}
}
}
void LCD_Image(u16 xS, u16 xE,u16 yS,u16 yE,u8 Tp[])
{
u16 i,j,temp;
u32 k=0;
LCD_XY(xS,xE,yS,yE); //图片大小
LCD_WRITE_CMD(0x2C);
for(i=0; i
{
for(j=0; j
{
temp = ((u16)Tp[k]<<8)|Tp[k+1];
k += 2;
LCD_WRITE_DATA(temp);
}
}
}
|
|