⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcdlib.c

📁 在arm9实现了一个简单的触摸屏演示实验,可以实现了简单触摸功能.
💻 C
字号:
/*********************************************************************************************
* File name	: lcdlib.c
* Author	: Brian Zheng
* Descript	: lcd库函数文件 
* History
*			Brian Zheng, Programming modify, May 26, 2008
*********************************************************************************************/

#include "lcdlib.h"

//UINT32T	*frameBuffer8Bits;	//声明显示缓冲区
UINT32T (*frameBuffer8Bits)[SCR_XSIZE_CSTN/4];

/*********************************************************************************************
* name:		lcd_port_init
* func:		初始化lcd相关的GPIO端口 
* para:		无
* ret:		无
* modify:
* comment:		
*********************************************************************************************/
void lcd_port_init(void)
{
	rGPCUP = 0xFFFFFFFF;		//上拉寄存器失效
	rGPCCON = 0xAAAAA9AA;		//初始化相应的VD[7:0],LCDVF[2:0],VM,VFRAME,VLINE,VCLK,LEND;特别的此处
								//VM位初始化为01即output,而非10(VM)
	rGPDUP = 0xFFFFFFFF;
	rGPDCON = 0xAAAAAAAA;
	uart_printf("lcd port initialing....\n");
}

void lcd_power_en(void)
{
		//GPG4 is setted as LCD_PWREN
    rGPGUP=rGPGUP&(~(1<<4))|(1<<4);                             // Pull-up disable
    rGPGCON=rGPGCON&(~(3<<8))|(3<<8);                           // GPG4=LCD_PWREN
    
     //Enable LCD POWER ENABLE Function
    rLCDCON5=rLCDCON5&(~(1<<3))|(1<<3);                     // PWREN
    rLCDCON5=rLCDCON5&(~(1<<5))|(0<<5);                  // INVPWREN
}
 
/*********************************************************************************************
* name:		lcd_reg_init
* func:		初始化lcd相关的控制寄存器和地址寄存器
* para:		无
* ret:		无
* modify:
* comment:		
*********************************************************************************************/
void lcd_reg_init(void)
{
	//MY own
	frameBuffer8Bits = (UINT32T (*) [SCR_XSIZE_CSTN/4]) LCDFRAMEBUFFER;
	//frameBuffer8Bits = (UINT32T *)LCDFRAMEBUFFER;	//My frameBuffer8Bits
	rLCDCON1 = (CLKVAL_CSTN << 8) | (0 << 7) | (2 << 5) | (3 << 1) | 0;
	//rLCDCON1 = (CLKVAL_CSTN << 8) | (1 << 7) | (2 << 5) | (3 << 1) | 1; //My LCDCON1
	//|CLKVAL|MVAL used|8-bit single scan display mode (STN) |8 bpp for STN, color mode|Enable video output & LCD control signal|
	
	rLCDCON2 = (0 << 24) | (LINEVAL_CSTN << 14) | (0 << 6) | 0;
	rLCDCON3 = (WDLY_CSTN << 19) | (HOZVAL_CSTN << 8) | (LINEBLANK_CSTN);
	//---------|---WDLY:32 HCLK--|-----HOZVAL---------|-LINEBLANK:16 HCLK--|
	rLCDCON4 = (MVAL_CSTN << 8) | (WLH_CSTN);
	//---------|---MVAL:0x04 ------|--64 HCLK--|
	rLCDCON5 = 0;
	//LCD_PWREN: enable
	
	/*
	rLCDSADDR1 = (((UINT32T)frameBuffer8Bits >> 22) << 21) | (LCDBASEU >> 1);
	//----------|----LCDBANK----------------------|-----LCDBASEU: NOT USE---|
	rLCDSADDR2 = LCDBASEL;
	rLCDSADDR3 = (OFFSET << 11) | PAGEWIDTH;*/
	
	rLCDSADDR1=(((UINT32T)frameBuffer8Bits>>22)<<21 )|M5D((UINT32T)frameBuffer8Bits>>1);
	rLCDSADDR2=M5D( ((UINT32T)frameBuffer8Bits+(SCR_XSIZE_CSTN*LCD_YSIZE_CSTN/1))>>1 );
	rLCDSADDR3=(((SCR_XSIZE_CSTN-LCD_XSIZE_CSTN)/2)<<11)|(LCD_XSIZE_CSTN/2);
	
	/*课件上的值如下,但是实际情况并非如此
	rREDLUT = 0;
	rGREENLUT = 0;
	rBLUELUT = 0;*/
	rREDLUT  =0xfdb96420;
	rGREENLUT=0xfdb96420;
	rBLUELUT =0xfb40;
		
	rDITHMODE = 0;	
}

