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

📄 lcd1.8_mt18g09j_160x128_8_v1.c

📁 MT18G09J
💻 C
字号:
//******************************************************************************
#define     _IN_LCD_LTPS
//------------------------------------------------------------------------------
#include "Memap.h"
#include "Macro.h"
#include "Lcd.h"

#include "Byte2Word.h"

//#define     DATA_BUS_WIDTH  8

#define     LCD_INIT_NORMAL     0
#define     LCD_MP4_INIT        1
#define     LCD_JPEG_INIT       2
#define     LCD_JPEG_X_INIT     3       

void LCD_DlyTmrMs(unsigned int tmr)
{
    unsigned int i;
    unsigned int j;
    while(tmr){
        for(j=0; j<0x5000; j++){    //OSC = 24M 时,time is 6ms (j<4000)
            //i += j;
            asm("nop");
            asm("nop");
            asm("nop");
            asm("nop");
        }
        tmr--;
    }
}


//------------------------------------------------------------------------------
void LCD_Command(unsigned int cmd)
{
#if (DATA_BUS_WIDTH==8)
    write_XDATA(LCD_COMMAND,(cmd>>8));
#endif
    write_XDATA(LCD_COMMAND,cmd);
}

void LCD_Data(unsigned int data)
{
#if (DATA_BUS_WIDTH==8)
    write_XDATA(LCD_DATA,(data>>8));
#endif    
    write_XDATA(LCD_DATA,data);
}

void LCD_Reg_Set(unsigned int cmd,unsigned int data)
{
#if (DATA_BUS_WIDTH==8)
    write_XDATA(LCD_COMMAND,(cmd>>8));
#endif
    write_XDATA(LCD_COMMAND,cmd);
    
#if (DATA_BUS_WIDTH==8)
    write_XDATA(LCD_DATA,(data>>8));
#endif    
    write_XDATA(LCD_DATA,data);
}

unsigned int LCD_StatusRead(void)
{
    unsigned int i,j;
    i = read_XDATA(LCD_COMMAND);
    return i;
}


void LCD_PowerOff(void)
{

}

