TQ2440裸板---lcd液晶显示(详细注释)
2013-11-25 19:20
423 查看
lcd.h
lcd.c:
#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 CLK***L_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 = ((CLK***L_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.清屏0x0 8.在长240,宽136的位置显示,颜色为0xffffffff的一个像素点 9.打印提示press any key display four line 10.阻塞,获取任意键 11..清屏0xffffffff 12.显示几条线 13.打印提示press any key display 7 rectangle 14.阻塞,获取任意键 15.清屏0xffffffff 16.布满几块区域 */ 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); }
相关文章推荐
- Java 输入
- 简析javascript 的 window.XMLHttpRequest
- 12--4为小学生出10道计算题
- 服务器端返回json
- [asp.net入门]利用ADO.NET处理数据的简单之处
- RS编码和纠错算法
- 在linux下为php安装mcrypt模块
- ubuntu 13.10上配置打印机
- 37-JavaScript-DOM-小游戏-小球碰撞后折返
- ubuntu 13.10上配置打印机
- 设计模式--装饰者模式--UML
- gcc和g++的区别
- Java学习的30个目标
- 和我一起学习OC吧
- C#中一种可调用的异常处理方法
- mongodb 在slave中统计数据,然后保存到master的表中的javascript脚本代码
- 啊好久没写了- -。。。 现在又开始系统的刷题了,所以还是写写吧- - 首先附上第一道线段树模板题- -。。。
- 添加make menuconfig选项
- (转)android之Fragment(官网资料翻译)
- 矩阵相乘nxn block的计算过程