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

📄 lcd.c

📁 ARM7的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 + -