void LCDDEV_Init(unsigned int InitType)
{
    LCD_Reg_Set(0x0000, 0x0001);
    
    LCD_DlyTmrMs(5);

if(InitType == LCD_JPEG_INIT){
    //LCD_Reg_Set(0x0001, 0x0113);	    //竖
    LCD_Reg_Set(0x0001, 0x0213);	    //竖
}else{
    //LCD_Reg_Set(0x0001, 0x0013);        //横
    LCD_Reg_Set(0x0001, 0x0313);        //横
}
    
    LCD_Reg_Set(0x0002, 0x0700);
    
if(InitType == LCD_JPEG_INIT){    
    LCD_Reg_Set(0x0005, 0x1030);	    //竖
}else{
    LCD_Reg_Set(0x0005, 0x1038);        //横       
}
    
    LCD_Reg_Set(0x0025, 0x0000);
    LCD_Reg_Set(0x0026, 0x0000);
    
    LCD_Reg_Set(0x0008, 0x0202);
    LCD_Reg_Set(0x000A, 0x0000);
    LCD_Reg_Set(0x000B, 0x0000);
    
    LCD_Reg_Set(0x000D, 0x0000);
    LCD_DlyTmrMs(5);
    
    LCD_Reg_Set(0x000E, 0x0000);
    LCD_DlyTmrMs(5);
    
    LCD_Reg_Set(0x0007, 0x0000);
    LCD_DlyTmrMs(5);
    
    LCD_Reg_Set(0x000C, 0x0000);
    LCD_Reg_Set(0x0009, 0x0000);
    LCD_DlyTmrMs(5);
    
    LCD_Reg_Set(0x000D, 0x0003);
    LCD_DlyTmrMs(5);
    
    LCD_Reg_Set(0x000E, 0x1016);
    LCD_DlyTmrMs(5);
    
    LCD_Reg_Set(0x000D, 0x0013);
    LCD_DlyTmrMs(5);
    
    LCD_Reg_Set(0x0003, 0x0410);
    LCD_DlyTmrMs(5);
    
    LCD_Reg_Set(0x000E, 0x2D16);
    LCD_DlyTmrMs(5);
    
    LCD_Reg_Set(0x0009, 0x0004);
    LCD_DlyTmrMs(5);

    LCD_Reg_Set(0x000D, 0x0018);
    LCD_DlyTmrMs(5);
    
    LCD_Reg_Set(0x0030, 0x0004);
    LCD_Reg_Set(0x0031, 0x0606);
    LCD_Reg_Set(0x0032, 0x0505);
    
    LCD_Reg_Set(0x0034, 0x0505);
    LCD_Reg_Set(0x0035, 0x0707);
    LCD_Reg_Set(0x0036, 0x0105);
    
    LCD_Reg_Set(0x0033, 0x0206);
    LCD_Reg_Set(0x0037, 0x0301);
    LCD_Reg_Set(0x003A, 0x1A00);
    LCD_Reg_Set(0x003B, 0x010E);

    LCD_Reg_Set(0x0016, 0x7F00);
    LCD_Reg_Set(0x0017, 0x9F00);
    
    LCD_Reg_Set(0x0021, 0x0000);
    
    LCD_Reg_Set(0x000F, 0x0000);
    LCD_Reg_Set(0x0007, 0x0005);
    LCD_DlyTmrMs(10);
    
    LCD_Reg_Set(0x0007, 0x0025);
    LCD_Reg_Set(0x0007, 0x0027);
    LCD_DlyTmrMs(10);
    
    LCD_Reg_Set(0x0007, 0x0037);
    LCD_DlyTmrMs(5);
    
    LCD_Reg_Set(0x0003, 0x0110);
    LCD_Reg_Set(0x000D, 0x0013);
    LCD_Reg_Set(0x000E, 0x2A18);

    LCD_Command(0x0022);
}


void LCD_Init(void)
{
    unsigned int x, y;
    //LCDDEV_Init(LCD_INIT_NORMAL);

    //LCD_Reg_Set(0x0001, 0x0013);        //横
    LCD_Reg_Set(0x0001, 0x0313);        //横
    LCD_Reg_Set(0x0005, 0x1038);        //横       
    LCD_Reg_Set(0x0021, 0x0000);
    LCD_Command(0x0022);
    for(x=0;x<128;x++){
	    for(y=0;y<160;y++){
		    #if (DATA_BUS_WIDTH==8)
                write_XDATA(LCD_DATA,0x0000);
            #endif 
			    write_XDATA(LCD_DATA,0x0000);
		}
	}
}

void LCD_SetDispAddr(int x, int y)
{
	LCD_Reg_Set(0x21, ((x<<8) | y));
	LCD_Command(0x22);
}

void LCDDEV_SetWindow(int x0, int y0, int x1, int y1)
{
	LCD_Reg_Set(0x0016, ((y1<<8)|y0));
	LCD_Reg_Set(0x0017, ((x1<<8)|x0));
	LCD_SetDispAddr(x0, y0);		
}

void LCDDEV_RevertWindow(int x0, int y0, int x1, int y1)
{
	LCD_Reg_Set(0x0016, ((y1<<8)|y0));
	LCD_Reg_Set(0x0017, ((x1<<8)|x0));
}

void LCD_ReadBitmap(int x0, int y0, int xsize, int ysize, unsigned int *pData)
{
	int x1, y1;
	x1 = x0+xsize-1; 
	y1 = y0+ysize-1; 
	LCDDEV_SetWindow(x0, y0, x1, y1);
    #if (DATA_BUS_WIDTH==8)
        read_XDATA(LCD_DATA);
    #endif 
	read_XDATA(LCD_DATA);
	for(y1=0; y1<ysize; y1++){
		for(x1=0; x1<xsize; x1++){
		    #if (DATA_BUS_WIDTH==8)
                *pData =  (read_XDATA(LCD_DATA)&0xFF)<<8;
                *pData |= read_XDATA(LCD_DATA)&0xFF;
            #else
                *pData++ = read_XDATA(LCD_DATA);
            #endif 
			
		}
	}
		
	LCDDEV_RevertWindow(0, 0, LCD_MAX_XSIZE-1, LCD_MAX_YSIZE-1);
}


