自己用的LPC1768的开板带有一块2.4寸的TFT彩色液晶屏,虽然自己工作中还用不过显示屏,但是晚上闲着也是闲着,于是继续玩咱的LPC1768吧。
我的开发板上的液晶屏的用的是SPI接口,当然你也可以把它设计成并行口,其接口电路如下所示: 话说这个液晶屏的驱动芯片是ILI9325,在网上下载了该芯片的数据手册,好家伙有111页,全是E文呀,没办法,谁让咱是小电工呢,就慢慢啃吧。ILI9325这个芯片的寄存器比较多,不过没关系,我们暂时用到的不是太多,这里只要简要的总结,剩下的还是日后用到了再好好研究吧。 1、寄存器03H(Entry Mode),该寄存器主要设置图像的显示模式,包括屏幕的扫描方式(水平扫描或垂直扫描),这直接影响到img2lcd软件(这是个取模软件)的扫描方式控制项。 2、寄存器04H(Resizing Control Register)重新调整大小 寄存器,通过配置该寄存器,可以调整所显示图片的大小。 3、寄存器07H(Display Control 1),配置该寄存器可打开或关闭图形。 4、水平和垂直位置的RAM地址(R50h,R51h,R52h,R53h) 看手册上寄存器不少,不过控制方式不一样,所用到的寄存器不一样,这里不再列举寄存器,想做驱动,一定要看芯片的手册,而且一定要仔细的研究它的手册。话说写液晶驱动不显示图片什么的貌似对不起LCD,当然这次懒猫这次写的驱动也有图片显示,想图片显示当然少不了取模软件,懒猫这次用的取模软件是img2lcd,这个软件功能不错,用起来也比较简单,如果不会用可以查看一下它自带的帮助文件。 注意:LCD的配置方式不同,所设置的扫描方式也不同。 好了,贴上咱写的这个驱动; - /********************************************************************************
- * 函数名称 :GLCD_clear (unsigned short color)
- * 函数描述 : 清屏
- * 入口参数 : 无
- * 出口参数 : 无
- * 备 注:
- *******************************************************************************/
- void GLCD_clear (unsigned short color)
- {
- unsigned int i;
-
- wr_reg(0x20, 0); // 1st line GRAM Data(AD0-AD7)
- wr_reg(0x21, 0); // 1st line GRAM Data(AD8-AD16)
- wr_cmd(0x22);
- for(i = 0; i < (WIDTH*HEIGHT); i++){
- wr_dat(color); // Set color of background
- }
- }
-
- /********************************************************************************
- * 函数名称 :void GLCD_bitmap (unsigned int x, unsigned int y, unsigned int w,
- * unsigned int h, unsigned char *bitmap)
- * 函数描述 : 显示图片
- * 入口参数 : unsigned int x -- Vertical GRAM Start Address
- * unsigned int y -- Horizontal GRAM Start Address
- * unsigned int w -- The width of picture
- * unsigned int h -- The high of picture
- * unsigned char *bitmap -- The array which store picture
- * 出口参数 : 无
- * 备 注:
- *******************************************************************************/
- void GLCD_bitmap (unsigned int x, unsigned int y, unsigned int w, unsigned int h, unsigned char *bitmap)
- {
- unsigned int i;
- unsigned int len = w*h; /* 数组长度 = 图片的width*high(注:元素是16位的) */
-
- /* 用Img2Lcd这个软件生成的数组是char型的(元素是8位的),需转换成short型(元素是16位的) */
- unsigned short *bitmap_ptr = (unsigned short *)bitmap;
-
- wr_reg(0x50, y); /* 水平GRAM起始地址 */
- wr_reg(0x51, y+h-1); /* 水平GRAM结束地址(-1) */
- wr_reg(0x52, x); /* 垂直GRAM起始地址 */
- wr_reg(0x53, x+w-1); /* 垂直GRAM结束地址(-1) */
-
- wr_reg(0x20, y); /* GRAM水平垂直地址设置 */
- wr_reg(0x21, x);
-
- wr_cmd(0x22); /* 写数据到GRAM,AC自动加 */
- for (i = 0; i < len; i++) { /* 开始写数据 */
- wr_dat(*bitmap_ptr++); /* 向GRAM写入数据 */
- }
- }
复制代码
glcd.c- /*********************************************************************************
- 文件名称:GLCD.c
- 功 能: 关于ILI9325的一些函数
- 编译环境: MDKV4.12
- 时 钟: 外部12Mhz
- 日 期: 12/03/19
- 作 者: 懒猫爱飞
- 备 注:NULL
- ---------------------------------------------------------------------------------
- 修改内容:NULL
- 修改日期:XXXX年xx月xx日 xx时xx分
- 修改人员:xxx xxx xxx
-
- **********************************************************************************/
- #include "GLCD.inc"
- /********************************************************************************
- * 函数名称 :__inline static void delay (int cnt)
- * 函数描述 : 简短延时
- * 入口参数 : 无
- * 出口参数 : 无
- * 备 注 :
- *******************************************************************************/
- __inline static void delay (int cnt) {
- cnt <<= DELAY_2N;
- while (cnt--);
- }
- /********************************************************************************
- * 函数名称 :__inline void wr_cmd (unsigned char c)
- * 函数描述 : 通过ssp1向LCD写命令
- * 入口参数 : 无
- * 出口参数 : 无
- * 备 注 :
- *******************************************************************************/
- static __inline void wr_cmd (unsigned char cmd)
- {
- LCD_EN(); /* Enable ILI9325 */
- ssp_send(SSP_START | SSP_WR | SSP_INDEX); /* Write : RS = 0, RW = 0 */
- ssp_send(0);
- ssp_send(cmd); /* Send the command */
- LCD_DIS(); /* Disable ILI9325 */
- }
- /********************************************************************************
- * 函数名称 :__inline void wr_dat (unsigned char dat)
- * 函数描述 : 通过ssp1向LCD写数据
- * 入口参数 : 无
- * 出口参数 : 无
- * 备 注 :
- *******************************************************************************/
- static __inline void wr_dat (unsigned short dat)
- {
- LCD_EN(); /* Enable ILI9325 */
- ssp_send(SSP_START | SSP_WR | SSP_DATA); /* Write : RS = 1, RW = 0 */
- ssp_send((dat >> 8)); /* Write D8..D15 */
- ssp_send((dat & 0xFF)); /* Write D0..D7 */
- LCD_DIS(); /* Disable ILI9325 */
- }
- /********************************************************************************
- * 函数名称 :__inline unsigned short rd_dat (void)
- * 函数描述 : 通过ssp1读取数据
- * 入口参数 : 无
- * 出口参数 : 无
- * 备 注 :
- *******************************************************************************/
- static __inline unsigned short rd_dat (void)
- {
- unsigned short val = 0;
- LCD_EN(); /* Enable ILI9325 */
- ssp_send(SSP_START | SSP_RD | SSP_DATA); /* Read: RS = 1, RW = 1 */
- ssp_send(0); /* Dummy read */
- val = ssp_send(0); /* Read D8..D15 */
- val <<= 8;
- val |= ssp_send(0); /* Read D0..D7 */
- LCD_DIS(); /* Disable ILI9325 */
- return (val);
- }
- /********************************************************************************
- * 函数名称 :__inline void wr_reg (unsigned char reg, unsigned short val)
- * 函数描述 : 通过ssp1向LCD寄存器写数据
- * 入口参数 : 无
- * 出口参数 : 无
- * 备 注 :
- *******************************************************************************/
- static __inline void wr_reg (unsigned char reg, unsigned short val)
- {
- wr_cmd(reg);
- wr_dat(val);
- }
- /********************************************************************************
- * 函数名称 :unsigned short rd_reg (unsigned char reg)
- * 函数描述 : 通过ssp1从LCD寄存器读取数据
- * 入口参数 : 无
- * 出口参数 : 无
- * 备 注 :
- *******************************************************************************/
- static unsigned short rd_reg (unsigned char reg)
- {
- wr_cmd(reg);
- return (rd_dat());
- }
- /********************************************************************************
- * 函数名称 :void GLCD_init (void)
- * 函数描述 : LCD初始化
- * 入口参数 : 无
- * 出口参数 : 无
- * 备 注 :
- *******************************************************************************/
- void GLCD_init (void)
- {
- wr_reg(0xE3, 0x3008);
- wr_reg(0xE7, 0x0012);
- wr_reg(0xEF, 0x1231);
- /* 源扫描设置SS=0, 输出的移动方向是从S1到S720
- * (源扫描设置SS=1, 输出的移动方向是从S720到S1)
- * SM=0,逐行扫描(SM=1,隔行扫描)
- */
- wr_reg(0x00, 0x0001); /* Start internal OSC */
- wr_reg(0x01, 0x0100); /* Set SS and SM bit */
- wr_reg(0x02, 0x0700); /* Set 1 line inversion */
- wr_reg(0x03, 0x1030); /* GRAM为水平扫描方向(BGR=1) */
- //wr_reg(0x03, 0x1031); /* GRAM为垂直扫描方向(BGR=1) */
- wr_reg(0x04, 0x0000); /* Resize register */
- wr_reg(0x08, 0x0207); /* 2 lines each, back and front porch */
- wr_reg(0x09, 0x0000); /* Set non-disp area refresh cyc ISC */
- wr_reg(0x0A, 0x0000); /* FMARK function */
- wr_reg(0x0C, 0x0000); /* RGB interface setting */
- wr_reg(0x0D, 0x0000); /* Frame marker Position */
- wr_reg(0x0F, 0x0000); /* RGB interface polarity */
- /* Power On sequence -------------------------------------------------------*/
- wr_reg(0x10, 0x0000); /* Reset Power Control 1 */
- wr_reg(0x11, 0x0007); /* Reset Power Control 2 */
- wr_reg(0x12, 0x0000); /* Reset Power Control 3 */
- wr_reg(0x13, 0x0000); /* Reset Power Control 4 */
- delay(20); /* Discharge cap power voltage (200ms)*/
- wr_reg(0x10, 0x1690); /* SAP, BT[3:0], AP, DSTB, SLP, STB */
- wr_reg(0x11, 0x0227); /* DC1[2:0], DC0[2:0], VC[2:0] */
- delay(5); /* Delay 50 ms */
- wr_reg(0x12, 0x001B); /* VREG1OUT voltage */
- delay(5); /* Delay 50 ms */
- wr_reg(0x13, 0x1600); /* VDV[4:0] for VCOM amplitude */
- wr_reg(0x29, 0x0018); /* VCM[4:0] for VCOMH */
- wr_reg(0x2B, 0x000C);
- delay(5); /* Delay 50 ms */
- wr_reg(0x20, 0x0000); /* GRAM horizontal Address */
- wr_reg(0x21, 0x0000); /* GRAM Vertical Address */
-
- /* Adjust the Gamma Curve --------------------------------------------------*/
- wr_reg(0x30, 0x0000);
- wr_reg(0x31, 0x0404);
- wr_reg(0x32, 0x0304);
- wr_reg(0x35, 0x0005);
- wr_reg(0x36, 0x1604);
- wr_reg(0x37, 0x0304);
- wr_reg(0x38, 0x0303);
- wr_reg(0x39, 0x0707);
- wr_reg(0x3C, 0x0500);
- wr_reg(0x3D, 0x000F);
-
- /* Set GRAM area -----------------------------------------------------------*/
- wr_reg(0x50, 0x0000); /* Horizontal GRAM Start Address */
- wr_reg(0x51, (HEIGHT-1)); /* Horizontal GRAM End Address */
- wr_reg(0x52, 0x0000); /* Vertical GRAM Start Address */
- wr_reg(0x53, (WIDTH-1)); /* Vertical GRAM End Address */
- wr_reg(0x60, 0xA700); /* Gate Scan Line */
- wr_reg(0x61, 0x0001); /* NDL,VLE, REV */
- wr_reg(0x6A, 0x0000); /* Set scrolling line */
- /* Partial Display Control -------------------------------------------------*/
- wr_reg(0x80, 0x0000);
- wr_reg(0x81, 0x0000);
- wr_reg(0x82, 0x0000);
- wr_reg(0x83, 0x0000);
- wr_reg(0x84, 0x0000);
- wr_reg(0x85, 0x0000);
- /* Panel Control -----------------------------------------------------------*/
- wr_reg(0x90, 0x0010);
- wr_reg(0x92, 0x6000);
- // wr_reg(0x93, 0x0003);
- // wr_reg(0x95, 0x0110);
- // wr_reg(0x97, 0x0000);
- // wr_reg(0x98, 0x0000);
- /* Set GRAM write direction and BGR = 1
- I/D=10 (Horizontal : increment, Vertical : increment)
- AM=1 (address is updated in vertical writing direction) */
- wr_reg(0x03, 0x1038);
- wr_reg(0x07, 0x0133); /* 262K color and display ON */
- BACK_LIGHT_ON(); /* Turn backlight on */
- }
- /********************************************************************************
- * 函数名称 :GLCD_clear (unsigned short color)
- * 函数描述 : 清屏
- * 入口参数 : 无
- * 出口参数 : 无
- * 备 注 :
- *******************************************************************************/
- void GLCD_clear (unsigned short color)
- {
- unsigned int i;
- wr_reg(0x20, 0); // 1st line GRAM Data(AD0-AD7)
- wr_reg(0x21, 0); // 1st line GRAM Data(AD8-AD16)
- wr_cmd(0x22);
- for(i = 0; i < (WIDTH*HEIGHT); i++){
- wr_dat(color); // Set color of background
- }
- }
- /********************************************************************************
- * 函数名称 :void GLCD_bitmap (unsigned int x, unsigned int y, unsigned int w,
- * unsigned int h, unsigned char *bitmap)
- * 函数描述 : 显示图片
- * 入口参数 : unsigned int x -- Vertical GRAM Start Address
- * unsigned int y -- Horizontal GRAM Start Address
- * unsigned int w -- The width of picture
- * unsigned int h -- The high of picture
- * unsigned char *bitmap -- The array which store picture
- * 出口参数 : 无
- * 备 注 :
- *******************************************************************************/
- void GLCD_bitmap (unsigned int x, unsigned int y, unsigned int w, unsigned int h, unsigned char *bitmap)
- {
- unsigned int i;
- unsigned int len = w*h; /* 数组长度 = 图片的width*high(注:元素是16位的) */
- /* 用Img2Lcd这个软件生成的数组是char型的(元素是8位的),需转换成short型(元素是16位的) */
- unsigned short *bitmap_ptr = (unsigned short *)bitmap;
- wr_reg(0x50, y); /* 水平GRAM起始地址 */
- wr_reg(0x51, y+h-1); /* 水平GRAM结束地址(-1) */
- wr_reg(0x52, x); /* 垂直GRAM起始地址 */
- wr_reg(0x53, x+w-1); /* 垂直GRAM结束地址(-1) */
- wr_reg(0x20, y); /* GRAM水平垂直地址设置 */
- wr_reg(0x21, x);
- wr_cmd(0x22); /* 写数据到GRAM,AC自动加 */
- for (i = 0; i < len; i++) { /* 开始写数据 */
- wr_dat(*bitmap_ptr++); /* 向GRAM写入数据 */
- }
- }
复制代码
主程序:- /*********************************************************************************
- 工程名称:lesson8
- 功 能: 学习使用TFT屏
- 编译环境: MDKV4.12
- 时 钟: 外部12Mhz
- 日 期: 12/04/12
- 作 者: 懒猫爱飞
- 版本 号:V1R0
- ---------------------------------------------------------------------------------
- 修改内容:NULL
- 修改日期:
- 修改人员:
- ---------------------------------------------------------------------------------
-
- **********************************************************************************/
- /*********************************************************************************
- 文件名称:mian.c
- 功 能: 主要调度函数及应用函数
- 编译环境: MDKV4.12
- 时 钟: 外部12Mhz
- 日 期: 11/09/14
- 作 者: 懒猫爱飞
- 备 注:NULL
- ---------------------------------------------------------------------------------
- 修改内容:NULL
- 修改日期:XXXX年xx月xx日 xx时xx分
- 修改人员:xxx xxx xxx
-
- **********************************************************************************/
- #include"includes.h"
-
- /* 全局变量声明 */
- /* 局部变量声明 */
- unsigned char OpenString[][50] = {
- "**********************************************\r\n",
- "**** --欢迎光临-- ****\r\n",
- "**** 小野兽的小草窝^_^ ****\r\n",
- "**** http://blog#ednchina#com/ytfdhb/ ****\r\n",
- "**** 我是懒猫爱飞,我的口号是: ****\r\n",
- "**** 每天进步一点点,开心多一点^_^ ****\r\n",
- "**********************************************\r\n"
- };
- unsigned short colortab[16] = {Black,Navy,DarkGreen,DarkCyan ,Maroon ,Purple,Olive,LightGrey ,
- DarkGrey,Blue,Green,Cyan,Red,Magenta,Yellow,White};
- /* 函数声明 */
- void board_init(void); /* 系统初始始化 */
- /********************************************************************************
- * 函数名称 :int main(void)
- * 函数功能 : 主函数
- * 入口参数 : 无
- * 出口参数 : 无
- * 备 注 :无
- *******************************************************************************/
- int main(void)
- {
- unsigned int i = 0;
- //unsigned char cnt = 0;
- board_init(); /* 系统初始化 */
- for(i=0;i<7;i++)
- {
- UARTSend(0,OpenString[i],50); /* 发送欢迎信息 */
- }
- GLCD_init();
- GLCD_clear(Red);
- DelayMs(500);
-
-
- //GLCD_bitmap ( 0, 0, 320, 128, ARM_Ani_16bpp_fh_fv);
- //GLCD_bitmap (30, 10, 259, 99, (unsigned char *)gImage_dd); // 已正确显示
- //GLCD_bitmap (0, 0, 320, 240, (unsigned char *)gImage_love);
- //DelayMs(2000);
- //GLCD_clear(0x0000);
- //GLCD_bitmap (0, 0, 320, 240, (unsigned char *)gImage_great);
- //DelayMs(2000);
- //DelayMs(2000);
- while(1)
- {
- GLCD_bitmap (0, 0, 320, 240, (unsigned char *)gImage_great);
- DelayMs(5000);
- GLCD_bitmap (0, 0, 320, 240, (unsigned char *)gImage_love);
- DelayMs(5000);
- GLCD_bitmap (0, 0, 320, 240, (unsigned char *)gImage_butterfly);
- DelayMs(5000);
- //GLCD_bitmap (0, 0, 320, 240, (unsigned char *)gImage_beauty);
- //DelayMs(3000);
- //GLCD_bitmap (0, 0, 320, 240, (unsigned char *)gImage_hand);
- //DelayMs(3000);
- //GLCD_bitmap (0, 0, 320, 240, (unsigned char *)gImage_aether);
- //DelayMs(3000);
-
- }
- }
- /********************************************************************************
- * 函数名称 :void board_init(void)
- * 函数功能 : 初始化系统
- * 入口参数 : 无
- * 出口参数 : 无
- * 备 注 :无
- *******************************************************************************/
- void board_init(void)
- {
- SystemInit(); /* 系统初始化,函数在system_LPC17xx.c文件夹中定义 */
- SysTick_init (); /* 配置节拍定时器中断,每1ms中断一次 */
-
- PortInit(); /* 端口初始化 */
- //DACInit(); /* DAC初始化 */
- //AdcInit(); /* ADCC初始化 */
- UARTInit(0,19200); /* 设置串口0波特率 */
- ssp_init();
- //init_ssp();
- }
复制代码
由于原代码比较多,这里只贴上部分函数,具体的代码,请参考附件,这里上传几张效果图,懒猫已把液晶屏显示字符,显示汉字,画圆,画线等的程序写好了,改天整理一下也发上来,下一步弄一下SD卡,USB方面的东东,今天先写这么多吧。
每天进步一点点,开心多一点^_^
完整程序源代码工程文件下载地址:
21935.rar
(1.55 MB, 下载次数: 31)
|