TQ2440裸板---lcd液晶显示(详细注释)

来源:互联网 发布:java 引用类型 编辑:程序博客网 时间:2024/04/28 10:39
lcd.h
#include "uart.h"#include <stdlib.h>#include <string.h>#include "def.h"#include "option.h"#include "2440addr.h"#include "2440lib.h"#include "2440slib.h"#define MVAL      (13)#define MVAL_USED (0)   //MMODE#define INVVDEN   (1)#define BSWP      (0)#define HWSWP     (1)#define PNRMODE   (3)#define BPPMODE   (12)#define LCD_XSIZE_TFT (480)#define LCD_YSIZE_TFT (272)#define SCR_XSIZE_TFT (480)#define SCR_YSIZE_TFT (272)#define VBPD   (2)#define VFPD   (4)#define VSPW   (8)#define HBPD   (10)#define HFPD   (19)#define HSPW   (30)#define CLKAVL_TFT (4)#define FRM565  (1)#define LINEVAL (LCD_YSIZE_TFT-1)#define HOZVAL  (LCD_XSIZE_TFT-1)#define M5D(n)  ((n) & 0x1fffff)volatile unsigned short LCD_BUFFER[SCR_YSIZE_TFT][SCR_XSIZE_TFT];void lcd_init(void){rGPCUP = 0x00000000;rGPCCON = 0xaaaa02a9;rGPDUP = 0x0;rGPDCON = 0xaaaaaaaa;//设置频率 |  确定vm的改变速度,设置为每帧变化模式  | 设置扫描方式 | 确定每个像素的位数模式rLCDCON1 = ((CLKAVL_TFT<<8)|(MVAL_USED<<7)|(MVAL_USED<<5)|(BPPMODE<<1)|0);//看时序图 |  确定显示的垂直方向的尺寸  |看时序图 |看时序图 rLCDCON2 = ((VBPD<<24)|(LINEVAL<<14)|(VFPD<<6)|(VSPW));//看时序图 |  确定显示的水平方向的尺寸  |看时序图 rLCDCON3 = ((HBPD<<19)|(HOZVAL<<8|(HFPD)));//看时序图 |看时序图 (bit[15:8] MVAL,只有当LCDCON1 bit[7]  MMODE=1才有效);bit[7:0](5:HSPW)rLCDCON4 = ((MVAL<<8)|(HSPW));//颜色格式设置rLCDCON5 = ((FRM565<<11)|(1<<9)|(1<<8)|(BSWP<<1)|(HWSWP));//视频帧缓冲区内存地址30-22位 | 视频帧缓冲区的开始地址21-1位rLCDSADDR1 = ((((U32)LCD_BUFFER>>22)<<21)|(M5D((U32)LCD_BUFFER>>1)));//视频帧缓冲区的结束地址21-1位rLCDSADDR2 = M5D(((U32)LCD_BUFFER + (SCR_XSIZE_TFT*SCR_YSIZE_TFT*2))>>1);//帧缓冲的对于屏幕的偏移 | 显示的宽度rLCDSADDR3 = (((SCR_XSIZE_TFT - LCD_XSIZE_TFT) << 11) | (LCD_XSIZE_TFT));rLCDINTMSK |= (3);//禁止LPC3600/LCC3600模式rTCONSEL &= (~7);//禁止调色板rTPAL = 0;}//设置lcd显示器的开关void lcd_envidONOFF(int onoff){if(onoff == 1){rLCDCON1 |= 1;}else{rLCDCON1 &= (~1);}}void lcd_ClearScr(U32 c){unsigned int x, y;for(y=0; y < SCR_YSIZE_TFT; y++){for(x=0; x<SCR_XSIZE_TFT; x++){LCD_BUFFER[y][x] = c;}}}void putPixel(U32 x, U32 y, U32 c){if((x<SCR_XSIZE_TFT) && (y<SCR_YSIZE_TFT))LCD_BUFFER[(y)][(x)] = c;}void glib_line(int x1, int y1, int x2, int y2, int color){int dx, dy, e;dx = x2 - x1;dy = y2 - y1;if(dx>=0){if(dy >= 0) // dy>=0{if(dx>=dy) // 1/8 octant{e=dy-dx/2;while(x1<=x2){putPixel(x1,y1,color);if(e>0){y1+=1;e-=dx;}x1+=1;e+=dy;}}else// 2/8 octant{e=dx-dy/2;while(y1<=y2){putPixel(x1,y1,color);if(e>0){x1+=1;e-=dy;}y1+=1;e+=dx;}}}else   // dy<0{dy=-dy;   // dy=abs(dy)if(dx>=dy) // 8/8 octant{e=dy-dx/2;while(x1<=x2){putPixel(x1,y1,color);if(e>0){y1-=1;e-=dx;}x1+=1;e+=dy;}}else// 7/8 octant{e=dx-dy/2;while(y1>=y2){putPixel(x1,y1,color);if(e>0){x1+=1;e-=dy;}y1-=1;e+=dx;}}}}else //dx<0{dx=-dx;//dx=abs(dx)if(dy >= 0) // dy>=0{if(dx>=dy) // 4/8 octant{e=dy-dx/2;while(x1>=x2){putPixel(x1,y1,color);if(e>0){y1+=1;e-=dx;}x1-=1;e+=dy;}}else// 3/8 octant{e=dx-dy/2;while(y1<=y2){putPixel(x1,y1,color);if(e>0){x1-=1;e-=dy;}y1+=1;e+=dx;}}}else   // dy<0{dy=-dy;   // dy=abs(dy)if(dx>=dy) // 5/8 octant{e=dy-dx/2;while(x1>=x2){putPixel(x1,y1,color);if(e>0){y1-=1;e-=dx;}x1-=1;e+=dy;}}else// 6/8 octant{e=dx-dy/2;while(y1>=y2){putPixel(x1,y1,color);if(e>0){x1-=1;e-=dy;}y1-=1;e+=dx;}}}}}void glib_filledrectangle(int x1, int y1, int x2, int y2, int color){int i;for (i= y1; i<=y2; i++)glib_line(x1, i, x2, i, color);}


