📄 lcd.c
字号:
#include <string.h>
#include "..\inc\option.h"
#include "..\inc\def.h"
#include "..\inc\44b.h"
#include "..\inc\44blib.h"
#include "..\inc\lcd.h"
#include "..\inc\PLMM.h"
void __irq Adc_TsSep(void);
void __irq timer0_int(void);
void init_timer0(void);
void closetimer0(void);
void Lcd_Init(int depth);
void clrscreen(void);
//void displayBmp(unsiged int starx,unsiged int stary,unsiged int endx,unsiged int endy,unsiged int *bmpadd,char shuxing);
void displaylcd(char num);
void touch_lcd(void);
int read_lcd(void);
void TestLcd(void);
int mt0cnt=0,picturenum=0;
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 __irq Adc_TsSep(void)
{
}
//////////////////////////////////////////////////////////////
void __irq timer0_int(void)
{
}
///////////////////////////////////////////////////////////////
void init_timer0(void)
{
}
////////////////////////////////////////////////////////////////
void closetimer0(void)
{
rINTMSK=~(BIT_TIMER0)|rINTMSK;
}
///////////////////////////////////////////////////////////////
void Lcd_Init(int depth)
{
// 640*480 1bit/1pixel LCD //320x240 1bit/1pixel LCD
#define MVAL_USED 0
switch(depth)
{
case 1:
if((U32)frameBuffer1==0)
{
frameBuffer1=(unsigned int (*)[SCR_XSIZE/32])malloc(ARRAY_SIZE_MONO);
}
rLCDCON1=(0)|(1<<5)|(MVAL_USED<<7)|(0x3<<8)|(0x3<<10)|(CLKVAL_MONO<<12);
// disable,4B_SNGL_SCAN,WDLY=8clk,WLH=8clk,
rLCDCON2=(LINEVAL)|(HOZVAL<<10)|(10<<21);
//LINEBLANK=10 (without any calculation)
rLCDSADDR1= (0x0<<27) | ( ((U32)frameBuffer1>>22)<<21 ) | M5D((U32)frameBuffer1>>1);
// monochrome, LCDBANK, LCDBASEU
rLCDSADDR2= M5D( (((U32)frameBuffer1+(SCR_XSIZE*LCD_YSIZE/8))>>1) ) | (MVAL<<21);
rLCDSADDR3= (LCD_XSIZE/16) | ( ((SCR_XSIZE-LCD_XSIZE)/16)<<9 );
rLCDCON1=(1)|(1<<5)|(MVAL_USED<<7)|(0x3<<8)|(0x3<<10)|(CLKVAL_MONO<<12);
// enable,4B_SNGL_SCAN,WDLY=8clk,WLH=8clk,
break;
case 4:
if((U32)frameBuffer4==0)
{
frameBuffer4=(unsigned int (*)[SCR_XSIZE/16])malloc(ARRAY_SIZE_G4);
}
rLCDCON1=(0)|(1<<5)|(MVAL_USED<<7)|(0x3<<8)|(0x3<<10)|(CLKVAL_G4<<12);
// disable,4B_SNGL_SCAN,WDLY=8clk,WLH=8clk,
rLCDCON2=(LINEVAL)|(HOZVAL<<10)|(10<<21);
//LINEBLANK=10 (without any calculation)
rLCDSADDR1= (0x1<<27) | ( ((U32)frameBuffer4>>22)<<21 ) | M5D((U32)frameBuffer4>>1);
// 4-gray, LCDBANK, LCDBASEU
rLCDSADDR2= M5D((((U32)frameBuffer4+(SCR_XSIZE*LCD_YSIZE/4))>>1)) | (MVAL<<21);
rLCDSADDR3= (LCD_XSIZE/8) | ( ((SCR_XSIZE-LCD_XSIZE)/8)<<9 );
//The following value has to be changed for better display.
//Select 4 levels among 16 gray levels.
rBLUELUT=0xfa40;
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=(1)|(1<<5)|(MVAL_USED<<7)|(0x3<<8)|(0x3<<10)|(CLKVAL_G4<<12);
// enable,4B_SNGL_SCAN,WDLY=8clk,WLH=8clk,
break;
case 16:
if((U32)frameBuffer16==0)
{
frameBuffer16=(unsigned int (*)[SCR_XSIZE/8])malloc(ARRAY_SIZE_G16);
}
rLCDCON1=(0)|(1<<5)|(MVAL_USED<<7)|(0x3<<8)|(0x3<<10)|(CLKVAL_G16<<12);
// disable,4B_SNGL_SCAN,WDLY=8clk,WLH=8clk,
rLCDCON2=(LINEVAL)|(HOZVAL<<10)|(10<<21);
//LINEBLANK=10 (without any calculation)
rLCDSADDR1= (0x2<<27) | ( ((U32)frameBuffer16>>22)<<21 ) | M5D((U32)frameBuffer16>>1);
// 16-gray, LCDBANK, LCDBASEU
rLCDSADDR2= M5D((((U32)frameBuffer16+(SCR_XSIZE*LCD_YSIZE/2))>>1)) | (MVAL<<21);
rLCDSADDR3= (LCD_XSIZE/4) | ( ((SCR_XSIZE-LCD_XSIZE)/4)<<9 );
//The following value has to be changed for better display.
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=(1)|(1<<5)|(MVAL_USED<<7)|(0x3<<8)|(0x3<<10)|(CLKVAL_G16<<12);
// enable,4B_SNGL_SCAN,WDLY=8clk,WLH=8clk,
break;
case 256:
if((U32)frameBuffer256==0)
{
frameBuffer256=(unsigned int (*)[SCR_XSIZE/4])malloc(ARRAY_SIZE_COLOR);
}
rLCDCON1=(0)|(2<<5)|(MVAL_USED<<7)|(0<<8)|(0x03<<10)|(CLKVAL_COLOR<<12);
// disable,8B_SNGL_SCAN,WDLY=4clk,WLH=4clk,
rLCDCON2=(LINEVAL)|(HOZVAL_COLOR<<10)|(1<<21);
//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);
rLCDSADDR3= (LCD_XSIZE/2) | ( ((SCR_XSIZE-LCD_XSIZE)/2)<<9 );
//The following value has to be changed for better display.
rREDLUT =0xfdb96420;
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=(1)|(2<<5)|(MVAL_USED<<7)|(0<<8)|(0x03<<10)|(CLKVAL_COLOR<<12);
// enable,8B_SNGL_SCAN,WDLY=8clk,WLH=8clk,
break;
default:
break;
}
}
///////////////////////////////////////////////////
void clrscreen(void)
{
int i,j;
for (i=0;i<480;i++)
for (j=0;j<160;j++)
{
frameBuffer256[i][j]=0x77777777;//(0x0FFFFFFFF);
}
}
////////////////////////////////////////////
void displaylcd(char num)
{
unsigned int *pbuffer;
int i,j=0;
int maxp;
maxp = LCD_XSIZE * LCD_YSIZE / LCD_DEP;
pbuffer =(U32*) frameBuffer256;
if (num == 1)
{
for(i=0,j=0;i<maxp;i++,j=j+4)
{
pbuffer[i]=(plmmBitmap1[j]<<24)+(plmmBitmap1[j+1]<<16)+(plmmBitmap1[j+2]<<8)+plmmBitmap1[j+3];
}
}
else if (num == 2)
{
for(i=0,j=0;i<maxp;i++,j=j+4)
{
pbuffer[i]=(plmmBitmap2[j]<<24)+(plmmBitmap2[j+1]<<16)+(plmmBitmap2[j+2]<<8)+plmmBitmap2[j+3];
}
}
/*else if (num == 3)
{
for(i=0,j=0;i<maxp;i++,j=j+4)
{
pbuffer[i]=(plmmBitmap3[j]<<24)+(plmmBitmap3[j+1]<<16)+(plmmBitmap3[j+2]<<8)+plmmBitmap3[j+3];
}
}
*/
}
/////////////////////////////////////////////////////////
int read_lcd(void)
{
}
/////////////////////////////////////////////////////////
void touch_lcd(void)
{
}
///////////////////////////////////////////////////////
void TestLcd(void)
{
Lcd_Init(256);
rPCONC = rPCONC & 0xfffdffff ; // pcon8 out
rPDATC = rPDATC & 0xfffffeff; // pdatc8 ==1 display on
//touch_lcd();
//Uart_Printf("LCD DISPLAY\n");
//Uart_Printf("Type any key to exit!!!\n");
//displaylcd(0);
Uart_Printf(" NOW TEST LCD DISPLAY \n");
//clrscreen();
while(!Uart_GetKey())
{
char x;
displaylcd(1);
Delay(100000);
displaylcd(2);
Delay(100000);
}
//closetimer0();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -