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

📄 lcd.c

📁 汽车仪表板开发
💻 C
字号:
#include "lcd.h"
#include <string.h>


extern unsigned char const ASCII[95][16];
extern unsigned char const HZK16[6768][32];
extern  unsigned char const Image1[512];
extern  unsigned char const Image2[512];

unsigned short color[8]={0x0000,0x001f,0x07e0,0x07ff,0xf800,0xf81f,0xffe0,0xffff};

void delay_Nms(unsigned short t)
{
unsigned short i;
while(t--)
{
i=4000;
while(i--);}
}
void delay_Nus(unsigned short t)
{
	unsigned short i;
while(t--)
{
i=30;
while(i--);}
}


void LCD_WriteData(unsigned short val)
{   

	IO0CLR = LCD_DATA;
	IO0SET = val&0xFF00;
    LCD_WR_L;
	LCD_WR_H;
	
	IO0CLR = LCD_DATA;
	IO0SET = (val&0xFF)<<8;
    LCD_WR_L;
	LCD_WR_H;

}

void LCD_WriteReg(unsigned char index,unsigned short val)
{
    LCD_CS_L;
	
	LCD_RS_L;
	
	IO0CLR = LCD_DATA; 
	LCD_WR_L;
	LCD_WR_H;
	
	IO0SET = index<<8;
	LCD_WR_L;
	LCD_WR_H;

    LCD_RS_H;
	
	IO0CLR = LCD_DATA;
	IO0SET = val&0xFF00;
    LCD_WR_L;
	LCD_WR_H;
	
	IO0CLR = LCD_DATA;
	IO0SET = (val&0xFF)<<8;
    LCD_WR_L;
	LCD_WR_H;
	
	LCD_CS_H;
}


void Lcd_Init()
{   
    PINSEL2 &= ~(1<<3);
    LCD_CS_SEL;
    LCD_RST_SEL;
    LCD_LED_SEL;
    LCD_DATA_SEL;
   
    
    LCD_WR_OUT;
    LCD_RD_OUT;
    LCD_RS_OUT;
    LCD_RST_OUT;
    LCD_CS_OUT;
    LCD_LED_OUT;
    LCD_DATA_OUT;
    
    LCD_RD_H;
    
    LCD_LED_L;
    
	LCD_RST_L;
	delay_Nms(30);
	LCD_RST_H;
	delay_Nms(30);

    delay_Nms(5); // delay 50 ms 
/* Start Initial Sequence ----------------------------------------------------*/ 
  LCD_WriteReg(229, 0x8000); /* Set the internal vcore voltage */ 
  LCD_WriteReg(0,   0x0001); /* Start internal OSC. */ 
  LCD_WriteReg(1,   0x0100); /* set SS and SM bit */ 
  LCD_WriteReg(2,   0x0700); /* set 1 line inversion */ 
  LCD_WriteReg(3,   0x1030); /* set GRAM write direction and BGR=1. */ 
  LCD_WriteReg(4,   0x0000); /* Resize register */ 
  LCD_WriteReg(8,  0x0202); /* set the back porch and front porch */ 
  LCD_WriteReg(9,  0x0000); /* set non-display area refresh cycle ISC[3:0] */ 
  LCD_WriteReg(10, 0x0000); /* FMARK function */ 
  LCD_WriteReg(12, 0x0000); /* RGB interface setting */ 
  LCD_WriteReg(13, 0x0000); /* Frame marker Position */ 
  LCD_WriteReg(15, 0x0000); /* RGB interface polarity */ 
  LCD_WriteReg(0x2b,0x0010);

/* Power On sequence ---------------------------------------------------------*/ 
  LCD_WriteReg(16, 0x0000); /* SAP, BT[3:0], AP, DSTB, SLP, STB */ 
  LCD_WriteReg(17, 0x0000); /* DC1[2:0], DC0[2:0], VC[2:0] */ 
  LCD_WriteReg(18, 0x0000); /* VREG1OUT voltage */ 
  LCD_WriteReg(19, 0x0000); /* VDV[4:0] for VCOM amplitude */ 
  delay_Nms(20);                 /* Dis-charge capacitor power voltage (200ms) */ 
  LCD_WriteReg(16, 0x17B0); /* SAP, BT[3:0], AP, DSTB, SLP, STB */ 
  LCD_WriteReg(17, 0x0137); /* DC1[2:0], DC0[2:0], VC[2:0] */ 
  delay_Nms(5);                  /* Delay 50 ms */ 
  LCD_WriteReg(18, 0x0139); /* VREG1OUT voltage */ 
  delay_Nms(5);                  /* Delay 50 ms */ 
  LCD_WriteReg(19, 0x1d00); /* VDV[4:0] for VCOM amplitude */ 
  LCD_WriteReg(41, 0x0013); /* VCM[4:0] for VCOMH */ 
  delay_Nms(5);                  /* Delay 50 ms */ 
  LCD_WriteReg(32, 0x0000); /* GRAM horizontal Address */ 
  LCD_WriteReg(33, 0x0000); /* GRAM Vertical Address */ 

/* Adjust the Gamma Curve ----------------------------------------------------*/ 
  LCD_WriteReg(48, 0x0006); 
  LCD_WriteReg(49, 0x0101); 
  LCD_WriteReg(50, 0x0003); 
  LCD_WriteReg(53, 0x0106); 
  LCD_WriteReg(54, 0x0b02); 
  LCD_WriteReg(55, 0x0302); 
  LCD_WriteReg(56, 0x0707); 
  LCD_WriteReg(57, 0x0007); 
  LCD_WriteReg(60, 0x0600); 
  LCD_WriteReg(61, 0x020b); 
   
/* Set GRAM area -------------------------------------------------------------*/ 
  LCD_WriteReg(80, 0x0000); /* Horizontal GRAM Start Address */ 
  LCD_WriteReg(81, 0x00EF); /* Horizontal GRAM End Address */ 
  LCD_WriteReg(82, 0x0000); /* Vertical GRAM Start Address */ 
  LCD_WriteReg(83, 0x013F); /* Vertical GRAM End Address */ 

  LCD_WriteReg(96,  0x2700); /* Gate Scan Line */ 
  LCD_WriteReg(97,  0x0001); /* NDL,VLE, REV */ 
  LCD_WriteReg(106, 0x0000); /* set scrolling line */ 

/* Partial Display Control ---------------------------------------------------*/ 
  LCD_WriteReg(128, 0x0000); 
  LCD_WriteReg(129, 0x0000); 
  LCD_WriteReg(130, 0x0000); 
  LCD_WriteReg(131, 0x0000); 
  LCD_WriteReg(132, 0x0000); 
  LCD_WriteReg(133, 0x0000); 

/* Panel Control -------------------------------------------------------------*/ 
  LCD_WriteReg(144, 0x0010); 
  LCD_WriteReg(146, 0x0000); 
  LCD_WriteReg(147, 0x0003); 
  LCD_WriteReg(149, 0x0110); 
  LCD_WriteReg(151, 0x0000); 
  LCD_WriteReg(152, 0x0000); 

  /* Set GRAM write direction and BGR = 1 */ 
  /* I/D=01 (Horizontal : increment, Vertical : decrement) */ 
  /* AM=1 (address is updated in vertical writing direction) */ 
  //LCD_WriteReg(3, 0x1018); 

  LCD_WriteReg(7, 0x0173); /* 262K color and display ON */ 

}



void Lcd_Write_Start()
{
    LCD_CS_L;
	
	LCD_RS_L;
	
	IO0CLR = LCD_DATA;
	LCD_WR_L;
	LCD_WR_H;
	
	IO0SET = 0x22<<8;
    LCD_WR_L;
	LCD_WR_H;
	
	LCD_RS_H;
}



void Lcd_Write_End()
{
	 LCD_CS_H;
}


