📄 lcd44b0.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 + -