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

📄 lcd44b0.c

📁 基于三星公司的ARM9 的2410的ucGUI的液晶驱动程序
💻 C
字号:
#include <string.h>#include "\inc\44b.h"#include "\inc\44blib.h"#include "\inc\def.h"#include "\inc\lcdlib.h"#include "..\..\config\LCDConf.h"unsigned int (*frameBuffer1)[SCR_XSIZE/32];unsigned int (*frameBuffer4)[SCR_XSIZE/16];unsigned int (*frameBuffer16)[SCR_XSIZE/8];unsigned int (*frameBuffer256)[SCR_XSIZE/4];void Lcd_Init_44(int depth){    if((U32)frameBuffer256==0)	{	    //The total frame memory should be inside 4MB.	    //For example, if total memory is 8MB, the frame memory 	    //should be in 0xc000000~0xc3fffff or c400000~c7fffff.	    //But, the following code doesn't meet this condition(4MB) 	    //if the code size & location is changed..	    frameBuffer256=(unsigned int (*)[SCR_XSIZE/4])malloc(ARRAY_SIZE_COLOR); 	}    ////////////////////////////	rPDATC = 0xffff;		rPCONC = 0x0f00ff54;		rPUPC  = 0x3000;	rPDATD= 0xff;	rPCOND= 0xaaaa;		rPUPD = 0x0;		rPDATE	= 0x1ff;	rPCONE	= 0x15569;		rPUPE	= 0x6;		///////////////////////////	rLCDCON1=(0x0)|(2<<5)|(MVAL_USED<<7)|(0x3<<8)|(0x3<<10)|(CLKVAL_COLOR<<12);	    // disable,8B_SNGL_SCAN,VM'toggle rate is EACH FRAME,WDLY=16clk,WLH=16clk,CLKVAL=4(60M)	rLCDCON2=(LINEVAL_COLOR)|(HOZVAL_COLOR<<10)|(10<<21);  	    //LINEVAL=240-1,HOZVAL_COLOR,LINEBLANK=10 (without any calculation) 	rLCDSADDR1= (0x3<<27) | ( ((U32)frameBuffer256>>22)<<21 ) | M5D((U32)frameBuffer256>>1);	    // 256-color, LCDBANK, LCDBASEU	rLCDSADDR2= M5D((((U32)frameBuffer256+(SCR_XSIZE*LCD_YSIZE))>>1)) | (MVAL<<21);	    //LCDBASEL  SCR_XSIZE MMODE=0 than MVAL=13	rLCDSADDR3= (LCD_XSIZE/2) | ( ((SCR_XSIZE-LCD_XSIZE)/2)<<9 );        //PAGEWIDTH, OFFSIZE	//The following value has to be changed for better display.		rREDLUT  =0xfdb96420;	//1111,1101,1011,1001,0110,0100,0010,0000	rGREENLUT=0xfdb96420;	rBLUELUT =0xfb40;	rDITHMODE=0x0;	rDP1_2 =0xa5a5;      	rDP4_7 =0xba5da65;	rDP3_5 =0xa5a5f;	rDP2_3 =0xd6b;	rDP5_7 =0xeb7b5ed;	rDP3_4 =0x7dbe;	rDP4_5 =0x7ebdf;	rDP6_7 =0x7fdfbfe;	rLCDCON1=(0x1)|(2<<5)|(MVAL_USED<<7)|(0x3<<8)|(0x3<<10)|(CLKVAL_COLOR<<12);	//display enable	rPDATE=0xfe;}void Lcd_MoveViewPort(int vx,int vy,int depth){    U32 addr;    switch(depth)    {    case 1:    	// LCDBASEU,LCDBASEL register has to be changed before 12 words before the end of VLINE.    	// In mono mode, x=320 is 10 words, So, We can't change LCDBASEU,LCDBASEL     	// during LINECNT=1~0 at mono mode. 	//The processor mode should be superviser mode.      	DisableInterrupt();     #if (LCD_XSIZE<512)    	while((rLCDCON1>>22)<=1); // if x<512    #else	    	while((rLCDCON1>>22)==0); // if x>512 ((12+4)*32)     #endif        addr=(U32)frameBuffer1+(vx/8)+vy*(SCR_XSIZE/8);	rLCDSADDR1= (0x0<<27) | ( (addr>>22)<<21 ) | M5D(addr>>1);	    // monochrome, LCDBANK, LCDBASEU	rLCDSADDR2= M5D( ((addr+(SCR_XSIZE*LCD_YSIZE/8))>>1) ) | (MVAL<<21);	EnableInterrupt();       	break;    case 4:	//The processor mode should be superviser mode.      	DisableInterrupt();     #if (LCD_XSIZE<256)    	while((rLCDCON1>>22)<=1); // if x<256    #else	    	while((rLCDCON1>>22)==0); // if x>256    #endif        addr=(U32)frameBuffer4+(vx/4)+vy*(SCR_XSIZE/4);	rLCDSADDR1= (0x1<<27) | ( (addr>>22)<<21 ) | M5D(addr>>1);	    // 4-gray, LCDBANK, LCDBASEU	rLCDSADDR2= M5D(((addr+(SCR_XSIZE*LCD_YSIZE/4))>>1)) | (MVAL<<21);	EnableInterrupt();    	break;    case 16:	//The processor mode should be superviser mode.      	DisableInterrupt();     #if (LCD_XSIZE<128)    	while((rLCDCON1>>22)<=1); // if x<128    #else	    	while((rLCDCON1>>22)==0); // if x>128    #endif        addr=(U32)frameBuffer16+(vx/2)+vy*(SCR_XSIZE/2);	rLCDSADDR1= (0x2<<27) | ( (addr>>22)<<21 ) | M5D(addr>>1);	    // 16-gray, LCDBANK, LCDBASEU	rLCDSADDR2= M5D(((addr+(SCR_XSIZE*LCD_YSIZE/2))>>1)) | (MVAL<<21);	EnableInterrupt();    	break;    case 256:	//The processor mode should be superviser mode.      	DisableInterrupt();     #if (LCD_XSIZE<64)    	while((rLCDCON1>>22)<=1); // if x<64    #else	    	while((rLCDCON1>>22)==0); // if x>64    #endif        addr=(U32)frameBuffer256+(vx/1)+vy*(SCR_XSIZE/1);	rLCDSADDR1= (0x3<<27) | ( (addr>>22)<<21 ) | M5D(addr>>1);	    // 256-color, LCDBANK, LCDBASEU	rLCDSADDR2= M5D(((addr+(SCR_XSIZE*LCD_YSIZE))>>1)) | (MVAL<<21);	EnableInterrupt();    	break;    }}    void Lcd_DispON(void){	//Delay(5000);   //rPDATC = ( rPDATC | (1<<8) );		//FS44B0X OFF//51EDA ON    //Delay(5000);}void Lcd_DispOFF(void){	//Delay(5000);    //rPDATC = ( rPDATC & (~ (1<<8)) );		//FS44B0X OFF//51EDA ON    //Delay(5000);}void Lcd_PowerReset(void)	{    /*U8 i;    rPDATC = ( rPDATC | 3<<4 );		//crtl=1,adj=1    for(i=0;i<1;i++);    rPDATC = ( rPDATC & (~(1<<5)) );	//ctrl=0    for(i=0;i<2;i++);    rPDATC = ( rPDATC | 1<<5 );		//ctrl=1    for(i=0;i<1;i++);    rPDATC = ( rPDATC & (~(1<<4)) );	//adj=0*/}void Lcd_PowerUp(void){   /* U8 i;    rPDATC = ( rPDATC | 2<<4 );		//ctrl=1,adj=0    for(i=0;i<2;i++);    rPDATC = ( rPDATC | 1<<4 );		//adj=1    for(i=0;i<1;i++);    rPDATC = ( rPDATC & (~(1<<4)) );	//adj=0    for(i=0;i<2;i++);*/}//*****************************************************************************void MoveViewPort(int depth){    int vx=0,vy=0,vd;    vd=(depth==1)*16+(depth==4)*8+(depth==16)*4+(depth==256)*2;    while(1)    {    	switch(Uart_Getch())    	{    	case 'i':	    if(vy>=vd)vy-=vd;    	   	    	    break;    	case 'j':    	    if(vx>=vd)vx-=vd;    	    break;    	case 'k':	    if(vx<=SCR_XSIZE-LCD_XSIZE-vd)vx+=vd;    	    break;    	case 'm':	    if(vy<=(SCR_YSIZE-LCD_YSIZE-vd))vy+=vd;    	   	    	    break;    	case '\r':    	    return;    	default:	    break;	}	Uart_Printf("vx=%3d,vy=%3d\n",vx,vy);	Lcd_MoveViewPort(vx,vy,depth);    }}

⌨️ 快捷键说明

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