unsigned int LCD_GetPixel(int x, int y)
{
	unsigned int color;
	
	LCD_SetDispAddr(x,y);
	#if (DATA_BUS_WIDTH==8)
        color =  read_XDATA(LCD_DATA);
	    color =  read_XDATA(LCD_DATA);
	    color =  (read_XDATA(LCD_DATA)&0xFF)<<8;
	    color |= (read_XDATA(LCD_DATA)&0xFF);
    #else	
	    color = read_XDATA(LCD_DATA);
	    color = read_XDATA(LCD_DATA);
	#endif
	return(color);	
}

void LCD_SetPixel(int x, int y, unsigned int color)
{
	LCD_SetDispAddr(x,y);
#if (DATA_BUS_WIDTH==8)
    write_XDATA(LCD_DATA,(color>>8));
#endif    
    write_XDATA(LCD_DATA,color);	
	//write_XDATA(LCD_DATA,color);
}

void LCD_XorPixel(int x, int y)
{
	unsigned int color;
	color = LCD_GetPixel(x,y);
	LCD_SetPixel(x,y,0xFFFF-color);			
}

unsigned int LCDDEV_GetPixel(int x, int y)
{
	unsigned int color;
	
	LCD_SetDispAddr(x, y);
	#if (DATA_BUS_WIDTH==8)
        color =  read_XDATA(LCD_DATA);
	    color =  read_XDATA(LCD_DATA);
	    color =  (read_XDATA(LCD_DATA)&0xFF)<<8;
	    color |= (read_XDATA(LCD_DATA)&0xFF);
    #else	
	    color = read_XDATA(LCD_DATA);
	    color = read_XDATA(LCD_DATA);
	#endif
	return(color);	
}
void LCDDEV_SetPixel(int x, int y, unsigned int color)
{
	LCD_SetDispAddr(x, y);
#if (DATA_BUS_WIDTH==8)
    write_XDATA(LCD_DATA,(color>>8));
#endif    
    write_XDATA(LCD_DATA,color);	
	//write_XDATA(LCD_DATA,color);
}

void LCDDEV_XorPixel(int x, int y)
{
	unsigned int color;
	color = LCDDEV_GetPixel(x,y);
	LCDDEV_SetPixel(x,y,0xFFFF-color);			
}


void LCDDEV_DrawHLine(int x0, int y, int x1)
{
	if (LCD_Context.DrawMode & LCD_DRAWMODE_XOR){
		for(; x0<=x1; x0++){
			LCDDEV_XorPixel(x0, y);
		}
	}else{
		LCDDEV_SetWindow(x0, y, x1, y);
		for(; x0<=x1; x0++){
		    #if (DATA_BUS_WIDTH==8)
		        write_XDATA(LCD_DATA, (LCD_COLOR>>8));
		    #endif
			    write_XDATA(LCD_DATA, LCD_COLOR);
		}
		LCDDEV_RevertWindow(0, 0, LCD_MAX_XSIZE-1, LCD_MAX_YSIZE-1);
	}
}

void LCDDEV_DrawVLine(int x, int y0, int y1)
{
    unsigned int color;
    
	if (LCD_Context.DrawMode & LCD_DRAWMODE_XOR){
		for(; y0<=y1; y0++){
			LCDDEV_XorPixel(x, y0);
		}
	}else{
	    if(LCD_Context.DrawMode == LCD_DRAWMODE_REV)
	        color = LCD_BKCOLOR;
	    else
	        color = LCD_COLOR;
		LCDDEV_SetWindow(x, y0, x, y1);
		for(; y0<=y1; y0++){
		    #if (DATA_BUS_WIDTH==8)
		        write_XDATA(LCD_DATA, (color>>8));
		    #endif
			    write_XDATA(LCD_DATA, color);
		}	
		LCDDEV_RevertWindow(0, 0, LCD_MAX_XSIZE-1, LCD_MAX_YSIZE-1);
	}
}

void LCDDEV_FillRect(int x0, int y0, int x1, int y1)
{
    unsigned int color;
	int i;
	if (LCD_Context.DrawMode & LCD_DRAWMODE_XOR){
		for(; y0<=y1; y0++){
			LCDDEV_DrawHLine(x0, y0, x1);
		}
	}else{
	    if(LCD_Context.DrawMode == LCD_DRAWMODE_REV)
	        color = LCD_BKCOLOR;
	    else
	        color = LCD_COLOR;
		LCDDEV_SetWindow(x0, y0, x1, y1);
		for(; y0<=y1 ; y0++){
			i = x0;
			for(; i<=x1; i++){
			    #if (DATA_BUS_WIDTH==8)
		            write_XDATA(LCD_DATA, (color>>8));
		        #endif
				write_XDATA(LCD_DATA, color);
			}
		}
		
		LCDDEV_RevertWindow(0, 0, LCD_MAX_XSIZE-1, LCD_MAX_YSIZE-1);
	}
}

void LCDDEV_DrawBitLine1BPP(int x, int y, int xsize, int Diff, unsigned int *pData) 
{
  	x += Diff;

	switch(LCD_Context.DrawMode){
		case LCD_DRAWMODE_REV:
			while(xsize){
				if(*pData & (0x8000 >> Diff))
					LCDDEV_SetPixel(x, y, LCD_BKCOLOR);
				else
					LCDDEV_SetPixel(x, y, LCD_COLOR);
				x++;
				xsize--;
				if(++Diff == 16){
					Diff = 0;
					pData++;
				}
			}
			break;
		case LCD_DRAWMODE_TRANS:
			while(xsize){
				if(*pData & (0x8000 >> Diff))
					LCDDEV_SetPixel(x, y, LCD_COLOR);
				x++;
				xsize--;
				if(++Diff == 16){
					Diff = 0;
					pData++;
				}
			}
			break;
		case LCD_DRAWMODE_XOR:
			while(xsize){
				if(*pData & (0x8000 >> Diff))
					LCDDEV_XorPixel(x,y);
				x++;
				xsize--;
				if(++Diff == 16){
					Diff = 0;
					pData++;
				}
			}
			break;
	    case LCD_DRAWMODE_CIR90:
	        while(xsize){
				if(*pData & (0x8000 >> Diff))
					LCDDEV_SetPixel(x, y, LCD_COLOR);
				y++;
				xsize--;
				if(++Diff == 16){
					Diff = 0;
					pData++;
				}
			}
	        break;
		default:
		    while(xsize){
				if(*pData & (0x8000 >> Diff))
					LCDDEV_SetPixel(x, y, LCD_COLOR);
				else
					LCDDEV_SetPixel(x, y, LCD_BKCOLOR);
				x++;
				xsize--;
				if(++Diff == 16){
					Diff = 0;
					pData++;
				}
			}
			break;
	}	
}

void LCDDEV_DrawBitLine16BPP(int x0, int y0, int xsize, int ysize, unsigned int *pData) 
{
	int x1,y1;
	unsigned int i;
	
	x1 = x0+xsize-1;
	y1 = y0+ysize-1;
	LCDDEV_SetWindow(x0, y0, x1, y1);
	for(; ysize>0; ysize--){
		i = xsize;
		for(; i>0; i--){
		    #if (DATA_BUS_WIDTH==8)
		        write_XDATA(LCD_DATA, (*pData>>8));
		    #endif
			    write_XDATA(LCD_DATA, *pData++);
		}
	}
		
	LCDDEV_RevertWindow(0, 0, LCD_MAX_XSIZE-1, LCD_MAX_YSIZE-1);
}

