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

📄 lcddev_i_0.c

📁 LCM标准驱动原代码,根据这个,可以很方便的编写其他LCM驱动
💻 C
字号:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stdarg.h>
#include "WCDTypes.h"                   // standard type definitions
#include "sysutil.h"
#include "lcd_api.h"
#include "globlapi.h"
#include "uhapi.h"

#include "devgpio.h"
//#include "pubparam.h"	
//#include "gpio_support.h"


extern UINT8 color_Lcd_Width, color_Lcd_Height;

unsigned short *lpBitBuffer;

unsigned char lcd_inid =0;

#define LCD_CTRL_REG 	*((unsigned char *)0xC00000)
#define LCD_DATA_REG 	*((unsigned char *)0xC00002)
#define MAX_LCD_ROWS	0xA2
#define MAX_LCD_COLS	0x84
#define LCD_ROW_OFF		0x00
#define LCD_COL_OFF		0x00

void delay_ms(UINT32 delay);
void set_lcd_background_light(BOOL);

void lcm_init(void)
{
	UINT i;
	//;standby mode off
	//standby_off
	LCD_CTRL_REG = 0x2c;
	delay_ms(5);

	LCD_CTRL_REG = 0xEB;//turn on OTP

	//set internal osc on
	LCD_CTRL_REG = 0x02;	
	LCD_CTRL_REG = 0x01;
	delay_ms(5);
	
	//
	LCD_CTRL_REG = 0x20;	
	LCD_CTRL_REG = 0x05;	
	
	//
	LCD_CTRL_REG = 0x26;	
	LCD_CTRL_REG = 0x01;
	delay_ms(5);	

	//
	LCD_CTRL_REG = 0x26;	
	LCD_CTRL_REG = 0x09;
	delay_ms(5);	
	
	//
	LCD_CTRL_REG = 0x26;	
	LCD_CTRL_REG = 0x0b;
	delay_ms(5);	
	
	//
	LCD_CTRL_REG = 0x26;	
	LCD_CTRL_REG = 0x0f;
	delay_ms(5);	
	
	//
	LCD_CTRL_REG = 0x28;	
	LCD_CTRL_REG = 0x00;	

	
	//
	LCD_CTRL_REG = 0x2e;	
	
	//
	LCD_CTRL_REG = 0x45;	
	LCD_CTRL_REG = 0x00;	

	//
	LCD_CTRL_REG = 0x53;	
	LCD_CTRL_REG = 0x00;	

	//
	LCD_CTRL_REG = 0x10;	
	LCD_CTRL_REG = 0x22;
	
	//
	LCD_CTRL_REG = 0x24;	
	LCD_CTRL_REG = 0x22;	
	
	//
	LCD_CTRL_REG = 0x30;
	LCD_CTRL_REG = 0x09;
	//
	LCD_CTRL_REG = 0x32;	
	LCD_CTRL_REG = 0x0e;	

	//
	LCD_CTRL_REG = 0x40;	
	LCD_CTRL_REG = 0x00;		

	
	//
	LCD_CTRL_REG = 0x34;	
	LCD_CTRL_REG = 0x0D;	

	//
	LCD_CTRL_REG = 0x2a;	
	LCD_CTRL_REG = 0x42;
	delay_ms(5);

	LCD_CTRL_REG = 0x2b;	
	LCD_CTRL_REG = 0x20;
	delay_ms(5);
	
	//
	LCD_CTRL_REG = 0x22;	
	LCD_CTRL_REG = 0x11;	

	//
	LCD_CTRL_REG = 0x55;	
	LCD_CTRL_REG = 0x00;	
		
	//
	LCD_CTRL_REG = 0x56;	
	LCD_CTRL_REG = 0x00;
	
	//
	LCD_CTRL_REG = 0x57;	
	LCD_CTRL_REG = 0x9f;	
	
	//
	LCD_CTRL_REG = 0x59;	
	LCD_CTRL_REG = 0x00;
	LCD_CTRL_REG = 0x00;
	LCD_CTRL_REG = 0x9f;
	LCD_CTRL_REG = 0x00;
	


	i = (UINT16)(color_Lcd_Width * color_Lcd_Height/2);
	for(; i!=0 ; i--)
	{
		LCD_DATA_REG = 0xFF;
		LCD_DATA_REG = 0xFF;
		LCD_DATA_REG = 0xFF;
		LCD_DATA_REG = 0xFF;
	}
	//;Display on
	LCD_CTRL_REG = 0x51;	
	
}


