您的位置:首页 > 其它

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

2013-11-25 19:20 423 查看
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 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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: