LPC1788的LCD接口驱动真彩屏

发布者:咖啡小熊最新更新时间:2017-01-13 来源: eefocus关键字: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);

    }

}


关键字:LPC1788  LCD接口  驱动真彩屏 引用地址:LPC1788的LCD接口驱动真彩屏

上一篇:LPC1788系统时钟初始化
下一篇:lPC1788的GPIO驱动

推荐阅读最新更新时间:2024-03-16 15:30

LCD的控制驱动及基与MCU接口的特点
液晶显示,稳定可靠、成本低、功耗小、控制驱动方便、接口简单易用、模块化结构紧凑,在嵌入式系统中作为人机界面获得了广泛的应用。近年来, 国内许多厂商,如紫晶、冀雅、晶华、信利、蓬远等已经能够满足各种定制液晶显示的需求;很多著名半导体厂商,如Hitachi、Seiko Epson、Toshiba、Holtek、Solomon、Samsung等相继推出了许多控制驱动器件。本文以现有的控制驱动器件和液晶显示器如何构成各种结构紧凑、成本低廉、简单易用、性能优良的嵌入式人机界面的设计进行综合阐述。 1 液晶显示及其控制驱动与接口概述 液晶显示LCD(Liquid Crystal Display),是利用液晶材料在电场作用下发生位置变化 而遮蔽
[单片机]
<font color='red'>LCD</font>的控制<font color='red'>驱动</font>及基与MCU<font color='red'>接口</font>的特点
基于T6963C的LCD与ARM7的接口设计
0 引言 液晶模块作为普遍采用的显示器件,具有功耗低、显示内容多、控制灵活等特点。在中规模图形液晶显示模块中,内置T6963C控制器的LCD模块是目前较为常用的内置控制器型图形液晶显示模块。该模块可由硬件电路完成初始化设置,故可节省软件开销。软件上,T6963C控制器也提供了丰富的指令集,且控制方式灵活多样。而以ARM为内核的32位微处理器,则具备高性能和低功耗的特点,在工业控制领域应用广泛。因此,对于不带液晶接口的中低端ARM7芯片,可由其通用输入输出(GPIO,general purpose input andoutput)引脚来实现与LCD的连接,并控制LCD实现其显示功能。 1 LCD硬件接口设计 T6963C控制
[单片机]
基于T6963C的<font color='red'>LCD</font>与ARM7的<font color='red'>接口</font>设计
人机界面中的LCD控制驱动接口设计
  引 言   液晶显示,稳定可靠、成本低、功耗小、控制驱动方便、接口简单易用、模块化结构紧凑,在嵌入式系统中作为人机界面获得了广泛的应用。近年来,国内许多厂商,如紫晶、冀雅、晶华、信利、蓬远等已经能够满足各种定制液晶显示的需求;很多著名半导体厂商,如Hitachi、Seiko Epson、Toshiba、Holtek、Solomon、Samsung等相继推出了许多控制驱动器件。本文以现有的控制驱动器件和液晶显示器如何构成各种结构紧凑、成本低廉、简单易用、性能优良的嵌入式人机界面的设计进行综合阐述。   1 液晶显示及其控制驱动与接口概述   液晶显示LCD(Liquid Crystal Display),是利用液晶材料在
[嵌入式]
盛群推出HT16L21及HT16L23采用1.8V低电压接口LCD驱动IC
针对部分系统采用比较高阶制程的主控MCU,所以与外围IC的接口可能会低到1.8V左右,但是又必须兼顾较好的LCD显示质量,Holtek推出二款可工作于低电源、低压接口的新IC:HT16L21及HT16L23。此系列支持最低至1.8V的传输接口及VDD电压,VLCD可另外供给较高电位、最高到6.0V。 HT16L21及HT16L23适用于工规温度条件:-40℃~+85℃;VDD范围宽广:1.8V~5.5V、支持VLCD可大于、等于或小于VDD的应用;提供4种图框扫瞄频率:64Hz、85.3Hz、128Hz or 170.6Hz;内建Regulator可以指令设定VLCD电压、最多有8阶;提供全屏闪烁功能、有三种频率可选;
[电源管理]
盛群推出HT16L21及HT16L23采用1.8V低电压<font color='red'>接口</font>之<font color='red'>LCD</font><font color='red'>驱动</font>IC
lPC1788驱动SDRAM
Sdram型号为hy57v256 #ifndef __SRAM_H_ #define __SRAM_H_ #include common.h #include delay.h #include stdlib.h #include debugserial.h #define SDRAM_DEBUG #define SDRAM_BASE_ADDR 0xA0000000 #define SDRAM_SIZE 0x10000000 #define MHZ *10000001 #define SYS_FREQ 60//MHZ #if SYS_FREQ == (120
[单片机]
LPC1788系统时钟的设置
LPC1788有3个独立的振荡器。他们是主振荡器,内部RC振荡器,RTC振荡器。复位后,LPC1788将用内部的RC振荡器运行,直到被软件切换。这样就能在没有任何外部晶振的情况下运行。LPC1788的时钟控制如图1所示(英文手册P35): 使用12M的晶振作为主振荡器,它通过锁相环PLL0来提高频率提供CPU。由于芯片总是从内部的RC振荡器开始工作,因此主振荡器只会应软件的请求而启动。实现方法是设定SCS寄存器中的OSCEN位使能。主振荡器提供一个状态标志SCS寄存器的OSCSTAT位,这样软件就可以确定何时主振荡器在运行稳定。此时,软件可以控制切换到主振荡器,使其作为时钟源。在启动以前,必须通过SCS的OSCRANG
[单片机]
<font color='red'>LPC1788</font>系统时钟的设置
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved