|
楼主 |
发表于 2010-5-6 14:04:57
|
显示全部楼层
首先 发一个以SSD1289作为主控芯片的 320*240驱动代码
/*
* 作者:林杰
* 文件名称:SSD1289驱动模块
* 创建日期:2010年3月28日
* 最后修改:2010年3月29日
* 文件功能:实现SSD1289液晶模块的驱动函数
* 内有单点写汉字,多点写汉字,显示图片等函数
*/
#ifndef SSD1289_QUDONG_H_
#define SSD1289_QUDONG_H_
#define uchar unsigned char
#define uint unsigned int
void out_init()
{
CS_H;
RS_H;
WR_H;
RD_H;
RST_H;
}
//刷屏开始函数
void LCD_write_start()
{
RS_L;
WR_L;
LCD_DATA=0x0022;//写数据的寄存器地址
CS_L;
CS_H;
RS_H;
}
//刷屏结束函数
void LCD_end()
{
CS_H;
WR_H;
}
//刷屏数据函数
void LCD_write_data(uint data)
{
LCD_DATA=data;
CS_L;
CS_H;
}
//写寄存器函数
void LCD_write_reg(unsigned int index,unsigned int data)
{
RS_L;
WR_L;
CS_L;
LCD_DATA=index;
CS_H;
RS_H;
CS_L;
LCD_DATA=data;
CS_H;
WR_H;
}
/**********************************************
* 函数名称:SSD1289初始化函数 *
* 隶属模块:SSD1289_qudong模块 *
* 参数说明:无
* 返回参数:无 *
***********************************************/
void LCD_init()
{
out_init(); //低电平复位
RST_L;
usleep(10000);
RST_H;
usleep(10000);
LCD_write_reg(0x0000,0x0001); // usleep(10000); //打开晶振
LCD_write_reg(0x0003,0xA8A4); // usleep(10000); //0xA8A4
LCD_write_reg(0x000C,0x0000); // usleep(10000);
LCD_write_reg(0x000D,0x080C); // usleep(10000);
LCD_write_reg(0x000E,0x2B00); // usleep(10000);
LCD_write_reg(0x001E,0x00B0); // usleep(10000);
LCD_write_reg(0x0001,0x2B3F); // usleep(10000); //驱动输出控制320*240 0x6B3F
LCD_write_reg(0x0002,0x0600); // usleep(10000);
LCD_write_reg(0x0010,0x0000); // usleep(10000);
LCD_write_reg(0x0011,0x6070); // usleep(10000); //0x4030 //定义数据格式 16位色
LCD_write_reg(0x0005,0x0000); // usleep(10000);
LCD_write_reg(0x0006,0x0000); // usleep(10000);
LCD_write_reg(0x0016,0xEF1C); // usleep(10000);
LCD_write_reg(0x0017,0x0003); // usleep(10000);
LCD_write_reg(0x0007,0x0233); // usleep(10000); //0x0233
LCD_write_reg(0x000B,0x0000); // usleep(10000);
LCD_write_reg(0x000F,0x0000); // usleep(10000); //扫描开始地址
LCD_write_reg(0x0041,0x0000); // usleep(10000);
LCD_write_reg(0x0042,0x0000); // usleep(10000);
LCD_write_reg(0x0048,0x0000); // usleep(10000);
LCD_write_reg(0x0049,0x013F); // usleep(10000);
LCD_write_reg(0x004A,0x0000); // usleep(10000);
LCD_write_reg(0x004B,0x0000); // usleep(10000);
LCD_write_reg(0x0044,0xEF00); // usleep(10000);
LCD_write_reg(0x0045,0x0000); // usleep(10000);
LCD_write_reg(0x0046,0x013F); // usleep(10000);
LCD_write_reg(0x0030,0x0707); // usleep(10000);
LCD_write_reg(0x0031,0x0204); // usleep(10000);
LCD_write_reg(0x0032,0x0204); // usleep(10000);
LCD_write_reg(0x0033,0x0502); // usleep(10000);
LCD_write_reg(0x0034,0x0507); // usleep(10000);
LCD_write_reg(0x0035,0x0204); // usleep(10000);
LCD_write_reg(0x0036,0x0204); // usleep(10000);
LCD_write_reg(0x0037,0x0502); // usleep(10000);
LCD_write_reg(0x003A,0x0302); // usleep(10000);
LCD_write_reg(0x003B,0x0302); // usleep(10000);
LCD_write_reg(0x0023,0x0000); // usleep(10000);
LCD_write_reg(0x0024,0x0000); // usleep(10000);
LCD_write_reg(0x0025,0x8000); // usleep(10000);
LCD_write_reg(0x004e,0); //行首址0
LCD_write_reg(0x004f,0); //列首址0
}
void LCD_SetXY(unsigned int x, unsigned int y)
{
LCD_write_reg(0x004f,x); //设置行显示地址
LCD_write_reg(0x004e,y); //设置列显示地址
}
//4e,4f寄存器分别表示区域的横坐标起止地址,45,46寄存器分别表纵坐标的起止地址
//此函数设置显示区域的位置
void LCD_SetWindow(uint startX,uint startY,uint endX,uint endY)
{
LCD_SetXY(startX,startY);
LCD_write_reg(0x004e,startX);
LCD_write_reg(0x004f,startY);
LCD_write_reg(0x0045,endX);
LCD_write_reg(0x0046,endY);
}
//4e,4f寄存器分别表示区域的横坐标起止地址,45,46寄存器分别表纵坐标的起止地址
//此函数设置显示为全屏函数
void LCD_SetWindowToFullScreen()
{
LCD_SetXY(0,0);
LCD_write_reg(0x004e,0x0000);
LCD_write_reg(0x004f,0x0000);
LCD_write_reg(0x0045,0x00ef);
LCD_write_reg(0x0046,0x013f);
}
//清屏函数
void LCD_ClearScreen(uint color)
{
unsigned long n = 240*320;
LCD_SetWindowToFullScreen();
LCD_write_start();
while(n--)
LCD_write_data(color);
LCD_end();
}
//测试函数,测试屏的好坏
void LCD_test()
{
unsigned int i,j;
LCD_SetWindowToFullScreen(); //设置为全屏显示
LCD_write_start();
for(i=0;i<320;i++)
for(j=0;j<240;j++)
{
if(i>279) LCD_write_data(0xffff);
else if(i>239) LCD_write_data(0x001f);
else if(i>199) LCD_write_data(0x07e0);
else if(i>159) LCD_write_data(0x07ff);
else if(i>119) LCD_write_data(0xf800);
else if(i>79) LCD_write_data(0xf81f);
else if(i>39) LCD_write_data(0xffe0);
else LCD_write_data(0xffff);
}
LCD_end();
}
/**********************************************
* 函数名称:图片显示函数 此函数只能显示565格式的BMP图片
* 对于SD卡中的555格式的图片无效 *
* 隶属模块:SSD1289_qudong模块 *
* 参数说明:x->横坐标 *
* y->纵坐标 *
* xSize->图片宽度 *
* ySize->图片的高度 *
* code->存放图片首地址 *
* 返回参数:无 *
***********************************************/
void LCD_Write_Picture(uchar x,uchar y,uchar xSize,uint ySize,uchar code[])
{
unsigned int i;
unsigned char j;
unsigned long m=54;
unsigned int color;
for(i=0;i<ySize;i++)
{
LCD_SetWindow(x,y+i,x+xSize-1,y+i);
LCD_write_start();
for(j=0;j<xSize;j++)
{
color=code[m++];
color=color<<8;
color=color|code[m++];
LCD_write_data(color);
}
LCD_end();
}
}
/**********************************************
* 函数名称:汉字显示函数 *
* 隶属模块:SSD1289_qudong模块
* 参数说明:x->横坐标 *
* y->纵坐标 *
* xNum->字符一行的点阵数/8 *
* yNum->字符行数;如16点阵字符=16 *
* code->存放汉字首地址 *
* front->字体色 *
* back->背景色 *
* 出口参数:无 *
* 此函数只能显示横竖都为8的整数倍,且横竖坐标都必须相等*
***********************************************/
void LCD_Write_Chinese(uchar x,uint y,uchar xNum,uchar yNum,uchar code[],uint front,uint back)
{
unsigned char i,j,k;
unsigned char data,data_buffer;
for(i=0;i<yNum;i++)
{
LCD_SetWindow(x,y+i,x+(xNum-1),y+i);//设置显示区域
LCD_write_start();
for(j=0;j<(xNum/8);j++)
{
data=code[(i*(yNum/8))+j];
for(k=0;k<8;k++)
{
data_buffer=data&0x80;
if(data_buffer==0x00)
{
LCD_write_data(back); //背景色
}
else
{
LCD_write_data(front);
}
data<<=1; //左移一位
}
}
}
LCD_end();
}
/**********************************************
* 函数名称:矩形函数 可以用于画直线,限于水平和竖直的直线
* 隶属模块:SSD1289_qudong模块
* 参数说明:x->横坐标 *
* y->纵坐标 *
* xNum->矩形宽度 *
* yNum->矩形高度 *
* color->矩形填充颜色 *
* 出口参数:无 *
***********************************************/
void LCD_Write_juxing(uchar x,uchar y,uchar xSize,uint ySize,uint color)
{
unsigned int i;
unsigned char j;
for(i=0;i<ySize;i++)
{
LCD_SetWindow(x,y+i,x+xSize-1,y+i);
LCD_write_start();
for(j=0;j<xSize;j++)
LCD_write_data(color);
LCD_end();
}
}
/**********************************************
* 函数名称:汉字,字符显示函数 *
* 隶属模块:SSD1289_qudong模块
* 参数说明:x->横坐标 *
* y->纵坐标 *
* xNum->字符一行的点阵数/8 *
* yNum->字符行数; *
* code->存放汉字首地址 *
* front->字体色 *
* back->背景色 *
* 出口参数:无 *
* 此函数能显示任意大小的字体 *
***********************************************/
void LCD_Write_Chinese_1(uchar x,uint y,uchar xNum,uchar yNum,uchar *data,uint front,uint back)
{
unsigned char i,j,k;
unsigned char data_buf,data_send;
for(i=0;i<yNum;i++)
{
LCD_SetWindow(x,y+i,x+(xNum-1),y+i);//设置显示区域
LCD_write_start();
for(j=0;j<xNum;j++)
{
data_buf=*data++;
for(k=0;k<8;k++)
{
data_send=data_buf&0x80;
if(data_send==0x00)
{
LCD_write_data(back); //背景色
}
else
{
LCD_write_data(front);
}
data_buf<<=1; //左移一位
}
}
}
LCD_end();
}
/**********************************************
* 函数名称:汉字串,字符串显示函数 横向写字 *
* 隶属模块:SSD1289_qudong模块
* 参数说明:cout->汉字或者字符串显示个数
* x->横坐标 *
* y->纵坐标 *
* xNum->字符一行的点阵数/8 *
* yNum->字符行数; *
* code->存放汉字首地址 *
* front->字体色 *
* back->背景色 *
* 出口参数:无 *
* 此函数能显示任意大小的字体 *
***********************************************/
void LCD_Write_Chinese_x(uchar cout,uchar x,uint y,uchar xNum,uchar yNum,uchar *data,uint front,uint back)
{
unsigned char i;
for(i=0;i<cout;i++)
LCD_Write_Chinese_1(x+xNum*8*i,y,xNum,yNum,data+i*xNum*yNum,front,back);
}
/**********************************************
* 函数名称:汉字串,字符串显示函数 纵向写字 *
* 隶属模块:SSD1289_qudong模块
* 参数说明:cout->汉字或者字符串显示个数
* x->横坐标 *
* y->纵坐标 *
* xNum->字符一行的点阵数/8 注意不是的X轴有多长,是指的X轴是8的多少倍数
* LCD取模软件是指的以X轴为开始以一个字节一个字节的取模,不足8位数据则补0 *
* yNum->字符行数; *
* code->存放汉字首地址 *
* front->字体色 *
* back->背景色 *
* 出口参数:无 *
* 此函数能显示任意大小的字体 *
***********************************************/
void LCD_Write_Chinese_y(uchar cout,uchar x,uint y,uchar xNum,uchar yNum,uchar *data,uint front,uint back)
{
unsigned char i;
for(i=0;i<cout;i++)
LCD_Write_Chinese_1(x,y+yNum*i,xNum,yNum,data+i*xNum*yNum,front,back);
}
/**********************************************
* 函数名称:SD卡图片显示函数 此函数处理SD卡里面555模式的
* BMP图片,转换成565模式的BMP图片显示
* TFT液晶支持的是565模式 *
* 隶属模块:SSD1289_qudong模块 *
* 参数说明:x->横坐标 *
* y->纵坐标 *
* xSize->图片宽度 *
* ySize->图片的高度 *
* code->存放图片首地址 *
* 返回参数:无 *
***********************************************/
void LCD_Write_Picture_555(uchar x,uchar y,uchar xSize,uint ySize,uchar code[])
{
unsigned int i;
unsigned char j;
unsigned long m=54;
unsigned int color,color1,color2,color3;
for(i=0;i<ySize;i++)
{
LCD_SetWindow(x,y+i,x+xSize-1,y+i);
LCD_write_start();
for(j=0;j<xSize;j++) //进行SD卡555模式转换565模式
{
color1=code[m++];
color=code[m++];
color=color<<9; //取出R颜色
color2=(color1<<1)&0x01e0; //取出G颜色
color3=color1&0x001f; //取出B颜色
color=color|color3|color2; //组合成565模式的色彩
LCD_write_data(color);
}
LCD_end();
}
}
#endif /*SSD1289_QUDONG_H_*/ |
|