#ifndef __LCD_H_
#define __LCD_H_
#include "common.h"
#include "debugserial.h"
#include "delay.h"
#include "sdram.h"
#define White 0xFFFFFF
#define Black 0x000000
#define Blue 0xFF0000
#define Red 0x0000FF
#define Green 0x00FF00
#define Yellow 0x00FFFF
#define purple 0xff00ff
#define pixel_clock 9000000 //像素时钟设置为9M
#define lcd_h_size 480 //根据数据手册典型值设置
#define lcd_h_pulse 2
#define lcd_h_back_proch 43
#define lcd_h_front_porch 8
#define lcd_v_size 272
#define lcd_v_pulse 10
#define lcd_v_back_proch 12
#define lcd_v_front_porch 4
#define lcd_show_delay 10000
#define LCD_VRAM_BASE_ADDR ((unsigned long)SDRAM_BASE_ADDR + 0x00010000)//显示基地址
#define LCD_CURSOR_BASE_ADDR ((unsigned long)0x20088800)
void lcd_init(u32 defaultColor);
void lcd_clear(u32 color);
void lcd_set_backlight(u8 enable);
void lcd_draw_point(u32 x,u32 y,u32 color);
u32 lcd_read_point(u32 x,u32 y);
void lcd_draw_line(u16 x1, u16 y1, u16 x2, u16 y2,u32 color);
void lcd_draw_rect(u16 x1, u16 y1, u16 x2, u16 y2,u32 color);
void lcd_draw_cicle(u16 x0,u16 y0,u8 r,u32 color);
void lcd_test(u32 color);
#endif
#include "lcd.h"
//lcd io初始化
static void lcd_in_init(void)
{
LPC_SC->PCONP |= (1<<15);//打开时钟
/* R */
LPC_IOCON->P0_4 = 0x27; // LCD_VD_0
LPC_IOCON->P0_5 = 0x27; // LCD_VD_1
LPC_IOCON->P4_28 = 0x27; // LCD_VD_2
LPC_IOCON->P4_29 = 0x27; // LCD_VD_3
LPC_IOCON->P2_6 = 0x27; // LCD_VD_4
LPC_IOCON->P2_7 = 0x27; // LCD_VD_5
LPC_IOCON->P2_8 = 0x27; // LCD_VD_6
LPC_IOCON->P2_9 = 0x27; // LCD_VD_7
/* G */
LPC_IOCON->P0_6 = 0x27; // LCD_VD_8
LPC_IOCON->P0_7 = 0x27; // LCD_VD_9
LPC_IOCON->P1_20 = 0x27; // LCD_VD_10
LPC_IOCON->P1_21 = 0x27; // LCD_VD_11
LPC_IOCON->P1_22 = 0x27; // LCD_VD_12
LPC_IOCON->P1_23 = 0x27; // LCD_VD_13
LPC_IOCON->P1_24 = 0x27; // LCD_VD_14
LPC_IOCON->P1_25 = 0x27; // LCD_VD_15
/* B */
LPC_IOCON->P0_8 = 0x27; // LCD_VD_16
LPC_IOCON->P0_9 = 0x27; // LCD_VD_17
LPC_IOCON->P2_12 = 0x27; // LCD_VD_18
LPC_IOCON->P2_13 = 0x27; // LCD_VD_19
LPC_IOCON->P1_26 = 0x27; // LCD_VD_20
LPC_IOCON->P1_27 = 0x27; // LCD_VD_21
LPC_IOCON->P1_28 = 0x27; // LCD_VD_22
LPC_IOCON->P1_29 = 0x27; // LCD_VD_23
LPC_IOCON->P2_2 = 0x27; // LCD_DCLK
LPC_IOCON->P2_5 = 0x27; // LCD_LP -- HSYNC
LPC_IOCON->P2_3 = 0x27; // LCD_FP -- VSYNC
LPC_IOCON->P2_4 = 0x27; // LCD_ENAB_M -- LCDDEN
LPC_IOCON->P2_0 = 0x27; // LCD_PWR
}
void lcd_init(u32 defaultColor)
{
u32 *pDst = (u32 *)LCD_VRAM_BASE_ADDR;//显示数据基地址
u32 i= 0;
//打开LCD时钟
LPC_SC->PCONP |= 1<<0;
lcd_in_init();//初始化IO
//初始化背光引脚
LPC_IOCON->P2_1 = 0x00;
LPC_IOCON->P2_1 |= (2<<3);//控制背光
P2dir(1) = 1;
P2high(1) = 1;
LPC_LCD->CRSR_CTRL &=~(1<<0);//禁止光标
LPC_LCD->CTRL = 0;//禁止并清零LCD
LPC_LCD->CTRL &= ~(7<<1);//清零面板设置
LPC_LCD->CTRL |= (5<<1);//设置面板tft 24bpp
LPC_LCD->CTRL |= (1<<5);//tft模式
LPC_LCD->CTRL &= ~(1<<7);//单面板
LPC_LCD->CTRL &= ~(1<<8);//RGB颜色
LPC_LCD->CTRL &= ~(1<<9);//小端数据存储
LPC_LCD->CTRL &= ~(1<<10);//像素排序小端
LPC_LCD->CTRL &= ~(1<<11);//信号先维持低电平
LPC_SC->LCD_CFG = ApbClock / pixel_clock;//设置像素时钟 根据数据手册来
LPC_LCD->POL |=(1<<26);//像素时钟分频旁路
LPC_LCD->POL &= ~(1<<5);//模块选择cclk时钟
LPC_LCD->POL |= (1<<11);//FB管脚低电平有效
LPC_LCD->POL |= (1<<12);//LP管脚低电平有效
LPC_LCD->POL &= ~(1<<13);//像素信号于时钟上升沿驱动
LPC_LCD->POL &= ~(1<<14);//高电平输出使能
LPC_LCD->POL &= ~(0x3FF <<16);//清除h_szie
LPC_LCD->POL |= (lcd_h_size-1)<<16;//设置h_size
//设置水平时序控制
LPC_LCD->TIMH = 0;
LPC_LCD->TIMH |= (lcd_h_back_proch - 1)<<24;//水平后延
LPC_LCD->TIMH |= (lcd_h_front_porch - 1)<<16;//水平前沿
LPC_LCD->TIMH |= (lcd_h_pulse - 1)<<8; //水平同步脉冲宽度
LPC_LCD->TIMH |= ((lcd_h_size/16) - 1)<<2;//每一行的像素点
//设置竖直时序控制
LPC_LCD->TIMV = 0;
LPC_LCD->TIMV |= (lcd_v_back_proch)<<24;//竖直后延
LPC_LCD->TIMV |= (lcd_v_front_porch)<<16;//竖直前沿
LPC_LCD->TIMV |= (lcd_v_pulse - 1)<<10;//竖直脉冲宽度
LPC_LCD->TIMV |= lcd_v_size - 1; //像素
// 设置显示缓冲区地址
LPC_LCD->UPBASE = LCD_VRAM_BASE_ADDR & (~(7<<0)) ;
LPC_LCD->LPBASE = LCD_VRAM_BASE_ADDR & (~(7<<0)) ;
for( i = 0; (lcd_h_size * lcd_v_size) > i; i++)
{
*pDst++ = defaultColor;//初始化颜色
}
i = lcd_show_delay;
while(i--);
LPC_LCD->CTRL |= (1<<0);//使能lcd
LPC_LCD->CTRL |= (1<<11);//使能lcd功率
}
void lcd_clear(u32 color)
{
u32 *pDst = (u32 *)LCD_VRAM_BASE_ADDR;//显示数据基地址
u32 i= 0;
for( i = 0; (lcd_h_size * lcd_v_size) > i; i++)
{
*pDst++ = color;//初始化颜色
}
}
void lcd_set_backlight(u8 enable)
{
if(enable)P2high(1) = 1;
else P2low(1) = 1;
}
void lcd_draw_point(u32 x,u32 y,u32 color)
{
u32 *pDst = (u32 *)LCD_VRAM_BASE_ADDR;//显示数据基地址
if(x < lcd_h_size && y < lcd_v_size)
{
pDst = pDst+x + (y*lcd_h_size);
*pDst = color;
}
}
u32 lcd_read_point(u32 x,u32 y)
{
u32 *pDst = (u32 *)LCD_VRAM_BASE_ADDR;//显示数据基地址
u32 color = 0x00000000;
if(x < lcd_h_size && y < lcd_v_size)
{
pDst = pDst+x + (y*lcd_h_size);
color = *pDst;
}
return color;
}
//x1,y1:起点坐标
//x2,y2:终点坐标
void lcd_draw_line(u16 x1, u16 y1, u16 x2, u16 y2,u32 color)
{
u16 t;
int xerr=0,yerr=0,delta_x,delta_y,distance;
int incx,incy,uRow,uCol;
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_draw_point(uRow,uCol,color);//画点
xerr+=delta_x ;
yerr+=delta_y ;
if(xerr>distance)
{
xerr-=distance;
uRow+=incx;
}
if(yerr>distance)
{
yerr-=distance;
uCol+=incy;
}
}
}
//画矩形
//(x1,y1),(x2,y2):矩形的对角坐标
void lcd_draw_rect(u16 x1, u16 y1, u16 x2, u16 y2,u32 color)
{
lcd_draw_line(x1,y1,x2,y1,color);
lcd_draw_line(x1,y1,x1,y2,color);
lcd_draw_line(x1,y2,x2,y2,color);
lcd_draw_line(x2,y1,x2,y2,color);
}
//在指定位置画一个指定大小的圆
//(x,y):中心点
//r :半径
void lcd_draw_cicle(u16 x0,u16 y0,u8 r,u32 color)
{
int a,b;
int di;
a=0;b=r;
di=3-(r<<1); //判断下个点位置的标志
while(a<=b)
{
lcd_draw_point(x0+a,y0-b,color); //5
lcd_draw_point(x0+b,y0-a,color); //0
lcd_draw_point(x0+b,y0+a,color); //4
lcd_draw_point(x0+a,y0+b,color); //6
lcd_draw_point(x0-a,y0+b,color); //1
lcd_draw_point(x0-b,y0+a,color);
lcd_draw_point(x0-a,y0-b,color); //2
lcd_draw_point(x0-b,y0-a,color); //7
a++;
//使用Bresenham算法画圆
if(di<0)di +=4*a+6;
else
{
di+=10+4*(a-b);
b--;
}
}
}
void lcd_test(u32 color)
{
u32 x = lcd_h_size/2;
u32 y = lcd_v_size/2;
u32 i = 0, j = 0;
while(1)
{
if(i >= x && j >= y)break;
if(i < x)i++;
if(j < y)j++;
lcd_draw_rect(x-i,y-j,x+i,y+j,color);
DelayMs(10);
}
}
LPC1788的LCD接口驱动真彩屏的更多相关文章
-
【转】Android LCD(三):Samsung LCD接口篇
关键词:android LCD控制器 Framebuffer PWM 平台信息:内核:linux2.6/linux3.0系统:android/android4.0 平台:samsung exynos ...
-
Android LCD(三):Samsung LCD接口篇
关键词:android LCD控制器 Framebuffer PWM 平台信息: 内核:linux2.6/linux3.0 系统:android/android4.0 平台:samsung exy ...
-
linux lcd设备驱动剖析一
s3c2440 lcd驱动源码文件是:drivers/video/s3c2410fb.c 看驱动源码首先当然是先看入口函数,这里是s3c2410fb_init函数 [cpp] view plain? ...
-
[STM8L]基于STM8L152的TAB段式LCD液晶驱动的分析 - 单片机干货 - 中国电子技术论坛 - 最好最受欢迎电子论坛!
[STM8L]基于STM8L152的TAB段式LCD液晶驱动的分析 - 单片机干货 - 中国电子技术论坛 - 最好最受欢迎电子论坛!.md 主控芯片为STM8L152C4T6自带LCD控制器,低功耗系 ...
-
usb驱动开发24之接口驱动
从第一节我们已经知道,usb_generic_driver在自己的生命线里,以一己之力将设备的各个接口送给了linux的设备模型,让usb总线的match函数,也就是usb_device_match, ...
-
LCD接口(转载)
LCD接口分类 1. I8080接口,我觉得应该就是所谓的8080,通常会用在12864屏上面,且有内部sdram,不需要实时的刷新图片,速度有限制, 支持的数据宽度有8/9/16/18bit,接 ...
-
关于WinCE流接口驱动支持10以上的端口号(COM10)
一般情况下,WinCE流驱动的索引为0~9.应用程序中,通过CreateFile(_T("XXXN:"),…)打开对应的驱动,N也为0~9.这样看来,似乎在WinCE下同名流驱动个 ...
-
linux lcd设备驱动剖析四
在"linux lcd设备驱动剖析二"文章中,我们详细分析了s3c24xxfb_probe函数. 文章链接:http://blog.csdn.net/lwj103862095/ar ...
-
对LCD接口的认识
LCD接口类型: 1.首先我们以传递的信号类型来区分主要有两大类:- 模拟信号: - VGA: Video Graphics Array- 数字信号 - TTL: Transistor Transis ...
随机推荐
-
css之盒模型
盒模型由内容(content).填充(padding).边框(border).边界(margin)组成,一个盒子中主要的属性就5个:width.height.padding.border.margin ...
-
批量插入数据(基于Mybatis的实现-Oracle)
前言:做一个数据同步项目,要求:同步数据不丢失的情况下,提高插入性能. 项目DB框架:Mybatis.DataBase:Oracle. -------------------------------- ...
-
file /usr/share/mysql/... conflicts with file from package mysql-libs-5.1.73-3.el6_5.x86_ 64 MySQL安装
在CentOS 6.5安装MySQL 5.6.17,安装到最后一个rpm文件MySQL-server时 安装命令是:rpm -ivh MySQL-server-5.6.17-1.el6.x86_64. ...
-
[LeetCode] Gas Station
Recording my thought on the go might be fun when I check back later, so this kinda blog has no inten ...
-
C#EXCEL 操作类--C#ExcelHelper操作类
主要功能如下1.导出Excel文件,自动返回可下载的文件流 2.导出Excel文件,转换为可读模式3.导出Excel文件,并自定义文件名4.将数据导出至Excel文件5.将指定的集合数据导出至Exce ...
-
第10章 系统级I/O
第10章 系统级I/O 10.1 Unix I/O 一个Unix文件就是一个m个字节的序列:B0,B1,…,BK,…,Bm-1 Unix I/O:一种将设备优雅地映射为文件的方式,允许Unix内核引出 ...
-
[ios][swift]使用swift闭包进行viewcontroller反向传值
闭包参考:http://c.biancheng.net/cpp/html/2285.html 闭包详解 传值参考:http://www.tuicool.com/articles/vy2uUz Sw ...
-
用python3统计代码行数
今天接到一个电话面试,对方问我在一个项目中维护了多少行代码. 我懵逼了,从来没有统计过啊,怎么还会有这种需求? 当时一脸茫然的想了想,回答了一个,呃...差不多两千多行吧...感觉很心虚 挂完电话之后 ...
-
1008. Elevator (20)
The highest building in our city has only one elevator. A request list is made up with N positive nu ...
-
(转载)cmd-命令大全及详解
原文地址:http://greatverve.cnblogs.com/archive/2011/12/09/windows-cmd.html 命令简介 cmd是command的缩写.即命令行 . 虽然 ...