?? display.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 + -