S3C6410裸机驱动5'TFT LCD
来源:互联网 发布:md文件编辑器 mac版本 编辑:程序博客网 时间:2024/05/16 08:34
http://blog.csdn.net/cp1300/article/details/7539417
下面是我的液晶屏的时序资料
//代码
//TFT_LCD.C
/*************************************************************************************************************
* 文件名:TFT_LCD.c
* 功能:S3C6410 TFT_LCD底层驱动函数
* 作者:陈鹏
* 创建时间:2012年3月11日15:46
* 最后修改时间:2012年5月6日
* 详细:TFT_LCD初始化以及相关绘图函数
*************************************************************************************************************/
#include"s3c6410_system.h"
#include"tft_lcd.h"
#include"s3c6410_map.h"
#include "ASCII.H"
//显存分辨率
#define LCD_XSIZE800//水平分辨率
#define LCD_YSIZE 480//垂直分辨率
//定义显存
volatile static u16 LCD_BUFFER[LCD_YSIZE][LCD_XSIZE];
const u8 FONT_H[6] = {16,16,13,16,13,16};//对应的字体宽和高
//液晶相关参数 5'TFT 800*480
//时序控制
//括号里面的为LCD时序要求的值,但是实际需要调整
//只要调整LCD_VSPW和LCD_HSPW就可以了
#define LCD_VBPD29//VSBP-VSPW(32-3) 在帧开始处,垂直后沿是不活动行的数量,在垂直同步过程之后
#define LCD_VFPD13//VSFP(13)在帧末尾处,垂直前沿是不活动行的数量,在垂直同步过程之前。
#define LCD_VSPW4//VSPW(3)通过计算不活动行的数量,垂直同步脉冲宽度决定VSYNC 脉冲的高点品宽度。
#define LCD_HBPD40//HSBP-HSPW(88-48)水平后沿是HSYNC 下降沿和有效数据开始之间的VCLK 周期的数量。
#define LCD_HFPD40//HSFP(40)水平前沿是有效数据末端和HSYNC 上升沿之间的VCLK 周期的数量。
#define LCD_HSPW174//HSPW(48)通过计算不VCLK 的数量,水平同步脉冲宽度决定HSYNC 脉冲的高点品宽度
#define LCD_LINEVAL 480//垂直分辨率
#define LCD_HOZVAL800//水平分辨率
#defineLCD_BUF_SIZE(LCD_XSIZE*(LCD_YSIZE+1))//缓冲区大小,留有空闲,防止溢出
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//配置
//视频主控制器0寄存器VIDCON0
#define VIDCON0_INTERLACE_F(0 << 29)//渐行
#define VIDCON0_VIDOUT(0 << 26)//RGB接口
#define VIDCON0_L1_DATA16(0 << 23)//I80 (LDI1)输出16bit模式
#define VIDCON0_L0_DATA16(0 << 20)//I80 (LDI0)输出16bit模式
#define VIDCON0_PNRMODE(0 << 17)//显示格式 RGB格式
#define VIDCON0_CLKVALUP(1 << 16)//选择CLKVAL_F 更新时序控制 ,帧开始时控制
#define VIDCON0_CLKVAL_F(3 << 6)//时钟分频,最大66MHzVCLK=视频时钟源/(CLKVAL+1) CLKVAL>=1
#define VIDCON0_VCLKFREE(1 << 5)//VCLK 自由运行控制(只有在RGB IF 模式下有效):自由运行模式
#define VIDCON0_CLKDIR(1 << 4)//用CLKVAL_F 寄存器划分时钟源
#define VIDCON0_CLKSEL_F(0 << 2)//选择时钟源,HCLK = 133MHz
#define VIDCON0_ENVID(0 << 1)//视频输出及显示控制信号禁止
#define VIDCON0_ENVID_F(0 << 0)//视频输出及显示控制信号禁止
//视频主控制器1寄存器VIDCON1
#define VIDCON1_IVCLK(1 << 7)//时钟上升沿有效
#define VIDCON1_IHSYNC(1 << 6)//HSYNC反向
#define VIDCON1_IVSYNC(1 << 5)//VSYNC反向
#define VIDCON1_IVDEN(0 << 4)//DE信号不反向
//视频时序控制0寄存器VIDTCON0
#define VIDTCON0_VBPDE(0 << 24)//在帧开始处,垂直后沿是不活动行的数量,在垂直同步过程之后(只对YVU 接口)
#define VIDTCON0_VBPD(LCD_VBPD << 16)
#define VIDTCON0_VFPD(LCD_VFPD << 8)
#define VIDTCON0_VSPW(LCD_VSPW << 0)
//视频时序控制1寄存器VIDTCON1
#define VIDTCON1_VFPDE(0 << 24)//在帧末尾处,垂直前沿是不活动行的数量,在垂直同步过程之前(只对YVU 接口)
#define VIDTCON1_HBPD(LCD_HBPD << 16)
#define VIDTCON1_HFPD(LCD_HFPD << 8)
#define VIDTCON1_HSPW(LCD_HSPW << 0)
//视频时序控制2寄存器VIDTCON2
#define VIDTCON2_LINEVAL(LCD_LINEVAL << 11)
#define VIDTCON2_HOZVAL(LCD_HOZVAL << 0)
//窗口0控制寄存器WINCON0
#define WINCON0_nWide_Narrow(0 << 26)//根据输入值范围选择从YCbCr 到RGB 的颜色空间转换等式。YCbCr 宽范围是2’00, YCbCr 窄范围是2’11,宽范围:Y/Cb/Cr:2514-0窄范围:Y:2314-16,Cb/Cr:240-16
#define WINCON0_ENLOCAL(0 << 22)//选择数据访问方式:专用DMA
#define WINCON0_BUFSEL(0 << 20)//缓冲区设置为0
#define WINCON0_BUFAUTOEN(0 << 19) //双缓冲区自动控制位,由BUFSEL控制
#define WINCON0_BITSWP(0 << 18)//位交换禁止
#define WINCON0_BYTSWP(0 << 17)//字节交换禁止
#define WINCON0_HAWSWP(1 << 16)//半子交换使能
#define WINCON0_InRGB(0 << 13)//此位指明源图像的输入颜色空间(只对ENLOCALI 有效):RGB
#define WINCON0_BURSTLEN(0 << 9)//DMA 的突发最大长度选择:16BYTE
#define WINCON0_BPPMODE_F(5 << 2)//16bit RGB565
//窗口0位置控制A寄存器VIDOSD0A
#define VIDOSD0A_OSD_LeftTopX_F(0 << 11)//左上角的OSD 图像像素横向屏幕坐标
#define VIDOSD0A_OSD_LeftTopY_F (0 << 0)//左上角的OSD 图像像素纵向屏幕坐标(对于接口TV输出而言,这个值必须设置在屏幕y 坐标值的一半位置。Y 坐标值的初始位置必须为偶数)
//窗口0位置控制B寄存器VIDOSD0B
#define VIDOSD0B_OSD_RightBotX_F((LCD_HOZVAL - 1) << 11)//右下角的OSD 图像像素横向屏幕坐标
#define VIDOSD0B_OSD_RightBotY_F((LCD_LINEVAL - 1) << 0)//右下角的OSD 图像像素纵向屏幕坐标(对于接口TV输出而言,这个值必须设置在屏幕y 坐标值的一半位置。Y 坐标值的初始位置必须为奇数)
//窗口0位置控制C寄存器VIDOSD0C
#define VIDOSD0C_OSDSIZE(LCD_HOZVAL * LCD_LINEVAL)//窗口尺寸=高*宽(字数)
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**************************************************************
480*272 TFT LCD关闭输出
**************************************************************/
void LCD_Disable(void)
{
VIDCON0 &= (~(BIT1 | BIT0));//视频输出和逻辑瞬态使能禁止+当前帧末尾视频输出和逻辑瞬态使能禁止
WINCON0 &= ~BIT0;//禁止视频输出和VIDEO 控制信号
}
/**************************************************************
480*272 TFT LCD使能
**************************************************************/
void LCD_Enable(void)
{
VIDCON0 |= (BIT1 | BIT0);//视频输出和逻辑瞬态使能+当前帧末尾视频输出和逻辑瞬态使能
WINCON0 |= BIT0;//使能视频输出和VIDEO 控制信号
}
/*************************************************************************************************************************
*函数 :void LCD_Init(void)
*功能 :LCD初始化
*参数 :无
*返回 :无
*依赖 : 底层宏定义
*作者 :陈鹏
*时间 :20120311
*最后修改时间:20120311
*说明 :初始化TFT LCD
*************************************************************************************************************************/
void LCD_Init(void)
{
u32 i;
//IO以及硬件初始化
GPIOI->CON =0XAAAAAAAA;
GPIOJ->CON =0XAAAAAAAA;
SPCON &= ~0x3;// 将SPCON寄存器中,最低两位设为01,即RGB I/F style
SPCON |= 0x1;
LCD_Disable();//显示控制器失能
S3C6410_SFR(0x7410800C) &= ~(1 << 3);// (1)MOFPCON:SEL_BYPASS[3] value@0x7410800C 必须设置为0
//视频主控制器0寄存器配置
VIDCON0 = VIDCON0_INTERLACE_F + VIDCON0_VIDOUT + VIDCON0_L1_DATA16 + VIDCON0_L0_DATA16 + VIDCON0_PNRMODE+\
VIDCON0_CLKVALUP + VIDCON0_CLKVAL_F + VIDCON0_VCLKFREE + VIDCON0_CLKDIR + VIDCON0_CLKSEL_F + \
VIDCON0_ENVID + VIDCON0_ENVID_F;
//视频主控制器1寄存器配置
VIDCON1 = VIDCON1_IVCLK + VIDCON1_IHSYNC + VIDCON1_IVSYNC + VIDCON1_IVDEN;
//视频主控制器2寄存器配置
VIDCON2 = 0;
//视频时序控制0寄存器配置
VIDTCON0 = VIDTCON0_VBPDE + VIDTCON0_VBPD + VIDTCON0_VFPD + VIDTCON0_VSPW;
//视频时序控制1寄存器配置
VIDTCON1 = VIDTCON1_VFPDE + VIDTCON1_HBPD + VIDTCON1_HFPD + VIDTCON1_HSPW;
//视频时序控制2寄存器配置
VIDTCON2 = VIDTCON2_LINEVAL + VIDTCON2_HOZVAL;
//窗口0控制寄存器配置
WINCON0 = WINCON0_nWide_Narrow + WINCON0_ENLOCAL + WINCON0_BUFSEL + WINCON0_BUFAUTOEN + WINCON0_BITSWP + WINCON0_BYTSWP + WINCON0_HAWSWP+\
WINCON0_InRGB + WINCON0_BURSTLEN + WINCON0_BPPMODE_F;
//窗口0位置控制A寄存器配置
VIDOSD0A = VIDOSD0A_OSD_LeftTopX_F + VIDOSD0A_OSD_LeftTopY_F;
//窗口0位置控制B寄存器配置
VIDOSD0B = VIDOSD0B_OSD_RightBotX_F + VIDOSD0B_OSD_RightBotY_F;
//窗口0位置控制C寄存器配置
VIDOSD0C = VIDOSD0C_OSDSIZE;
//窗口0缓冲地址开始
VIDW00ADD0B0 = (u32)LCD_BUFFER;
//窗口0缓冲地址结束
VIDW00ADD1B0 = (u32)LCD_BUFFER + LCD_BUF_SIZE;
//帧缓冲地址2寄存器
VIDW00ADD2 = (0 << 13) | (LCD_HOZVAL * 2);//虚拟平面的页面宽度此值定义了帧内可可视端口的宽度。PAGEWIDTH 的值必须比突发尺寸大且在字边界范围内。
LCD_Enable(); //显示使能
for(i = 0;i < 50000;i ++);//加一个延时,否则可能会出错
LCD_ClearScreen(0xffff);//清屏
}
/*************************************************************************************************************************
*函数 :void LCD_ClearScreen(u16 Color)
*功能 :LCD清屏函数
*参数 :Color:清屏颜色
*返回 :无
*依赖 : 底层宏定义
*作者 :陈鹏
*时间 :20120311
*最后修改时间:20120311
*说明 :需要先初始化LCD,颜色值为RGB565
*************************************************************************************************************************/
void LCD_ClearScreen(u16 Color)
{
u16 x,y ;
for( x = 0 ; x < LCD_XSIZE; x++ )
{
for( y = 0 ; y < LCD_YSIZE ; y++ )
LCD_BUFFER[y][x] = Color ;//在256色调色板中0x00为黑色,0xff为白色。
}
}
/*************************************************************************************************************************
*函数 :void LCD_DrawPoint(u16 x,u16 y,u16 Color)
*功能 :在指定位置画一个指定颜色的点
*参数 :x,y:坐标;Color:颜色
*返回 :无
*依赖 : 底层宏定义
*作者 :陈鹏
*时间 :20120311
*最后修改时间:20120311
*说明 :需要先初始化LCD,颜色值为RGB565,注意不要超出范围
*************************************************************************************************************************/
void LCD_DrawPoint(u16 x,u16 y,u16 Color)
{
if ( ( x < LCD_XSIZE) && ( y < LCD_YSIZE) )
LCD_BUFFER[y][x] = Color;
}
/*************************************************************************************************************************
* 函数: void LCD_Char(u16 x,u16 y,const u8 *p,u16 Font_color,u16 Back_color,u8 MODE)
* 功能: 在指定位置显示一个ASCII字符
* 参数: 开始坐标,字符,字体颜色,背景颜色,显示模式以及字体,
* 返回: 无
* 依赖: 画点函数
* 作者: 陈鹏
* 时间: 20110920
* 最后修改时间 : 20110920
* 说明: Font_MODE最高位为1表示叠加显示,其它位用来选择字体
*************************************************************************************************************************/
void LCD_Char(u16 x,u16 y,const u8 *p,u16 Font_color,u16 Back_color,u8 Font_MODE)
{
const u8 *font_add;//用来选择不同的字体对应字库地址
u8 i,j;
u8 fh;//字高
switch (FONT_H[Font_MODE & 0x7f])
{
case 16:fh = 16;font_add = Song_16[*p - 32];break;//选择字体高度为16,字宽为8,宋体正常字体;
case 13:fh = 13;font_add = Song_13[*p - 32];break;//选择字体高度为13,字宽为8,宋体正常字体;
default : fh = 16;font_add = Song_16[*p - 32];break;//默认选择字体高度为16,字宽为8,宋体正常字体;
}
for(i = 0;i < fh;i ++)
{
for(j = 0;j < 8;j ++)
{
if(font_add[i] & 0x80 >> j)
LCD_DrawPoint(x + j,y + i,Font_color);//字的颜色
else
{
if(!(Font_MODE & 0x80))//非叠加显示
LCD_DrawPoint(x + j,y + i,Back_color);//背景颜色
}
}
}
}
/*************************************************************************************************************************
* 函数: void Show_Char(u16 x,u16 y,const u8 *p,u16 Font_color,u16 Back_color,u8 MODE)
* 功能: 在指定位置显示ASCII字符串
* 参数: 开始坐标,字符串,字体颜色,背景颜色,显示模式以及字体,
* 返回: 无
* 依赖: void Show_Char(u16 x,u16 y,char *p,u16 Font_color,u16 Back_color,u8 MODE);//单个字符显示函数
* 作者: 陈鹏
* 时间: 20110920
* 最后修改时间 : 20110920
* 说明: Font_最高位为1表示叠加显示,其它位用来选择字体
*************************************************************************************************************************/
void Show_Char(u16 x,u16 y,const u8 *p,u16 Font_color,u16 Back_color,u8 Font_MODE)
{
while(*p != 0x00)//判断是否到达字符串结尾
{
if(x > 231)//判断是否需要换行
{
x = 0;
y += 16;
}
if (*p == '\n')
{
y += 16;
x = 0;
p ++;
}
LCD_Char(x,y,p,Font_color,Back_color,Font_MODE);
p ++;
x += 8;
}
}
/*************************************************************************************************************************
* 函数: void LCD_China(u16 x,u16 y,const u8 *p,u16 Font_color,u16 Back_color,u8 Font_MODE)
* 功能: 在指定位置显示一个汉字指定大小的汉字
* 参数: 开始坐标,汉字点阵数组位置,字体颜色,背景颜色,显示模式以及字体,
* 返回: 无
* 依赖: 画点函数
* 作者: 陈鹏
* 时间: 20110920
* 最后修改时间 : 20110920
* 说明: Font_最高位为1表示叠加显示,其它位用来选择字体高度
*************************************************************************************************************************/
void LCD_China(u16 x,u16 y,const u8 *p,u16 Font_color,u16 Back_color,u8 Font_MODE)
{
u8 i,j;
u8 fhl;//字宽高
fhl = FONT_H[Font_MODE & 0x7f];
if(Font_MODE & 0x80)//叠加显示
{
for(i = 0;i < fhl;i ++)
{
for(j = 0;j < 8;j ++)
{
if(*p & 0x80 >> j)
LCD_DrawPoint(x + j,y + i,Font_color);//字的颜色
}
p ++;
for(j = 0;j < fhl - 8;j ++)
{
if(*p & 0x80 >> j)
LCD_DrawPoint(x + j + 8,y + i,Font_color);//字的颜色
}
p ++;
}
}
else //非叠加显示
{
for(i = 0;i < fhl;i ++)
{
for(j = 0;j < 8;j ++)
{
if(*p & 0x80 >> j)
LCD_DrawPoint(x + j,y + i,Font_color);//字的颜色
else
LCD_DrawPoint(x + j,y + i,Back_color);//背景颜色
}
p ++;
for(j = 0;j < fhl - 8;j ++)
{
if(*p & 0x80 >> j)
LCD_DrawPoint(x + j + 8,y + i,Font_color);//字的颜色
else
LCD_DrawPoint(x + j + 8,y + i,Back_color);//背景颜色
}
p ++;
}
}
}
/*************************************************************************************************************************
* 函数: void LCD_Fill(u16 xStart, u16 xEnd, u16 yStart, u16 yEnd,u16 color)
* 功能: 指定位置填充颜色
* 参数: 位置坐标,颜色值
* 返回: 无
* 依赖: 底层函数
* 作者: 陈鹏
* 时间: 20110920
* 最后修改时间 : 20110920
* 说明: 无
*************************************************************************************************************************/
void LCD_Fill(u16 xStart, u16 xEnd, u16 yStart, u16 yEnd,u16 color)
{
u16 i,j;
for(i = yStart;i < yEnd + 1; i ++)
{
for(j = xStart;j < xEnd + 1;j ++)
{
LCD_DrawPoint(j,i,color);
}
}
}
/*************************************************************************************************************************
* 函数: void Draw_Circle(u16 x0,u16 y0,u8 r)
* 功能: 画圆函数
* 参数: 圆心坐标,半径
* 返回: 无
* 依赖: 画点函数
* 作者: 陈鹏
* 时间: 20110920
* 最后修改时间 : 20110920
* 说明: 无
*************************************************************************************************************************/
void Draw_Circle(u16 x0,u16 y0,u8 r,u16 color)
{
int a = 0,b = r;
int di;
di = 3 -(r << 1); //判断下个点位置的标志
//LCD_DrawPoint(x0,y0,color); //中心
while(a <= b)
{
LCD_DrawPoint(x0 - b,y0 - a,color); //3
LCD_DrawPoint(x0 + b,y0 - a,color); //0
LCD_DrawPoint(x0 - a,y0 + b,color); //1
LCD_DrawPoint(x0 - b,y0 - a,color); //7
LCD_DrawPoint(x0 - a,y0 - b,color); //2
LCD_DrawPoint(x0 + b,y0 + a,color); //4
LCD_DrawPoint(x0 + a,y0 - b,color); //5
LCD_DrawPoint(x0 + a,y0 + b,color); //6
LCD_DrawPoint(x0 - b,y0 + a,color); //
a ++;
//使用Bresenham算法画圆
if(di<0)
di += 4 * a + 6;
else
{
di += 10 + 4 * (a - b);
b --;
}
}
}
/*************************************************************************************************************************
* 函数: void LCD_DrawLine(u16 x1, u16 y1, u16 x2, u16 y2)
* 功能: 画线函数
* 参数: 起点终点坐标
* 返回: 无
* 依赖: 画点函数
* 作者: 陈鹏
* 时间: 20110920
* 最后修改时间 : 20110920
* 说明: 无
*************************************************************************************************************************/
void LCD_DrawLine(u16 x1, u16 y1, u16 x2, u16 y2,u16 color)
{
u16 t;
int xerr=0,yerr=0,delta_x,delta_y,distance;
int incx,incy,uRow,uCol;
//TFT_LCD_SetRamAddr(0,239,0,319);//设置显示窗口
delta_x=x2-x1; //计算坐标增量
delta_y=y2-y1;
uRow=x1;
uCol=y1;
if(delta_x>0)incx=1; //设置单步方向
else if(delta_x==0)incx=0;//垂直线
else {incx=-1;delta_x=-delta_x;}
if(delta_y>0)incy=1;
else if(delta_y==0)incy=0;//水平线
else{incy=-1;delta_y=-delta_y;}
if( delta_x>delta_y)distance=delta_x; //选取基本增量坐标轴
else distance=delta_y;
for(t=0;t<=distance+1;t++ )//画线输出
{
LCD_DrawPoint(uRow,uCol,color);//画点
xerr+=delta_x ;
yerr+=delta_y ;
if(xerr>distance)
{
xerr-=distance;
uRow+=incx;
}
if(yerr>distance)
{
yerr-=distance;
uCol+=incy;
}
}
}
/*************************************************************************************************************************
* 函数: void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2)
* 功能: 在指定位置画一个矩形
* 参数: 多边形的两个坐标
* 返回: 无
* 依赖: 画线函数
* 作者: 陈鹏
* 时间: 20110920
* 最后修改时间 : 20110920
* 说明: 无
*************************************************************************************************************************/
void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2,u16 color)
{
LCD_DrawLine(x1,y1,x2,y1,color);
LCD_DrawLine(x1,y1,x1,y2,color);
LCD_DrawLine(x1,y2,x2,y2,color);
LCD_DrawLine(x2,y1,x2,y2,color);
}
/*************************************************************************************************************************
* 函数: void Draw_Big_Point(u8 x,u16 y,u16 color)
* 功能: 画一个2*2的大点
* 参数: 点的中心坐标
* 返回: 无
* 依赖: 画点函数
* 作者: 陈鹏
* 时间: 20110920
* 最后修改时间 : 20110920
* 说明: 无
*************************************************************************************************************************/
void Draw_Big_Point(u8 x,u16 y,u16 color)
{
//TFT_LCD_SetRamAddr(0,239,0,319);
LCD_DrawPoint(x,y,color);//中心点
LCD_DrawPoint(x+1,y,color);
LCD_DrawPoint(x,y+1,color);
LCD_DrawPoint(x+1,y+1,color);
}
//TFT_LCD.H
/*************************************************************************************************************
* 文件名:TFT_LCD.c
* 功能:S3C6410 TFT_LCD底层驱动函数
* 作者:陈鹏
* 创建时间:2012年3月11日15:46
* 最后修改时间:2012年5月6日
* 详细:TFT_LCD初始化以及相关绘图函数
*************************************************************************************************************/
#ifndef _TFT_LCD_H_
#define _TFT_LCD_H_
#include"s3c6410_system.h"
//常见颜色
#defineBLACK 0X000000
#defineBLUE 0X0000FF
#defineGREEN 0X008000
#defineCYAN 0X00FFFF
#definePURPLE0X800080
#defineSKYBLUE0X87CEEB
#defineBLOWN 0XA52A2A
#defineSILVER0XC0C0C0
#defineRED 0XFF0000
#definePINK 0XFFC0CB
#defineGOLD 0XFFD700
#defineYELLOW0XFFFF00
#defineWHITE 0XFFFFFF
//RGB888,转RGB565
#defineToRGB565(x) ((((x >> 16) & 0xff) >> 3) << 11) | ((((x >> 8) & 0xff) >> 2) << 5) | ((x & 0xff) >> 3)
void LCD_Init(void);
void LCD_ClearScreen(u16 Color);
void LCD_DrawPoint(u16 x,u16 y,u16 Color);
void LCD_Char(u16 x,u16 y,const u8 *p,u16 Font_color,u16 Back_color,u8 Font_MODE);
void Show_Char(u16 x,u16 y,const u8 *p,u16 Font_color,u16 Back_color,u8 Font_MODE);
void Draw_Big_Point(u8 x,u16 y,u16 color);//画一个2*2的大点
void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2,u16 color);//在指定位置画一个矩形
void LCD_DrawLine(u16 x1, u16 y1, u16 x2, u16 y2,u16 color);//画线函数
void Draw_Circle(u16 x0,u16 y0,u8 r,u16 color);//画圆函数
void LCD_Fill(u16 xStart, u16 xEnd, u16 yStart, u16 yEnd,u16 color);//指定位置填充颜色
void LCD_China(u16 x,u16 y,const u8 *p,u16 Font_color,u16 Back_color,u8 Font_MODE);//在指定位置显示一个汉字指定大小的汉字
下面是我的液晶屏的时序资料
//代码
//TFT_LCD.C
/*************************************************************************************************************
* 文件名:TFT_LCD.c
* 功能:S3C6410 TFT_LCD底层驱动函数
* 作者:陈鹏
* 创建时间:2012年3月11日15:46
* 最后修改时间:2012年5月6日
* 详细:TFT_LCD初始化以及相关绘图函数
*************************************************************************************************************/
#include"s3c6410_system.h"
#include"tft_lcd.h"
#include"s3c6410_map.h"
#include "ASCII.H"
//显存分辨率
#define LCD_XSIZE800//水平分辨率
#define LCD_YSIZE 480//垂直分辨率
//定义显存
volatile static u16 LCD_BUFFER[LCD_YSIZE][LCD_XSIZE];
const u8 FONT_H[6] = {16,16,13,16,13,16};//对应的字体宽和高
//液晶相关参数 5'TFT 800*480
//时序控制
//括号里面的为LCD时序要求的值,但是实际需要调整
//只要调整LCD_VSPW和LCD_HSPW就可以了
#define LCD_VBPD29//VSBP-VSPW(32-3) 在帧开始处,垂直后沿是不活动行的数量,在垂直同步过程之后
#define LCD_VFPD13//VSFP(13)在帧末尾处,垂直前沿是不活动行的数量,在垂直同步过程之前。
#define LCD_VSPW4//VSPW(3)通过计算不活动行的数量,垂直同步脉冲宽度决定VSYNC 脉冲的高点品宽度。
#define LCD_HBPD40//HSBP-HSPW(88-48)水平后沿是HSYNC 下降沿和有效数据开始之间的VCLK 周期的数量。
#define LCD_HFPD40//HSFP(40)水平前沿是有效数据末端和HSYNC 上升沿之间的VCLK 周期的数量。
#define LCD_HSPW174//HSPW(48)通过计算不VCLK 的数量,水平同步脉冲宽度决定HSYNC 脉冲的高点品宽度
#define LCD_LINEVAL 480//垂直分辨率
#define LCD_HOZVAL800//水平分辨率
#defineLCD_BUF_SIZE(LCD_XSIZE*(LCD_YSIZE+1))//缓冲区大小,留有空闲,防止溢出
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//配置
//视频主控制器0寄存器VIDCON0
#define VIDCON0_INTERLACE_F(0 << 29)//渐行
#define VIDCON0_VIDOUT(0 << 26)//RGB接口
#define VIDCON0_L1_DATA16(0 << 23)//I80 (LDI1)输出16bit模式
#define VIDCON0_L0_DATA16(0 << 20)//I80 (LDI0)输出16bit模式
#define VIDCON0_PNRMODE(0 << 17)//显示格式 RGB格式
#define VIDCON0_CLKVALUP(1 << 16)//选择CLKVAL_F 更新时序控制 ,帧开始时控制
#define VIDCON0_CLKVAL_F(3 << 6)//时钟分频,最大66MHzVCLK=视频时钟源/(CLKVAL+1) CLKVAL>=1
#define VIDCON0_VCLKFREE(1 << 5)//VCLK 自由运行控制(只有在RGB IF 模式下有效):自由运行模式
#define VIDCON0_CLKDIR(1 << 4)//用CLKVAL_F 寄存器划分时钟源
#define VIDCON0_CLKSEL_F(0 << 2)//选择时钟源,HCLK = 133MHz
#define VIDCON0_ENVID(0 << 1)//视频输出及显示控制信号禁止
#define VIDCON0_ENVID_F(0 << 0)//视频输出及显示控制信号禁止
//视频主控制器1寄存器VIDCON1
#define VIDCON1_IVCLK(1 << 7)//时钟上升沿有效
#define VIDCON1_IHSYNC(1 << 6)//HSYNC反向
#define VIDCON1_IVSYNC(1 << 5)//VSYNC反向
#define VIDCON1_IVDEN(0 << 4)//DE信号不反向
//视频时序控制0寄存器VIDTCON0
#define VIDTCON0_VBPDE(0 << 24)//在帧开始处,垂直后沿是不活动行的数量,在垂直同步过程之后(只对YVU 接口)
#define VIDTCON0_VBPD(LCD_VBPD << 16)
#define VIDTCON0_VFPD(LCD_VFPD << 8)
#define VIDTCON0_VSPW(LCD_VSPW << 0)
//视频时序控制1寄存器VIDTCON1
#define VIDTCON1_VFPDE(0 << 24)//在帧末尾处,垂直前沿是不活动行的数量,在垂直同步过程之前(只对YVU 接口)
#define VIDTCON1_HBPD(LCD_HBPD << 16)
#define VIDTCON1_HFPD(LCD_HFPD << 8)
#define VIDTCON1_HSPW(LCD_HSPW << 0)
//视频时序控制2寄存器VIDTCON2
#define VIDTCON2_LINEVAL(LCD_LINEVAL << 11)
#define VIDTCON2_HOZVAL(LCD_HOZVAL << 0)
//窗口0控制寄存器WINCON0
#define WINCON0_nWide_Narrow(0 << 26)//根据输入值范围选择从YCbCr 到RGB 的颜色空间转换等式。YCbCr 宽范围是2’00, YCbCr 窄范围是2’11,宽范围:Y/Cb/Cr:2514-0窄范围:Y:2314-16,Cb/Cr:240-16
#define WINCON0_ENLOCAL(0 << 22)//选择数据访问方式:专用DMA
#define WINCON0_BUFSEL(0 << 20)//缓冲区设置为0
#define WINCON0_BUFAUTOEN(0 << 19) //双缓冲区自动控制位,由BUFSEL控制
#define WINCON0_BITSWP(0 << 18)//位交换禁止
#define WINCON0_BYTSWP(0 << 17)//字节交换禁止
#define WINCON0_HAWSWP(1 << 16)//半子交换使能
#define WINCON0_InRGB(0 << 13)//此位指明源图像的输入颜色空间(只对ENLOCALI 有效):RGB
#define WINCON0_BURSTLEN(0 << 9)//DMA 的突发最大长度选择:16BYTE
#define WINCON0_BPPMODE_F(5 << 2)//16bit RGB565
//窗口0位置控制A寄存器VIDOSD0A
#define VIDOSD0A_OSD_LeftTopX_F(0 << 11)//左上角的OSD 图像像素横向屏幕坐标
#define VIDOSD0A_OSD_LeftTopY_F (0 << 0)//左上角的OSD 图像像素纵向屏幕坐标(对于接口TV输出而言,这个值必须设置在屏幕y 坐标值的一半位置。Y 坐标值的初始位置必须为偶数)
//窗口0位置控制B寄存器VIDOSD0B
#define VIDOSD0B_OSD_RightBotX_F((LCD_HOZVAL - 1) << 11)//右下角的OSD 图像像素横向屏幕坐标
#define VIDOSD0B_OSD_RightBotY_F((LCD_LINEVAL - 1) << 0)//右下角的OSD 图像像素纵向屏幕坐标(对于接口TV输出而言,这个值必须设置在屏幕y 坐标值的一半位置。Y 坐标值的初始位置必须为奇数)
//窗口0位置控制C寄存器VIDOSD0C
#define VIDOSD0C_OSDSIZE(LCD_HOZVAL * LCD_LINEVAL)//窗口尺寸=高*宽(字数)
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**************************************************************
480*272 TFT LCD关闭输出
**************************************************************/
void LCD_Disable(void)
{
VIDCON0 &= (~(BIT1 | BIT0));//视频输出和逻辑瞬态使能禁止+当前帧末尾视频输出和逻辑瞬态使能禁止
WINCON0 &= ~BIT0;//禁止视频输出和VIDEO 控制信号
}
/**************************************************************
480*272 TFT LCD使能
**************************************************************/
void LCD_Enable(void)
{
VIDCON0 |= (BIT1 | BIT0);//视频输出和逻辑瞬态使能+当前帧末尾视频输出和逻辑瞬态使能
WINCON0 |= BIT0;//使能视频输出和VIDEO 控制信号
}
/*************************************************************************************************************************
*函数 :void LCD_Init(void)
*功能 :LCD初始化
*参数 :无
*返回 :无
*依赖 : 底层宏定义
*作者 :陈鹏
*时间 :20120311
*最后修改时间:20120311
*说明 :初始化TFT LCD
*************************************************************************************************************************/
void LCD_Init(void)
{
u32 i;
//IO以及硬件初始化
GPIOI->CON =0XAAAAAAAA;
GPIOJ->CON =0XAAAAAAAA;
SPCON &= ~0x3;// 将SPCON寄存器中,最低两位设为01,即RGB I/F style
SPCON |= 0x1;
LCD_Disable();//显示控制器失能
S3C6410_SFR(0x7410800C) &= ~(1 << 3);// (1)MOFPCON:SEL_BYPASS[3] value@0x7410800C 必须设置为0
//视频主控制器0寄存器配置
VIDCON0 = VIDCON0_INTERLACE_F + VIDCON0_VIDOUT + VIDCON0_L1_DATA16 + VIDCON0_L0_DATA16 + VIDCON0_PNRMODE+\
VIDCON0_CLKVALUP + VIDCON0_CLKVAL_F + VIDCON0_VCLKFREE + VIDCON0_CLKDIR + VIDCON0_CLKSEL_F + \
VIDCON0_ENVID + VIDCON0_ENVID_F;
//视频主控制器1寄存器配置
VIDCON1 = VIDCON1_IVCLK + VIDCON1_IHSYNC + VIDCON1_IVSYNC + VIDCON1_IVDEN;
//视频主控制器2寄存器配置
VIDCON2 = 0;
//视频时序控制0寄存器配置
VIDTCON0 = VIDTCON0_VBPDE + VIDTCON0_VBPD + VIDTCON0_VFPD + VIDTCON0_VSPW;
//视频时序控制1寄存器配置
VIDTCON1 = VIDTCON1_VFPDE + VIDTCON1_HBPD + VIDTCON1_HFPD + VIDTCON1_HSPW;
//视频时序控制2寄存器配置
VIDTCON2 = VIDTCON2_LINEVAL + VIDTCON2_HOZVAL;
//窗口0控制寄存器配置
WINCON0 = WINCON0_nWide_Narrow + WINCON0_ENLOCAL + WINCON0_BUFSEL + WINCON0_BUFAUTOEN + WINCON0_BITSWP + WINCON0_BYTSWP + WINCON0_HAWSWP+\
WINCON0_InRGB + WINCON0_BURSTLEN + WINCON0_BPPMODE_F;
//窗口0位置控制A寄存器配置
VIDOSD0A = VIDOSD0A_OSD_LeftTopX_F + VIDOSD0A_OSD_LeftTopY_F;
//窗口0位置控制B寄存器配置
VIDOSD0B = VIDOSD0B_OSD_RightBotX_F + VIDOSD0B_OSD_RightBotY_F;
//窗口0位置控制C寄存器配置
VIDOSD0C = VIDOSD0C_OSDSIZE;
//窗口0缓冲地址开始
VIDW00ADD0B0 = (u32)LCD_BUFFER;
//窗口0缓冲地址结束
VIDW00ADD1B0 = (u32)LCD_BUFFER + LCD_BUF_SIZE;
//帧缓冲地址2寄存器
VIDW00ADD2 = (0 << 13) | (LCD_HOZVAL * 2);//虚拟平面的页面宽度此值定义了帧内可可视端口的宽度。PAGEWIDTH 的值必须比突发尺寸大且在字边界范围内。
LCD_Enable(); //显示使能
for(i = 0;i < 50000;i ++);//加一个延时,否则可能会出错
LCD_ClearScreen(0xffff);//清屏
}
/*************************************************************************************************************************
*函数 :void LCD_ClearScreen(u16 Color)
*功能 :LCD清屏函数
*参数 :Color:清屏颜色
*返回 :无
*依赖 : 底层宏定义
*作者 :陈鹏
*时间 :20120311
*最后修改时间:20120311
*说明 :需要先初始化LCD,颜色值为RGB565
*************************************************************************************************************************/
void LCD_ClearScreen(u16 Color)
{
u16 x,y ;
for( x = 0 ; x < LCD_XSIZE; x++ )
{
for( y = 0 ; y < LCD_YSIZE ; y++ )
LCD_BUFFER[y][x] = Color ;//在256色调色板中0x00为黑色,0xff为白色。
}
}
/*************************************************************************************************************************
*函数 :void LCD_DrawPoint(u16 x,u16 y,u16 Color)
*功能 :在指定位置画一个指定颜色的点
*参数 :x,y:坐标;Color:颜色
*返回 :无
*依赖 : 底层宏定义
*作者 :陈鹏
*时间 :20120311
*最后修改时间:20120311
*说明 :需要先初始化LCD,颜色值为RGB565,注意不要超出范围
*************************************************************************************************************************/
void LCD_DrawPoint(u16 x,u16 y,u16 Color)
{
if ( ( x < LCD_XSIZE) && ( y < LCD_YSIZE) )
LCD_BUFFER[y][x] = Color;
}
/*************************************************************************************************************************
* 函数: void LCD_Char(u16 x,u16 y,const u8 *p,u16 Font_color,u16 Back_color,u8 MODE)
* 功能: 在指定位置显示一个ASCII字符
* 参数: 开始坐标,字符,字体颜色,背景颜色,显示模式以及字体,
* 返回: 无
* 依赖: 画点函数
* 作者: 陈鹏
* 时间: 20110920
* 最后修改时间 : 20110920
* 说明: Font_MODE最高位为1表示叠加显示,其它位用来选择字体
*************************************************************************************************************************/
void LCD_Char(u16 x,u16 y,const u8 *p,u16 Font_color,u16 Back_color,u8 Font_MODE)
{
const u8 *font_add;//用来选择不同的字体对应字库地址
u8 i,j;
u8 fh;//字高
switch (FONT_H[Font_MODE & 0x7f])
{
case 16:fh = 16;font_add = Song_16[*p - 32];break;//选择字体高度为16,字宽为8,宋体正常字体;
case 13:fh = 13;font_add = Song_13[*p - 32];break;//选择字体高度为13,字宽为8,宋体正常字体;
default : fh = 16;font_add = Song_16[*p - 32];break;//默认选择字体高度为16,字宽为8,宋体正常字体;
}
for(i = 0;i < fh;i ++)
{
for(j = 0;j < 8;j ++)
{
if(font_add[i] & 0x80 >> j)
LCD_DrawPoint(x + j,y + i,Font_color);//字的颜色
else
{
if(!(Font_MODE & 0x80))//非叠加显示
LCD_DrawPoint(x + j,y + i,Back_color);//背景颜色
}
}
}
}
/*************************************************************************************************************************
* 函数: void Show_Char(u16 x,u16 y,const u8 *p,u16 Font_color,u16 Back_color,u8 MODE)
* 功能: 在指定位置显示ASCII字符串
* 参数: 开始坐标,字符串,字体颜色,背景颜色,显示模式以及字体,
* 返回: 无
* 依赖: void Show_Char(u16 x,u16 y,char *p,u16 Font_color,u16 Back_color,u8 MODE);//单个字符显示函数
* 作者: 陈鹏
* 时间: 20110920
* 最后修改时间 : 20110920
* 说明: Font_最高位为1表示叠加显示,其它位用来选择字体
*************************************************************************************************************************/
void Show_Char(u16 x,u16 y,const u8 *p,u16 Font_color,u16 Back_color,u8 Font_MODE)
{
while(*p != 0x00)//判断是否到达字符串结尾
{
if(x > 231)//判断是否需要换行
{
x = 0;
y += 16;
}
if (*p == '\n')
{
y += 16;
x = 0;
p ++;
}
LCD_Char(x,y,p,Font_color,Back_color,Font_MODE);
p ++;
x += 8;
}
}
/*************************************************************************************************************************
* 函数: void LCD_China(u16 x,u16 y,const u8 *p,u16 Font_color,u16 Back_color,u8 Font_MODE)
* 功能: 在指定位置显示一个汉字指定大小的汉字
* 参数: 开始坐标,汉字点阵数组位置,字体颜色,背景颜色,显示模式以及字体,
* 返回: 无
* 依赖: 画点函数
* 作者: 陈鹏
* 时间: 20110920
* 最后修改时间 : 20110920
* 说明: Font_最高位为1表示叠加显示,其它位用来选择字体高度
*************************************************************************************************************************/
void LCD_China(u16 x,u16 y,const u8 *p,u16 Font_color,u16 Back_color,u8 Font_MODE)
{
u8 i,j;
u8 fhl;//字宽高
fhl = FONT_H[Font_MODE & 0x7f];
if(Font_MODE & 0x80)//叠加显示
{
for(i = 0;i < fhl;i ++)
{
for(j = 0;j < 8;j ++)
{
if(*p & 0x80 >> j)
LCD_DrawPoint(x + j,y + i,Font_color);//字的颜色
}
p ++;
for(j = 0;j < fhl - 8;j ++)
{
if(*p & 0x80 >> j)
LCD_DrawPoint(x + j + 8,y + i,Font_color);//字的颜色
}
p ++;
}
}
else //非叠加显示
{
for(i = 0;i < fhl;i ++)
{
for(j = 0;j < 8;j ++)
{
if(*p & 0x80 >> j)
LCD_DrawPoint(x + j,y + i,Font_color);//字的颜色
else
LCD_DrawPoint(x + j,y + i,Back_color);//背景颜色
}
p ++;
for(j = 0;j < fhl - 8;j ++)
{
if(*p & 0x80 >> j)
LCD_DrawPoint(x + j + 8,y + i,Font_color);//字的颜色
else
LCD_DrawPoint(x + j + 8,y + i,Back_color);//背景颜色
}
p ++;
}
}
}
/*************************************************************************************************************************
* 函数: void LCD_Fill(u16 xStart, u16 xEnd, u16 yStart, u16 yEnd,u16 color)
* 功能: 指定位置填充颜色
* 参数: 位置坐标,颜色值
* 返回: 无
* 依赖: 底层函数
* 作者: 陈鹏
* 时间: 20110920
* 最后修改时间 : 20110920
* 说明: 无
*************************************************************************************************************************/
void LCD_Fill(u16 xStart, u16 xEnd, u16 yStart, u16 yEnd,u16 color)
{
u16 i,j;
for(i = yStart;i < yEnd + 1; i ++)
{
for(j = xStart;j < xEnd + 1;j ++)
{
LCD_DrawPoint(j,i,color);
}
}
}
/*************************************************************************************************************************
* 函数: void Draw_Circle(u16 x0,u16 y0,u8 r)
* 功能: 画圆函数
* 参数: 圆心坐标,半径
* 返回: 无
* 依赖: 画点函数
* 作者: 陈鹏
* 时间: 20110920
* 最后修改时间 : 20110920
* 说明: 无
*************************************************************************************************************************/
void Draw_Circle(u16 x0,u16 y0,u8 r,u16 color)
{
int a = 0,b = r;
int di;
di = 3 -(r << 1); //判断下个点位置的标志
//LCD_DrawPoint(x0,y0,color); //中心
while(a <= b)
{
LCD_DrawPoint(x0 - b,y0 - a,color); //3
LCD_DrawPoint(x0 + b,y0 - a,color); //0
LCD_DrawPoint(x0 - a,y0 + b,color); //1
LCD_DrawPoint(x0 - b,y0 - a,color); //7
LCD_DrawPoint(x0 - a,y0 - b,color); //2
LCD_DrawPoint(x0 + b,y0 + a,color); //4
LCD_DrawPoint(x0 + a,y0 - b,color); //5
LCD_DrawPoint(x0 + a,y0 + b,color); //6
LCD_DrawPoint(x0 - b,y0 + a,color); //
a ++;
//使用Bresenham算法画圆
if(di<0)
di += 4 * a + 6;
else
{
di += 10 + 4 * (a - b);
b --;
}
}
}
/*************************************************************************************************************************
* 函数: void LCD_DrawLine(u16 x1, u16 y1, u16 x2, u16 y2)
* 功能: 画线函数
* 参数: 起点终点坐标
* 返回: 无
* 依赖: 画点函数
* 作者: 陈鹏
* 时间: 20110920
* 最后修改时间 : 20110920
* 说明: 无
*************************************************************************************************************************/
void LCD_DrawLine(u16 x1, u16 y1, u16 x2, u16 y2,u16 color)
{
u16 t;
int xerr=0,yerr=0,delta_x,delta_y,distance;
int incx,incy,uRow,uCol;
//TFT_LCD_SetRamAddr(0,239,0,319);//设置显示窗口
delta_x=x2-x1; //计算坐标增量
delta_y=y2-y1;
uRow=x1;
uCol=y1;
if(delta_x>0)incx=1; //设置单步方向
else if(delta_x==0)incx=0;//垂直线
else {incx=-1;delta_x=-delta_x;}
if(delta_y>0)incy=1;
else if(delta_y==0)incy=0;//水平线
else{incy=-1;delta_y=-delta_y;}
if( delta_x>delta_y)distance=delta_x; //选取基本增量坐标轴
else distance=delta_y;
for(t=0;t<=distance+1;t++ )//画线输出
{
LCD_DrawPoint(uRow,uCol,color);//画点
xerr+=delta_x ;
yerr+=delta_y ;
if(xerr>distance)
{
xerr-=distance;
uRow+=incx;
}
if(yerr>distance)
{
yerr-=distance;
uCol+=incy;
}
}
}
/*************************************************************************************************************************
* 函数: void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2)
* 功能: 在指定位置画一个矩形
* 参数: 多边形的两个坐标
* 返回: 无
* 依赖: 画线函数
* 作者: 陈鹏
* 时间: 20110920
* 最后修改时间 : 20110920
* 说明: 无
*************************************************************************************************************************/
void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2,u16 color)
{
LCD_DrawLine(x1,y1,x2,y1,color);
LCD_DrawLine(x1,y1,x1,y2,color);
LCD_DrawLine(x1,y2,x2,y2,color);
LCD_DrawLine(x2,y1,x2,y2,color);
}
/*************************************************************************************************************************
* 函数: void Draw_Big_Point(u8 x,u16 y,u16 color)
* 功能: 画一个2*2的大点
* 参数: 点的中心坐标
* 返回: 无
* 依赖: 画点函数
* 作者: 陈鹏
* 时间: 20110920
* 最后修改时间 : 20110920
* 说明: 无
*************************************************************************************************************************/
void Draw_Big_Point(u8 x,u16 y,u16 color)
{
//TFT_LCD_SetRamAddr(0,239,0,319);
LCD_DrawPoint(x,y,color);//中心点
LCD_DrawPoint(x+1,y,color);
LCD_DrawPoint(x,y+1,color);
LCD_DrawPoint(x+1,y+1,color);
}
//TFT_LCD.H
/*************************************************************************************************************
* 文件名:TFT_LCD.c
* 功能:S3C6410 TFT_LCD底层驱动函数
* 作者:陈鹏
* 创建时间:2012年3月11日15:46
* 最后修改时间:2012年5月6日
* 详细:TFT_LCD初始化以及相关绘图函数
*************************************************************************************************************/
#ifndef _TFT_LCD_H_
#define _TFT_LCD_H_
#include"s3c6410_system.h"
//常见颜色
#defineBLACK 0X000000
#defineBLUE 0X0000FF
#defineGREEN 0X008000
#defineCYAN 0X00FFFF
#definePURPLE0X800080
#defineSKYBLUE0X87CEEB
#defineBLOWN 0XA52A2A
#defineSILVER0XC0C0C0
#defineRED 0XFF0000
#definePINK 0XFFC0CB
#defineGOLD 0XFFD700
#defineYELLOW0XFFFF00
#defineWHITE 0XFFFFFF
//RGB888,转RGB565
#defineToRGB565(x) ((((x >> 16) & 0xff) >> 3) << 11) | ((((x >> 8) & 0xff) >> 2) << 5) | ((x & 0xff) >> 3)
void LCD_Init(void);
void LCD_ClearScreen(u16 Color);
void LCD_DrawPoint(u16 x,u16 y,u16 Color);
void LCD_Char(u16 x,u16 y,const u8 *p,u16 Font_color,u16 Back_color,u8 Font_MODE);
void Show_Char(u16 x,u16 y,const u8 *p,u16 Font_color,u16 Back_color,u8 Font_MODE);
void Draw_Big_Point(u8 x,u16 y,u16 color);//画一个2*2的大点
void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2,u16 color);//在指定位置画一个矩形
void LCD_DrawLine(u16 x1, u16 y1, u16 x2, u16 y2,u16 color);//画线函数
void Draw_Circle(u16 x0,u16 y0,u8 r,u16 color);//画圆函数
void LCD_Fill(u16 xStart, u16 xEnd, u16 yStart, u16 yEnd,u16 color);//指定位置填充颜色
void LCD_China(u16 x,u16 y,const u8 *p,u16 Font_color,u16 Back_color,u8 Font_MODE);//在指定位置显示一个汉字指定大小的汉字
0 0
- S3C6410裸机驱动5'TFT LCD
- S3C6410裸机驱动5'TFT LCD
- S3C6410裸机驱动5'TFT LCD
- Real6410/S3C6410裸机LCD驱动
- Linux2.6.26.5加入TFT-LCD驱动
- 如何驱动TFT LCD
- TFT LCD驱动
- stm32 驱动 TFT LCD
- S3C6410 SPI 裸机驱动
- S3C6410裸机AC97驱动
- STM32 SPI驱动TFT LCD
- 【LPC54100】SPI0驱动TFT LCD
- 【LPC54100】GPIO驱动TFT LCD
- LCD裸机驱动
- S5PV210----裸机LCD驱动
- 裸机S3C6410显示控制器(3)-LINUX下LCD驱动源码阅读
- S3C6410裸机电阻屏驱动
- S3C6410图形旋转裸机驱动
- VECTOR动态数组
- error while loading shared libraries: xxx.so.x"错误的原因和解决办法----笛风读书笔记系列
- Ldd命令介绍及使用方法
- winform实现淡入淡出,窗体折叠等效果
- JSONHelper
- S3C6410裸机驱动5'TFT LCD
- 浙江大学pat 1003
- linux时间同步,ntpd、ntpdate
- java.lang.IllegalArgumentException: No configs match configSpec
- unity开发 --------- c# 基本语法 005
- Android 无标题 全屏设置
- html5里面的html标签,再啰嗦下
- jQuery学习--Chapter02小结(jQuery选择器)
- win7资源监视器中各个选项的作用