void LCDDEV_DrawBitmap(int x0,    		int y0,
                       int xsize, 		int ysize,
                       int BitsPerPixel,	int BytesPerLine,
                       unsigned int *pData, 		int Diff)
{
  	int i;
   	switch (BitsPerPixel) {
   		case 1:
   		    if(LCD_Context.DrawMode == LCD_DRAWMODE_CIR90){
   			    for(i=0; i<ysize; i++){ 
   	                LCDDEV_DrawBitLine1BPP(x0+i, y0, xsize, Diff, pData);
   	                pData += BytesPerLine;
   	                }
   		    }else{
   			    for(i=0; i<ysize; i++){ 
   				LCDDEV_DrawBitLine1BPP(x0, i+y0, xsize, Diff, pData);
   				pData += BytesPerLine;
   			    }
   			}
   			break;
   		case 16:
       		LCDDEV_DrawBitLine16BPP(x0, y0, xsize, ysize, pData);
       	break;
   	}
}

void MP4_LCD_Init(void)
{
//    unsigned int x, y;
//    LCD_SetDispAddr(0, 0);
//    for(y=0; y<LCD_MAX_YSIZE; y++){
//        for(x=0; x<LCD_MAX_XSIZE; x++){
//            #if (DATA_BUS_WIDTH==8)
//                write_XDATA(LCD_DATA, 0x0000);
//            #endif
//                write_XDATA(LCD_DATA, 0x0000);
//        }
//    }
//    LCDDEV_Init(LCD_MP4_INIT);
    //LCD_Reg_Set(0x0001, 0x0013);        //横
    LCD_Reg_Set(0x0001, 0x0313);        //横
    LCD_Reg_Set(0x0005, 0x1038);        //横    
    LCD_Reg_Set(0x0021, 0x0000);
    LCD_Command(0x0022);   
}

void DMA_LcdJpegInit(void)
{
//    unsigned int x, y;
//    LCD_SetDispAddr(0, 0);
//    for(y=0; y<LCD_MAX_YSIZE; y++){
//        for(x=0; x<LCD_MAX_XSIZE; x++){
//            #if (DATA_BUS_WIDTH==8)
//                write_XDATA(LCD_DATA, 0x0000);
//            #endif
//                write_XDATA(LCD_DATA, 0x0000);
//        }
//    }
//    LCDDEV_Init(LCD_INIT_NORMAL);
//    LCD_SetDispAddr(0, 0);
    //LCD_Reg_Set(0x0001, 0x0113);	    //竖
    LCD_Reg_Set(0x0001, 0x0213);	    //竖
    LCD_Reg_Set(0x0005, 0x1030);	    //竖
    LCD_Reg_Set(0x0021, 0x0000);
    LCD_Command(0x0022);
}

void DMA_LcdJpegInitX(void)
{
//    unsigned int x, y;
//    LCD_SetDispAddr(0, 0);
//    for(y=0; y<LCD_MAX_YSIZE; y++){
//        for(x=0; x<LCD_MAX_XSIZE; x++){
//            #if (DATA_BUS_WIDTH==8)
//                write_XDATA(LCD_DATA, 0x0000);
//            #endif
//                write_XDATA(LCD_DATA, 0x0000);
//        }
//    }
//    LCDDEV_Init(LCD_JPEG_X_INIT);
//    LCD_SetDispAddr(0, 0);
    //LCD_Reg_Set(0x0001, 0x0013);        //横
    LCD_Reg_Set(0x0001, 0x0313);        //横
    LCD_Reg_Set(0x0005, 0x1038);        //横     
    LCD_Reg_Set(0x0021, 0x0000);
    LCD_Command(0x0022);  
}
void  PowerOnLcdinit()
{
    LCDDEV_Init(0);
    LCD_Init();
}

//******************************************************************************

⌨️ 快捷键说明

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