lcd.c

来自「AT91RM3400芯片 ROM引导程序」· C语言 代码 · 共 191 行

C
191
字号
//*----------------------------------------------------------------------------
//*      ATMEL Microcontroller Software Support  -  ROUSSET  -
//*----------------------------------------------------------------------------
//* The software is delivered "AS IS" without warranty or condition of any
//* kind, either express, implied or statutory. This includes without
//* limitation any warranty or condition with respect to merchantability or
//* fitness for any particular purpose, or against the infringements of
//* intellectual property rights of others.
//*----------------------------------------------------------------------------
//* File Name           : lcd.c
//* Object              : Audio extention board lcd Drivers
//*
//* Creation            : FB   26/11/2002
//*----------------------------------------------------------------------------

#include    "lcd.h"

//*----------------------------------------------------------------------------
//* \fn    AT91F_WriteLCD
//* \brief Write a lcd command or data
//*----------------------------------------------------------------------------
void AT91F_WriteLCD(unsigned char Byte2Write, unsigned char arg)
{
   	AT91C_BASE_SPI->SPI_PTCR = AT91C_PDC_RXTDIS + AT91C_PDC_TXTDIS;

	// Initialize LCD Driver command
    AT91C_BASE_SPI->SPI_MR &=0xFFF0FFFF;

    if(arg == COMMAND)
    	AT91C_BASE_SPI->SPI_MR |= AT91C_LCD_DRIVER_COMMAND;
    else // arg == DATA
    	AT91C_BASE_SPI->SPI_MR |= AT91C_LCD_DRIVER_DATA;

	while ( (AT91C_BASE_SPI->SPI_SR) & AT91C_SPI_TDRE == 0)
	{};

   	// Initialize the Transmit Pointer
    //AT91C_BASE_SPI->SPI_RPR = (unsigned int) &Byte2Write;
    AT91C_BASE_SPI->SPI_TPR = (unsigned int) &Byte2Write;

    // Intialize the Transmit Counter
    //AT91C_BASE_SPI->SPI_RCR = 1;
    AT91C_BASE_SPI->SPI_TCR = 1;
     	    
   	AT91C_BASE_SPI->SPI_PTCR = AT91C_PDC_TXTEN;
}

//*----------------------------------------------------------------------------
//* \fn    AT91F_Lcd_init
//* \brief lcd initialisation
//*----------------------------------------------------------------------------
void AT91F_Lcd_init(void)
{
	int i;

	AT91F_WriteLCD(RESET,COMMAND);				// Reset LCD 0xE2
	AT91F_WriteLCD(ADC_NORMAL_DIR,COMMAND);		// Set ADC 0xA0
	AT91F_WriteLCD(SHL_REVERSE_DIR,COMMAND);	// Set ADC 0xC0
	AT91F_WriteLCD(LCD_BIAS_1_9,COMMAND);		// Set bias 0xA2
	
	for(i=0;i<10000;i++)
		AT91F_WriteLCD(POWER_CONTROL_SET | INT_VOLT_CONV_ON,COMMAND);

	for(i=0;i<10000;i++);
	
	AT91F_WriteLCD(POWER_CONTROL_SET | INT_VOLT_CONV_ON | INT_VOLT_REG_ON ,COMMAND);
	
	for(i=0;i<10000;i++);
	
	AT91F_WriteLCD(POWER_CONTROL_SET | INT_VOLT_CONV_ON | INT_VOLT_REG_ON | INT_VOLT_FOLLO_ON,COMMAND);		//
	
	for(i=0;i<10000;i++);

	AT91F_WriteLCD(RES_RATIO_5_5,COMMAND);
	AT91F_WriteLCD(REF_VOLT_MODE,COMMAND);		
	AT91F_WriteLCD(0x15,COMMAND);
	
	// We clear the display before to turn it on
	AT91F_WriteLCD(AT91C_DISPLAY_ON,COMMAND);	// Set Display
}