/*********************************************************************************************
* name:		pixel_display
* func:		将像素显示到指定的坐标点(8位彩色模式下)
* para:		UINT32T x   --  列坐标
*           UINT32T y   --  行坐标
*           UINT32T c   --  颜色值  
* ret:		无
* modify:
* comment:		
*********************************************************************************************/
void pixel_display(INT32T x, INT32T y, INT32T c)
{
	/*My Own
	INT32T dPixelAddr;
	dPixelAddr = (*(UINT32T *)(frameBuffer8Bits + y*(SCR_XSIZE_CSTN/4) + ((x)/4))); 
	
	if ((x < SCR_XSIZE_CSTN) && (y < SCR_YSIZE_CSTN))
	{
	
		
		dPixelAddr = ((dPixelAddr & (~(0xFF000000 >> ((x%4)*8)))) | ((c&0x000000FF) << ((4-(x%4)-1)*8)));
	}*/
	if(x<SCR_XSIZE_CSTN&& y<SCR_YSIZE_CSTN)
        frameBuffer8Bits[(y)][(x)/4]=( frameBuffer8Bits[(y)][x/4]
	    & ~(0xff000000>>((x)%4)*8) ) | ( (c&0x000000ff)<<((4-1-((x)%4))*8) );
}

/*********************************************************************************************
* name:		clear_screen
* func:		用指定的颜色值清屏
* para:		UINT32T c   --  颜色值         
* ret:		无
* modify:
* comment:		
*********************************************************************************************/
void clear_screen(UINT32T c)
{
	INT32T i,j;
	
	for(j=0; j<SCR_YSIZE_CSTN; j++)
		for(i=0; i<SCR_XSIZE_CSTN; i++)
		{
			pixel_display(i,j,c);
		}
		
}

/*********************************************************************************************
* name:		lcd_init
* func:		初始化lcd
* para:		无       
* ret:		无
* modify:
* comment:		
*********************************************************************************************/
void lcd_init(void)
{
	lcd_port_init();
	lcd_reg_init();
	clear_screen(GREEN - 20);
	lcd_power_en();
	LCD_ENVID_ON;
}

/*********************************************************************************************
* name:		draw_lint
* func:		在屏幕指定的坐标点之间画线
* para:		int x1      --  起点横坐标
*           int y1      --  起点纵坐标
*           int x2      --  终点横坐标
*           int y2      --  终点纵坐标
*           int color   --  颜色值          
* ret:		无
* modify:
* comment:		
*********************************************************************************************/
void draw_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)
				{
					pixel_display(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)
				{
					pixel_display(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)
				{
					pixel_display(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)
				{
					pixel_display(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)
				{
					pixel_display(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)
				{
					pixel_display(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)
				{
					pixel_display(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)
				{
					pixel_display(x1,y1,color);
					if(e>0){x1-=1;e-=dy;}	
					y1-=1;
					e+=dx;
				}
			}
		}	
	}
}

/*********************************************************************************************
* name:		draw_rectangle
* func:		过屏幕指定的对角点绘制矩形
* para:		int x1      --  起始对角点横坐标
*           int y1      --  起始对角点纵坐标
*           int x2      --  结束对角点横坐标
*           int y2      --  结束对角点纵坐标
*           int color   --  颜色值          
* ret:		无
* modify:
* comment:		
*********************************************************************************************/
void draw_rectangle(int x1,int y1,int x2,int y2,int color)
{
    draw_line(x1,y1,x2,y1,color);
    draw_line(x2,y1,x2,y2,color);
    draw_line(x1,y2,x2,y2,color);
    draw_line(x1,y1,x1,y2,color);
}

/*********************************************************************************************
* name:		draw_hline
* func:		绘制屏幕指定起始点间铅垂线
* para:		int x1      --  起始点横坐标
*           int y1      --  起始点纵坐标
*           int x2      --  结束点横坐标
*           int y2      --  结束点纵坐标
*           int color   --  颜色值  
*			int width	--  指定宽度        
* ret:		无
* modify:
* comment:		
*********************************************************************************************/
void draw_hline(int x1, int x2, int y, int color, int width)
{
	int i;
	for (i=0; i<width; i++)
	{
		draw_line(x1, y, x2, y, color);
		y++;
	}
}

/*********************************************************************************************
* name:		draw_vline
* func:		绘制屏幕指定起始点间水平线
* para:		int x1      --  起始点横坐标
*           int y1      --  起始点纵坐标
*           int x2      --  结束点横坐标
*           int y2      --  结束点纵坐标
*           int color   --  颜色值
*			int width	--  指定宽度          
* ret:		无
* modify:
* comment:		
*********************************************************************************************/
void draw_vline(int x, int y1, int y2, int color, int width)
{
	int i;
	for (i=0; i<width; i++)
	{
		draw_line(x, y1, x, y2, color);
		x++;
	}
}

/*********************************************************************************************
* name:		draw_rectangle_width
* func:		过屏幕指定的对角点绘制指定宽度的矩形
* para:		int x1      --  起始对角点横坐标
*           int y1      --  起始对角点纵坐标
*           int x2      --  结束对角点横坐标
*           int y2      --  结束对角点纵坐标
*           int color   --  颜色值          
*			int width	--  指定宽度
* ret:		无
* modify:
* comment:		
*********************************************************************************************/
void draw_rectangle_width(int x1, int y1, int x2, int y2, int color, int width)
{
	draw_hline(x1, x2, y1, color, width);
	draw_hline(x1, x2, y2-width+1, color, width);
	draw_vline(x1, y1, y2, color, width);
	draw_vline(x2-width+1, y1, y2, color, width);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -