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

📄 display.c

📁 at91rm9200测试lcd dispaly 的程序
💻 C
字号:
#include "AT91RM9200.h"
#include "display.h"







//use NCS2
//Crt:640*480   LCD:800*480
void Display_Init(char displaysel)
{

		 //Init EBI Reg
		 AT91C_BASE_SMC2->SMC2_CSR[2] = (AT91C_SMC2_NWS & 0x4) | AT91C_SMC2_WSEN | (AT91C_SMC2_TDF & 0x100) | AT91C_SMC2_DBW;

 		 // enable host interface 
		 LREG_MISC = 0x00;  
		 
     // First disable all output devices 
     LREG_DISPLAY_MODE=0x00;
     
     // General I/O Pins Registers 
     LREG_GPIO_CONFIG=0x00;
     LREG_GPIO_CTRL=0x00;

     // Clock Configuration Registers 
     LREG_MEM_CLOCK_CFG=0x01;
     LREG_LCD_PCLK_CFG=0x00;
     LREG_CRTTV_PCLK_CFG=0x00;  
     LREG_MPCLK_CFG=0x00;
     LREG_CPU2MEM_WAIT_SEL=0x02;  

     // Memory Configuration Registers 
     LREG_MEM_CFG=0x00;
     LREG_DRAM_REFRESH=0x05;
     LREG_DRAM_TIMINGS_CTRL0=0x12;
     LREG_DRAM_TIMINGS_CTRL1=0x02;

     // Panel Configuration Registers 
     LREG_PANEL_TYPE=0x25;
     LREG_MOD_RATE=0x00;
     LREG_LCD_HDP=0x63;//800
     LREG_LCD_HNDP=0x12;
     LREG_TFT_FPLINE_START=0x01;
     LREG_TFT_FPLINE_PULSE=0x0b;
     LREG_LCD_VDP0=0xdf;//480
     LREG_LCD_VDP1=0x01;
     LREG_LCD_VNDP=0x2c;
     LREG_TFT_FPFRAME_START=0x0b;
     LREG_TFT_FPFRAME_PULSE=0x01;

     // LCD Display Mode Registers 
     LREG_LCD_DISPLAY_MODE=0x05;
     LREG_LCD_MISC=0x01;
     LREG_LCD_START_ADDR0=0x00;
     LREG_LCD_START_ADDR1=0x00;
     LREG_LCD_START_ADDR2=0x00;
     LREG_LCD_MEM_ADDR_OFFSET0=0x20;
     LREG_LCD_MEM_ADDR_OFFSET1=0x03;
     LREG_LCD_PIXEL_PANNING=0x00;
     LREG_LCD_FIFO_HIGH_THRESHOLD=0x00;
     LREG_LCD_FIFO_LOW_THRESHOLD=0x00;

     // CRT/TV Configuration Registers 
     LREG_CRTTV_HDP=0x4f;//640
     LREG_CRTTV_HNDP=0x13;
     LREG_CRTTV_HRTC_START=0x01;
     LREG_CRT_HRTC_PULSE=0x0b;
     LREG_CRTTV_VDP0=0xdf;//480
     LREG_CRTTV_VDP1=0x01;
     LREG_CRTTV_VNDP=0x2b;
     LREG_CRTTV_VRTC_START=0x09;
     LREG_CRT_VRTC_PULSE=0x01;
     LREG_TV_OUTPUT_CTRL=0x08;

     // CRT/TV Display Mode Registers 
     LREG_CRTTV_DISPLAY_MODE=0x05;
     LREG_CRTTV_START_ADDR0=0x00;
     LREG_CRTTV_START_ADDR1=0x00;
     LREG_CRTTV_START_ADDR2=0x00;
     LREG_CRTTV_MEM_ADDR_OFFSET0=0x80;
     LREG_CRTTV_MEM_ADDR_OFFSET1=0x02;
     LREG_CRTTV_PIXEL_PANNING=0x00;
     LREG_CRTTV_FIFO_HIGH_THRESHOLD=0x00;
     LREG_CRTTV_FIFO_LOW_THRESHOLD=0x00;

     // LCD Ink/Cursor Registers 
     LREG_LCD_INK_CURS_CTRL=0x00;
     LREG_LCD_INK_CURS_START_ADDR=0x01;
     LREG_LCD_CURSOR_X_POS0=0x00;
     LREG_LCD_CURSOR_X_POS1=0x00;
     LREG_LCD_CURSOR_Y_POS0=0x00;
     LREG_LCD_CURSOR_Y_POS1=0x00;
     LREG_LCD_INK_CURS_BLUE0=0x00;
     LREG_LCD_INK_CURS_GREEN0=0x00;
     LREG_LCD_INK_CURS_RED0=0x00;
     LREG_LCD_INK_CURS_BLUE1=0x1f;
     LREG_LCD_INK_CURS_GREEN1=0x3f;
     LREG_LCD_INK_CURS_RED1=0x1f;
     LREG_LCD_INK_CURS_FIFO=0x00;

     // CRT/TV Ink/Cursor Registers 
     LREG_CRTTV_INK_CURS_CTRL=0x00;
     LREG_CRTTV_INK_CURS_START_ADDR=0x01;
     LREG_CRTTV_CURSOR_X_POS0= 0x00;
     LREG_CRTTV_CURSOR_X_POS1= 0x00;
     LREG_CRTTV_CURSOR_Y_POS0= 0x00;
     LREG_CRTTV_CURSOR_Y_POS1= 0x00;
     LREG_CRTTV_INK_CURS_BLUE0= 0x00;
     LREG_CRTTV_INK_CURS_GREEN0= 0x00;
     LREG_CRTTV_INK_CURS_RED0= 0x00;
     LREG_CRTTV_INK_CURS_BLUE1= 0x1f;
     LREG_CRTTV_INK_CURS_GREEN1= 0x3f;
     LREG_CRTTV_INK_CURS_RED1= 0x1f;
     LREG_CRTTV_INK_CURS_FIFO= 0x00;

     // BitBlt Configuration Registers 
     LREG_BITBLT_CTRL0= 0x00;
     LREG_BITBLT_CTRL1= 0x00;
     LREG_BITBLT_ROP_CODE= 0x00;
     LREG_BITBLT_OPERATION= 0x00;
     LREG_BITBLT_SRC_START_ADDR0= 0x00;
     LREG_BITBLT_SRC_START_ADDR1= 0x00;
     LREG_BITBLT_SRC_START_ADDR2= 0x00;
     LREG_BITBLT_DEST_START_ADDR0= 0x00;
     LREG_BITBLT_DEST_START_ADDR1= 0x00;
     LREG_BITBLT_DEST_START_ADDR2= 0x00;
     LREG_BITBLT_MEM_ADDR_OFFSET0= 0x00;
     LREG_BITBLT_MEM_ADDR_OFFSET1= 0x00;
     LREG_BITBLT_WIDTH0= 0x00;
     LREG_BITBLT_WIDTH1= 0x00;
     LREG_BITBLT_HEIGHT0= 0x00;
     LREG_BITBLT_HEIGHT1= 0x00;
     LREG_BITBLT_BACKGND_COLOR0= 0x00;
     LREG_BITBLT_BACKGND_COLOR1= 0x00;
     LREG_BITBLT_FOREGND_COLOR0= 0x00;
     LREG_BITBLT_FOREGND_COLOR1= 0x00;

     // Look-Up Table Registers 
     LREG_LUT_MODE= 0x00;
     LREG_LUT_ADDR= 0x00;
     LREG_LUT_DATA=0x00;

     // Power Save Configuration Registers 
     LREG_PWR_SAVE_CFG= 0x00;
     LREG_PWR_SAVE_STATUS=0x00;

     // Miscellaneous Registers 
     LREG_CPU2MEM_WATCHDOG=0x00;

     // Common Display Mode Register 
     if(displaysel==1)
     {
     		LREG_DISPLAY_MODE=0x01;
     		AT91C_BASE_SYS->PIOC_PER |= 0x00004000;	
		 		AT91C_BASE_SYS->PIOC_OER |= 0x00004000;	
	   		AT91C_BASE_SYS->PIOC_SODR |= 0x00004000;	     
     }
     else 
     {
     		LREG_DISPLAY_MODE=0x02;
     		AT91C_BASE_SYS->PIOC_PER |= 0x00004000;	
		 		AT91C_BASE_SYS->PIOC_OER |= 0x00004000;	
	   		AT91C_BASE_SYS->PIOC_CODR |= 0x00004000;	     
     }
     

    
}

void Display_Fill_Buff(unsigned short usColor,char display)
{
	unsigned int count,count1;
	unsigned short *lcd_addr;
	
	if(display==1)count1=384000;
	else count1=307200;
	lcd_addr=(unsigned short *)REG_LCD_DATA;
	for(count=0;count<count1;count++)	
	{
		*lcd_addr=usColor;
		lcd_addr++;
	}
}


void Display_Draw_Line(char display)
{
	unsigned short x;
	unsigned short y;
	unsigned int count;
	unsigned short *lcd_addr,*temp3;
	float temp1,temp2;
	
	if(display==1)
	{
		x=800;
		y=480;
	}
	else 
	{
		x=640;
		y=480;
	}
	lcd_addr=(unsigned short *)REG_LCD_DATA;//下横线
	lcd_addr+=(x*10+10);
	for(count=0;count<(x-20);count++)	
	{
		*lcd_addr=0x0000;
		lcd_addr++;
	}
	
	lcd_addr=(unsigned short *)REG_LCD_DATA;//上横线
	lcd_addr+=(x*(y-10)+10);
	for(count=0;count<(x-20);count++)	
	{
		*lcd_addr=0x0000;
		lcd_addr++;
	}	
	
	lcd_addr=(unsigned short *)REG_LCD_DATA;//右竖线
	lcd_addr+=(x*10+10);
	for(count=0;count<(y-20);count++)	
	{
		*lcd_addr=0x0000;
		lcd_addr+=x;
	}		
	
	lcd_addr=(unsigned short *)REG_LCD_DATA;//左竖线
	lcd_addr+=(x*10+x-10);
	for(count=0;count<(y-20);count++)	
	{
		*lcd_addr=0x0000;
		lcd_addr+=x;
	}			
	
	lcd_addr=(unsigned short *)REG_LCD_DATA;//左斜线
	lcd_addr+=(x*10+10);
	temp1=(float)(x-20)/(float)(y-20);temp2=0;
	for(count=0;count<(y-20);count++)	
	{
		temp2+=temp1;
		temp3=lcd_addr;
		lcd_addr+=(unsigned short)temp2;		
		*lcd_addr=0x0000;
		lcd_addr=temp3;
		lcd_addr+=x;
	}		
			
	lcd_addr=(unsigned short *)REG_LCD_DATA;//右斜线
	lcd_addr+=(x*10+(x-10));
	temp1=(float)(x-20)/(float)(y-20);temp2=0;
	for(count=0;count<(y-20);count++)	
	{
		temp2+=temp1;
		temp3=lcd_addr;
		lcd_addr-=(unsigned short)temp2;		
		*lcd_addr=0x0000;
		lcd_addr=temp3;
		lcd_addr+=x;
	}				
	
}


void Display_Test(void)
{
	char tmp,display=1;
	
	//Close backlight
  AT91C_BASE_SYS->PIOC_PER |= 0x00004000;	
	AT91C_BASE_SYS->PIOC_OER |= 0x00004000;	
	AT91C_BASE_SYS->PIOC_CODR |= 0x00004000;
	AT91F_DBGU_Printk("\n\r*****************Display Test*******************\n\r");
	AT91F_DBGU_Printk("Input 1:LCD Test 2:CRT Test Other Key:Quit Test\n\r");	
	tmp=AT91F_DBGU_GetChar();
	switch(tmp)
	{

		case '1'://Lcd Display
			AT91F_DBGU_Printk("LCD Test\n\r");
			Display_Init(1);
			display=1;
			break;	
		case '2'://Crt Display
			AT91F_DBGU_Printk("CRT Test\n\r");
			Display_Init(2);
			display=2;
			break;	
		default://Quit
			AT91F_DBGU_Printk("Display Test Is Quit\n\r");
			return;			
	}

	Display_Fill_Buff(0xFFFF,display);
		
	AT91F_DBGU_Printk("\n\rTest Select\n\r");	
	AT91F_DBGU_Printk("Input 0:Quit 1:Red Fill 2:Green Fill 3:Blue Fill 4:Black Fill 5:White Fill 6:Draw Line\n\r");		
	while(1)
	{
		tmp=AT91F_DBGU_GetChar();
		switch(tmp)
		{
			case '0':
					AT91F_DBGU_Printk("\n\rTest Is Quit\n\r");	
				return;
			case '1':
				Display_Fill_Buff(0xF800,display);
				AT91F_DBGU_Printk("\n\rRed Fill Test\n\r");	
				break;				
			case '2':
				Display_Fill_Buff(0x7E0,display);		
				AT91F_DBGU_Printk("\n\rGreen Fill Test\n\r");	
				break;		
			case '3':
				Display_Fill_Buff(0x1F,display);	
				AT91F_DBGU_Printk("\n\rBlue Fill Test\n\r");	
				break;		
			case '4':
				Display_Fill_Buff(0,display);
				AT91F_DBGU_Printk("\n\rBlack Fill Test\n\r");		
				break;		
			case '5':
				Display_Fill_Buff(0xFFFF,display);
				AT91F_DBGU_Printk("\n\rWhite Fill Test\n\r");			
				break;		
			case '6':
				Display_Draw_Line(display);
				AT91F_DBGU_Printk("\n\rDraw Line Test\n\r");	
				break;			
		}
	}
	
}







⌨️ 快捷键说明

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