//*----------------------------------------------------------------------------
//* \fn    AT91F_LcdClear
//* \brief Clear the LCD
//*----------------------------------------------------------------------------
void AT91F_LcdClear(void)
{
	unsigned int page = 0 ;
	unsigned int column = 0 ;
	
	AT91F_WriteLCD(AT91C_INITIAL_DISPLAY_LINE_0,COMMAND);

	AT91F_WriteLCD(AT91C_DISPLAY_OFF,COMMAND);

	for(page=0;page<AT91C_NUMBER_OF_PAGES;page++)
	{
		
		AT91F_WriteLCD(AT91C_PAGE_ADDR_0 + page,COMMAND);
		AT91F_WriteLCD(AT91C_COLUMN_ADDR_MSB,COMMAND);
		AT91F_WriteLCD(AT91C_COLUMN_ADDR_LSB,COMMAND);

		for(column=0;column<AT91C_NUMBER_OF_COLUMNS;column++)
		{
			AT91F_WriteLCD(0x00,DATA);
		};
		
	};

	AT91F_WriteLCD(AT91C_DISPLAY_ON,COMMAND);
}

//*----------------------------------------------------------------------------
//* \fn    AT91F_LcdDisplayImage
//* \brief Display an array of char
//*----------------------------------------------------------------------------
void AT91F_LcdDisplayImage(unsigned char *image)
{
	unsigned int page = 0 ;
	unsigned int column = 0 ;
	unsigned int i = 0 ;
	
	
	AT91F_LcdClear() ;

	AT91F_WriteLCD(AT91C_DISPLAY_OFF,COMMAND);		
	AT91F_WriteLCD(ADC_NORMAL_DIR,COMMAND);	
	AT91F_WriteLCD(SHL_REVERSE_DIR,COMMAND);	

	AT91F_WriteLCD(AT91C_INITIAL_DISPLAY_LINE_0,COMMAND);

	i = 0 ;
	for(page=0;page<AT91C_NUMBER_OF_PAGES;page++)
    {

		AT91F_WriteLCD(AT91C_PAGE_ADDR_0 + page,COMMAND);
		AT91F_WriteLCD(AT91C_COLUMN_ADDR_MSB,COMMAND);
		AT91F_WriteLCD(AT91C_COLUMN_ADDR_LSB,COMMAND);
		
		for(column=0;column<AT91C_NUMBER_OF_COLUMNS;column++)
        {
            AT91F_WriteLCD(image[i],DATA);
            i++ ;
        }
    }
	AT91F_WriteLCD(AT91C_DISPLAY_ON,COMMAND);        
}

//*----------------------------------------------------------------------------
//* \fn    AT91F_Write_Char
//* \brief Write a char on LCD
//*----------------------------------------------------------------------------
void AT91F_Write_Char(unsigned int width, unsigned char val)
{
	unsigned int 	j;
	
	// write the char with the correct width
	for(j=0;j<width;j++)
		AT91F_WriteLCD(Font_5x8_Tianma[val-0x20][j][0],DATA);

	/* Turn on the display to see the new letter. */
	AT91F_WriteLCD(AT91C_DISPLAY_ON,COMMAND);
}

//*----------------------------------------------------------------------------
//* \fn    AT91F_Lcd_put_string
//* \brief Write a line on LCD
//*----------------------------------------------------------------------------
void AT91F_Lcd_put_string(unsigned char line, char * val)
{
	unsigned char column;
	
	AT91F_WriteLCD (AT91C_INITIAL_DISPLAY_LINE_0,COMMAND);
	AT91F_WriteLCD (AT91C_PAGE_ADDR_0 + line,COMMAND);
	
	AT91F_WriteLCD (AT91C_COLUMN_ADDR_MSB,COMMAND);
	AT91F_WriteLCD (AT91C_COLUMN_ADDR_LSB,COMMAND);
	
	for(column=0;column<AT91C_NUMBER_OF_COLUMNS;column++)
		AT91F_WriteLCD(0x00,DATA);
	
	AT91F_WriteLCD (AT91C_INITIAL_DISPLAY_LINE_0,COMMAND);
	AT91F_WriteLCD (AT91C_COLUMN_ADDR_MSB,COMMAND);
	AT91F_WriteLCD (AT91C_COLUMN_ADDR_LSB,COMMAND);
	
	while ( *val != 0)
	{
		AT91F_Write_Char(AT91C_LCD_FONT_WIDTH,(unsigned char)* val);
		val++;
	}
}

⌨️ 快捷键说明

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