void set_lcd_background_light(BOOL  b)
{
	if(b)
		uhGPIOWrite (PORTD_BIT4, HIGH_STATE);				
	else
		uhGPIOWrite (PORTD_BIT4, LOW_STATE);				
}



void test_lcd(void)
{
	
	int i, j, s;
	unsigned short c[] = {0xF800, 0x07E0, 0x001F};
	unsigned short p;

	s=sizeof(c)/sizeof(c[0]);

	i=0;

	while(i<3){
		//data pattern
		p=c[i];
		i++;
		//i%=s;

		//p=0x001F;
		if(i++&0x1)
			uhGPIOWrite (PORTA_BIT4, HIGH_STATE);						
		else
			uhGPIOWrite (PORTA_BIT4, LOW_STATE);						
		
		//Y address Area
		LCD_CTRL_REG =0x43;				
		LCD_CTRL_REG =LCD_COL_OFF+20;		
		LCD_CTRL_REG=LCD_COL_OFF+MAX_LCD_COLS-1-20;

		//X Address Area
		LCD_CTRL_REG =0x42;				
		LCD_CTRL_REG =LCD_ROW_OFF+i*20+20;		
		LCD_CTRL_REG=LCD_ROW_OFF+(i+2)*20;

		//filling data
		for(j=0;j<(MAX_LCD_ROWS-40)*(MAX_LCD_COLS-40); j++){
			LCD_DATA_REG=p	>>8;
			LCD_DATA_REG=p	;
		}
	}	
	
}

void InitLCDDriver( void )
{
	lpBitBuffer = (unsigned short *)GSMMalloc( color_Lcd_Width * color_Lcd_Height * 2 );
	
	
	
    lcm_init();

    //set_lcd_background_light(1);

    test_lcd();

	GSMmemset( (unsigned char *)lpBitBuffer, 0x00, (color_Lcd_Width * color_Lcd_Height * 2) );

	lcd_inid = 1;
}


void lcm_UpdateScreen( LCD_BOX box )
{

	UINT32   i, j;//, index, index1;
	UINT32	startX, startY, endX, endY;
	//UINT8   writeData;

	startX = box.origin.x;
	startY = box.origin.y;
	endX = box.origin.x + box.area.width;
	endY = box.origin.y + box.area.height;
	
	//Y address Area
	LCD_CTRL_REG =0x43;				
	LCD_CTRL_REG =LCD_COL_OFF + startX;		
	LCD_CTRL_REG=LCD_COL_OFF + endX - 1;
	
	//X Address Area
	LCD_CTRL_REG =0x42;				
	LCD_CTRL_REG =LCD_ROW_OFF + startY;		
	LCD_CTRL_REG=LCD_ROW_OFF + endY - 1;
	
	//filling data
	for(i=0;i<box.area.height;i++)
	{
		for(j=0;j<box.area.width;j++)
		{
			LCD_DATA_REG = (lpBitBuffer[startX+j+(i+startY)*color_Lcd_Width]) >> 8;
			LCD_DATA_REG = (lpBitBuffer[startX+j+(i+startY)*color_Lcd_Width]);
		}
	}
}



void HwLCDSetBoxColor( unsigned char startX, unsigned char startY, 
					   unsigned char width, unsigned char height, unsigned short color )
{
	int		i, j, startPos;

	if( !lcd_inid )
		InitLCDDriver();

	startPos = startY * color_Lcd_Width + startX;

	for( i = 0; i < height; i++ )
	{
		for( j = 0; j < width; j++ )
			lpBitBuffer[startPos + (i*color_Lcd_Width+j)] = color;
	}
}
					   