lcd.c:

#define GLOBAL_CLK 1#include "uart.h"#include <stdlib.h>#include <string.h>#include "def.h"#include "option.h"#include "2440addr.h"#include "2440lib.h"#include "2440slib.h"#include "lcd.h"/**1.关闭看门狗2.初始化串口配置3.初始化lcd配置4.开启lcd显示屏5.打印提示press any key display a white pixel in (240,136)6.阻塞,获取任意键7.清屏0x08.在长240,宽136的位置显示,颜色为0xffffffff的一个像素点9.打印提示press any key display four line10.阻塞,获取任意键11..清屏0xffffffff12.显示几条线13.打印提示press any key display 7 rectangle14.阻塞,获取任意键15.清屏0xffffffff16.布满几块区域*/int Main(void){//关闭看门狗rWTCON = 0x0;//初始化串口配置init_uart();//初始化lcd配置lcd_init();//开启lcd显示屏lcd_envidONOFF(1);uart_printf("\npress any key display a white pixel in (240,136)\n");//任意键阻塞uart_getch();//清屏lcd_ClearScr(0x0);//显示putPixel(240,136,0xffffffff);uart_printf("\npress any key display four line\n");uart_getch();lcd_ClearScr(0xffffffff);glib_line(0, 0, LCD_XSIZE_TFT, LCD_YSIZE_TFT, 0x0);glib_line(0, LCD_YSIZE_TFT, LCD_XSIZE_TFT, 0, 0x0);glib_line(0, LCD_YSIZE_TFT/2, LCD_XSIZE_TFT, LCD_YSIZE_TFT/2, 0x0);glib_line(LCD_XSIZE_TFT/2, 0, LCD_XSIZE_TFT/2, LCD_YSIZE_TFT, 0x0);uart_printf("\npress any key display 7 rectangle\n");uart_getch();lcd_ClearScr(0xffffffff);glib_filledrectangle(0,0,480,38, 0x001f);glib_filledrectangle(0,40,480,78, 0x07e0);glib_filledrectangle(0,80,480,118, 0xf800);glib_filledrectangle(0,120,480,158, 0xffe0);glib_filledrectangle(0,160,480,198, 0xf81f);glib_filledrectangle(0,200,480,238, 0x07ff);glib_filledrectangle(0,240,480,272, 0x0);while(1);}