void Lcd_putchar(unsigned short x,unsigned short y,unsigned short color,char *ch)
  {
    unsigned char i,j,temp;
    
    LCD_WriteReg(0x20, x);
    
    for(i=0;i<16;i++)
     { 
        LCD_WriteReg(0x21, y+i); 
        Lcd_Write_Start();
        temp = ASCII[*ch-0x20][i];
        for(j=0;j<8;j++)
         {
           if(temp & 0x01)  LCD_WriteData(color);
           else LCD_WriteData(0);
           temp>>=1;
          }
         
      }
     Lcd_Write_End();
   }  
   
void Lcd_putstr(unsigned short x,unsigned short y,unsigned short color,char *str)
  {
    unsigned char i=0;
    while(*str)
     { 
       
       Lcd_putchar(x+i*8,y,color,str);
       i++;
       str++;
      }
   
   }
   
   
   
void Lcd_FillBlack(unsigned short color)
 {
    unsigned short i,j;
    
	LCD_WriteReg(0x20, 0); 
    LCD_WriteReg(0x21, 0); 
	LCD_WriteReg(0x50,0);
	LCD_WriteReg(0x51,0x00ef);
	LCD_WriteReg(0x52,0);
	LCD_WriteReg(0x53,0x013f);
	Lcd_Write_Start();
	
	for(i=0;i<320;i++)
		for(j=0;j<240;j++)
		{
		 LCD_WriteData(color);
		}
    Lcd_Write_End();
 }


void Lcd_image(unsigned short x,unsigned short y,unsigned char p)
 {
   
    unsigned char i,j;
    
    LCD_WriteReg(0x20, x);
    
    for(i=0;i<16;i++)
     { 
     
        LCD_WriteReg(0x21, y+i); 
        Lcd_Write_Start();
       if(p==1)
       {
        for(j=0;j<16;j++)
          {
            IO0CLR = LCD_DATA;
	        IO0SET = Image1[i*32+j*2+1]<<8;
            LCD_WR_L;
	        LCD_WR_H;
	
	        IO0CLR = LCD_DATA;
	        IO0SET =Image1[i*32+j*2];
            LCD_WR_L;
	        LCD_WR_H;
	       }
	    }
	    else
	    {
	     for(j=0;j<16;j++)
          {
            IO0CLR = LCD_DATA;
	        IO0SET = Image2[i*32+j*2+1]<<8;
            LCD_WR_L;
	        LCD_WR_H;
	
	        IO0CLR = LCD_DATA;
	        IO0SET =Image2[i*32+j*2];
            LCD_WR_L;
	        LCD_WR_H;
	       }
	    }
         
      }
     Lcd_Write_End();
   }  
   

void Lcd_PutHz16(unsigned short x,unsigned short y,unsigned short color,char *GB2312)
{
  unsigned short temp;
  unsigned char i,j,tmp;
   
  LCD_WriteReg(0x20, x);

  temp = (GB2312[0] - 0xB0) * 94 + (GB2312[1] - 0xA0) - 1;
  for(i = 0; i < 16; i++)
  {
     
    LCD_WriteReg(0x21, y+i); 
    Lcd_Write_Start();
    tmp = HZK16[temp][i*2];
    
    for(j = 0; j < 8; j++)
     {
       if(tmp&0x01)  LCD_WriteData(color);
       else   LCD_WriteData(0);
       tmp>>=1;
	 }
	 
	tmp = HZK16[temp][i*2+1];
    
    for(j = 0; j < 8; j++)
     {
       if(tmp&0x01)  LCD_WriteData(color);
       else   LCD_WriteData(0);
       tmp>>=1;
	 }
	 Lcd_Write_End();

  }
}


unsigned short Lcd_Print(unsigned short x,unsigned short y,unsigned short color,char *c,unsigned char size)
{
 unsigned int i;
 unsigned char temp;
 if(size)temp=size;
 else temp=strlen((char *)c);
 for(i = 0; i < temp; i++)
 {
  if(*(c+i) < 0xA0 && !(*(c+i)==' '))
  {
   Lcd_putchar(x,y,color,c+i);
   x+=8;
  }
  else if(*(c+i) >= 0xA0)
  {
   Lcd_PutHz16(x,y,color,c+i);
   i++;
   x+=16;
  }
 }
 return x;
}







     

⌨️ 快捷键说明

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