void HwLCDWriteLine( unsigned short *pbScreenData, unsigned char startX,
					 unsigned char startY, unsigned char rowLen )
{
	//?? jay
	GSMmemcpy( (unsigned short *)&(lpBitBuffer[(startY * color_Lcd_Width + startX)]), (unsigned short *)pbScreenData, (rowLen*2) );
}

void  HwLCDWrite(   unsigned short *pbScreenData,
                    unsigned short int wFirstY,
                    unsigned short int wFirstX,
                    unsigned short int wYLength, 
                    unsigned short int wXLength)
{
 	int		i, j, startPos;

	if( !lcd_inid )
		InitLCDDriver();

	startPos = wFirstY * color_Lcd_Width + wFirstX;

	for( i = 0; i < wYLength; i++ )
	{
		for( j = 0; j < wXLength; j++ )
			lpBitBuffer[startPos + (i*color_Lcd_Width+j)] = *pbScreenData;
	}
    
}


void HwLCDWriteRow( unsigned char *pbScreenData, unsigned int wRow, unsigned int wHeight )
{
    unsigned int i;
    UINT32 offset = 0;

	if( !lcd_inid )
		InitLCDDriver();

    for (i = wRow ; i< (wRow + wHeight) ; i ++)
    {
        if( i >= color_Lcd_Height)    break;

        GSMmemcpy ( lpBitBuffer + i*color_Lcd_Width, pbScreenData+offset, color_Lcd_Width*2); 
        offset += color_Lcd_Width*2;
    }
    
}

void delay_ms(UINT32 delay)
{
	UINT32	i = 0 ;
	UINT32 j;

	for(; i<delay ; i++)
	{
		j = 1000;
		while(j)
			j--;
	}
}

void lcd_enter_standby()
{
	LCD_CTRL_REG = 0x50;	//display off 0x50
	delay_ms(50);

	LCD_CTRL_REG = 0x2D;	//standby ON
	delay_ms(100);	
}

void lcd_exit_standby()
{
	LCD_CTRL_REG = 0x2C;	

	//;turn on internal Osc
	LCD_CTRL_REG = 0x02;	
	LCD_CTRL_REG = 0x01;	

	//;DC-DC select X1.5
	LCD_CTRL_REG = 0x20;	
	LCD_CTRL_REG = 0x05;	

	
	//;DC/DC and AMP on/OFF (booster1/2/3 and AMP on)
	LCD_CTRL_REG = 0x26;	
	LCD_CTRL_REG = 0x0F;	
	
	//;Temperature Compensation
	//;DDRAM Burst Mode off

	//;RAM skip Area off
	LCD_CTRL_REG = 0x45;	
	LCD_CTRL_REG = 0x00;	
	
	//;Normal Display Pattern
	LCD_CTRL_REG = 0x53;	
	LCD_CTRL_REG = 0x00;	
	
	//;Driver output mode 1/160 duty
	LCD_CTRL_REG = 0x10;	
	LCD_CTRL_REG = 0x20;	
	
	//;DC-DC Clock Division
	//;Address Mode 
	//;Row Vector Mode
	//;Entry Mode

	//;N-block Inversion

	//;Contrast Control 1
	LCD_CTRL_REG = 0x2A;	
	LCD_CTRL_REG = 0x42;	
	
	//;Contrast Control 2

	//;Bias Set (1/5 and 2nd boosting step X(-4))
	LCD_CTRL_REG = 0x22;	
	LCD_CTRL_REG = 0x11;	
	
	//;Partial Display Mode
	//;Partial start line
	//;Partial end   line
	//;Scroll mode

	//;Display on
	LCD_CTRL_REG = 0x51;
	
}

⌨️ 快捷键说明

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