LPC1788的LCD接口驱动真彩屏

#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);

}

}

时间: 2024-10-05 07:01:01

LPC1788的LCD接口驱动真彩屏的相关文章

LCD设备驱动

一.LCD硬件原理 利用液晶制成的显示器LCD,依据驱动方式可分为静态驱动.简单矩阵驱动以及主动矩阵驱动3中.其中,简单矩阵型又可再区分扭转向列型(TN)和超扭转式向列型(STN)两种,而主动矩阵型则以薄膜式晶体管型(TFT)为主流. 一块LCD屏显示图像不但需要LCD驱动器,还需要有相应的LCD控制器.通常LCD驱动器会议COF/COG与LCD玻璃基板制作在一起,而LCD控制则由外部电路来实现.许多MCU北部直接集成了LCD控制,通过LCD控制器可以方便地控制STN和TFT屏. 下图给出了LC

HI3531和DP83640接口驱动修改记录

最近在做视频拼接的一个项目,项目使用的处理器是HI3531处理器,是海思的ARM A9双核 1G主频的处理器.原本使用的是一个1000M PHY.是realtek的RTL8211E的PHY.后面由于需要使用支持IEEE1588硬件PTP同步支持的PHY,于是选择了一款ti的DP83640的PHY.ti官方给出的同步时间精度是8ns.于是我们就朝着8ns方向前进了.于是就开始设计板子,板子是找一搏做的,板子打回来看上去比较漂亮.上图一张. 回来调试,刚刚开始发现PHY更换后不能下载,我和我朋友一同

中颖内带LCD资源驱动代码

uint8 xdata LCDBuf[19] _at_ 0x1e0; //LCD RAM 地址 480-224 //LCD模式选择 #define LcdMode0 0x00 //传统电阻型 偏置和225K/900K #define LcdMode1 0x01 //传统电阻型 偏置和60K #define LcdMode2 0x02 //快速充电型 偏置于60K 与 225K/900K间切换 //偏置电阻选择 #define LcdRSum225K (0<<4) #define LcdRSum

关于WinCE流接口驱动支持10以上的端口号(COM10)

一般情况下,WinCE流驱动的索引为0~9.应用程序中,通过CreateFile(_T("XXXN:"),…)打开对应的驱动,N也为0~9.这样看来,似乎在WinCE下同名流驱动个数被限制在10个以内.如果设备中有更多的同名设备该怎么办呢? 解决的方法有两个,第一种是换前缀,将XXX改成YYY,这样就又有10个可用的设备名了.当然,修改前缀时需要注意,驱动源代码和注册表中的Prefix必需一致,否则,可能会导致驱动加载失败. 第二种,在应用程序中换一个方式打开流驱动.实际上,WinCE

android系统平台显示驱动开发简要:Samsung LCD接口篇『二』

平台信息: 内核:linux3.4.39系统:android4.4 平台:S5P4418(cortex a9) 作者:瘋耔(欢迎转载,请注明作者) 欢迎指正错误,共同学习.共同进步!! 关注博主新浪博客:http://weibo.com/cpjphone 参考:S5PV210显示驱动分析与移植(android) 这篇文章中转载的成分比较多,不过大部分内容是从芯片手册上翻译过来.Framebuffer部分是黄冈老师--<嵌入式Linux之我行>这一系列博客中的,嵌入式Linux之我行这系列博客写

LCD之mipi DSI接口驱动调试流程【转】

转自:https://blog.csdn.net/liwei16611/article/details/68146912 1.LCD MIPI DSI协议MIPI-DSI是一种应用于显示技术的串行接口,兼容DPI(显示像素接口,Display Pixel Interface).DBI(显示总线接口,Display Bus Interface)和DCS(显示命令集,Display Command Set),以串行的方式发送像素信息或指令给外围,而且从外围中读取状态信息或像素信息,而且在传输的过程中

LCD底层驱动分析

根据分析的框架,自己写一个LCD驱动程序 1分析LCD硬件原理图 Von和Voff接的是一个电源电路,通过LCD_POWER接的是GPG4来控制LCD电源,高电平表示开启LCD电源 VM接的是CPU的VM:VDEN /GPC4为数据使能信号, VLINE接的CPU:HSYNC/GPC2,HSYNC信号有效时,表示一行数据的开始: VFRAME接的CPU:VSYNC/GPC3,VSYNC信号有效时,表示一帧数据的开始 VCLK接的CPU:VCLK/GPC1 表示像素时钟信号,每个VCLK信号表示正

Android LCD(三):LCD接口篇【转】

本文转载自:http://blog.csdn.net/xubin341719/article/details/9177085 关键词:Android LCD控制器 Framebuffer PWM  平台信息:内核:linux2.6/linux3.0系统:android/android4.0 平台:samsung exynos 4210.exynos 4412 .exynos 5250 作者:xubin341719(欢迎转载,请注明作者)欢迎指正错误,共同学习.共同进步!!下载链接:LCD规格书(

(转)常见LCD接口

LCD常用接口原理 点击打开链接 点击打开链接 点击打开链接 点击打开链接 点击打开链接 点击打开链接 点击打开链接 点击打开链接 xubin 平台信息:内核:linux2.6/linux3.0系统:android/android4.0 平台:samsung exynos 4210.exynos 4412 .exynos 5250 TFT-lCD常用的接口,TTL(RGB).LVDS.EDP.MIPI,这篇我们大致说一下这些接口的信号组成已经基本原理. 一.TTL 1.TTL接口概述 TTL(T