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

📄 lcd.c

📁 用来测试mcf5249的嵌入式测试程序
💻 C
字号:
//*******************************************************************
//  Copyright 2004 SHENZHEN UNIVERSITY EDA CENTER
//*******************************************************************
//  File Name      : lcd.c
//  Abstract       : LCD命令接口程序
//  Modifications  :
//  Model   1.0
//  Rev.    Date       Coded by
//  0.0.1   04-03-02   K.H.Li        frist release
//*******************************************************************

#include "type.h"
#include "mcf5249.h"
#include "base.h"
//#include "sysinit.h"
#include "lcd.h"


//初始化LCD
void LCD_Init(void)
{
	uint8 column;

    imm2->gpio.G1OR &= ~MCF5249_GPIO56; //LCD_Reset
    delay10ms();
    imm2->gpio.G1OR |= MCF5249_GPIO56;
    delay10ms();
	//LCD_WriteCommand(0xae);             //LCD display off
	LCD_WriteCommand(0x2c);             //VC = 1
    delay10ms();
	LCD_WriteCommand(0x2e);             //VR = 1
    delay10ms();
	LCD_WriteCommand(0x2f);             //VF = 1
    delay10ms();
	LCD_WriteCommand(0x40);             //DDRAM line(0)->COM0
	LCD_WriteCommand(0xb0);             //Page address = 0
	LCD_WriteCommand(0x10);             //Column address MSB = 0
	LCD_WriteCommand(0x00);             //Column address LSB = 0
	LCD_WriteCommand(0xa0);             //ADC = 0
	LCD_WriteCommand(0xa6);             //REV = 0
	LCD_WriteCommand(0xa4);             //EON = 0, Normal display
	LCD_WriteCommand(0xa2);             //BIAS = 0, LCD bias = 1/6
	LCD_WriteCommand(0xc0);             //SHL = 0
	LCD_WriteCommand(0x23);             //Regulator Resistor Select
	LCD_WriteCommand(0x81);             //Set reference voltage mode
	LCD_WriteCommand(0x08);             //Set reference voltage
    delay10ms();
	LCD_Clear(0);
	LCD_Clear(1);
	LCD_Clear(2);
	LCD_Clear(3);
	LCD_DisplayText("Hello!");
    delay1ms();
	LCD_WriteCommand(0xaf);             //LCD display on
}

//Display USB mode
void LCD_DisplayUSB(void)
{
	uint8 column;
	
	LCD_Clear(0);
	LCD_Clear(1);
	LCD_Clear(2);
	LCD_Clear(3);

	LCD_WriteCommand(0xb3);             //Page address = 3
	LCD_WriteCommand(0x10);             //Column address MSB = 0
	LCD_WriteCommand(0x01);             //Column address LSB = 0
    delay1ms();
	for(column=0; column<15; column++)  //Display LOGO
	{
		LCD_WriteData(logo[column]);
	}
    delay1ms();
}

//Display MP3 mode
void LCD_DisplayMP3(void)
{
	uint8 column;
	uint8 min,sec;
	
	LCD_Clear(0);
	LCD_Clear(1);
	LCD_Clear(2);
	LCD_Clear(3);

	LCD_WriteCommand(0xb3);             //Page address = 3
	LCD_WriteCommand(0x10);             //Column address MSB = 0
	LCD_WriteCommand(0x01);             //Column address LSB = 1
    delay1ms();
	for(column=15; column<30; column++) //Display LOGO
	{
		LCD_WriteData(logo[column]);
	}
	for(column=16; column<25; column++)
	{
		LCD_WriteData(0x00);
	}
	for(column=24; column<36; column++) //Display OP_STA
	{
		LCD_WriteData(op_sta[column]>>8);
	}
	for(column=37; column<47; column++)
	{
		LCD_WriteData(0x00);
	}
	min = (MP3Play_min/10)*6;           //Display MP3Play minute
	for(column=min; column<min+6; column++)
	{
		LCD_WriteData(figure_16[column]>>8);
	}
	LCD_WriteData(0x00);
	LCD_WriteData(0x00);
	min = (MP3Play_min%10)*6;
	for(column=min; column<min+6; column++)
	{
		LCD_WriteData(figure_16[column]>>8);
	}
	LCD_WriteData(0x00);
	LCD_WriteData(0x00);
	LCD_WriteData(0x0c);                //Display MP3play ':'
	LCD_WriteData(0x0c);
	LCD_WriteData(0x00);
	LCD_WriteData(0x00);
	sec = (MP3Play_sec/10)*6;           //Display MP3Play second
	for(column=sec; column<sec+6; column++)
	{
		LCD_WriteData(figure_16[column]>>8);
	}
	LCD_WriteData(0x00);
	LCD_WriteData(0x00);
	sec = (MP3Play_sec%10)*6;
	for(column=sec; column<sec+6; column++)
	{
		LCD_WriteData(figure_16[column]>>8);
	}
    delay1ms();

	LCD_WriteCommand(0xb2);             //Page address = 2
	LCD_WriteCommand(0x11);             //Column address MSB = 1
	LCD_WriteCommand(0x09);             //Column address LSB = 9
    delay1ms();
	for(column=24; column<36; column++) //Display OP_STA
	{
		LCD_WriteData(op_sta[column]);
	}
	for(column=37; column<47; column++)
	{
		LCD_WriteData(0x00);
	}
	min = (MP3Play_min/10)*6;           //Display MP3Play minute
	for(column=min; column<min+6; column++)
	{
		LCD_WriteData(figure_16[column]);
	}
	LCD_WriteData(0x00);
	LCD_WriteData(0x00);
	min = (MP3Play_min%10)*6;
	for(column=min; column<min+6; column++)
	{
		LCD_WriteData(figure_16[column]);
	}
	LCD_WriteData(0x00);
	LCD_WriteData(0x00);
	LCD_WriteData(0xc0);                //Display MP3play ':'
	LCD_WriteData(0xc0);
	LCD_WriteData(0x00);
	LCD_WriteData(0x00);
	sec = (MP3Play_sec/10)*6;           //Display MP3Play second
	for(column=sec; column<sec+6; column++)
	{
		LCD_WriteData(figure_16[column]);
	}
	LCD_WriteData(0x00);
	LCD_WriteData(0x00);
	sec = (MP3Play_sec%10)*6;
	for(column=sec; column<sec+6; column++)
	{
		LCD_WriteData(figure_16[column]);
	}
    delay1ms();
}

//Display SMC mode
void LCD_DisplaySMC(void)
{
	uint8 column;
	
	LCD_Clear(0);
	LCD_Clear(1);
	LCD_Clear(2);
	LCD_Clear(3);

	LCD_WriteCommand(0xb3);             //Page address = 3
	LCD_WriteCommand(0x10);             //Column address MSB = 0
	LCD_WriteCommand(0x01);             //Column address LSB = 1
    delay1ms();
	for(column=30; column<45; column++) //Display LOGO
	{
		LCD_WriteData(logo[column]);
	}
	for(column=16; column<25; column++)
	{
		LCD_WriteData(0x00);
	}
	for(column=0; column<12; column++)  //Display OP_STA
	{
		LCD_WriteData(op_sta[column]>>8);
	}
    delay1ms();

	LCD_WriteCommand(0xb2);             //Page address = 2
	LCD_WriteCommand(0x11);             //Column address MSB = 1
	LCD_WriteCommand(0x09);             //Column address LSB = 9
    delay1ms();
	for(column=0; column<12; column++)  //Display OP_STA
	{
		LCD_WriteData(op_sta[column]);
	}
    delay1ms();
}

//Display text
void LCD_DisplayText(char *text)
{
	uint8 i,m,num,column;
	uint8 asciitemp[16];
	uint16 hanzitemp[16];
	uint8 changetemp[16];
	uint32 hanzi;
	uint8 b1,b0;
	uint16 *hanzitext;
	
	LCD_Clear(0);
	LCD_Clear(1);

	num = 0;
	column = 0;
	while(text[num]!='\0')
	{
		b1 = text[num];
		if(b1<=0x80)
		{
			for(i=0; i<16; i++)
			{
				asciitemp[i] = ascii_16[i+b1*16];
			}
			
			for(m=0; m<8; m++)
			{
				changetemp[m] = ((asciitemp[0]<<(m+8))&0x8000|
								 (asciitemp[1]<<(m+7))&0x4000|
								 (asciitemp[2]<<(m+6))&0x2000|
								 (asciitemp[3]<<(m+5))&0x1000|
								 (asciitemp[4]<<(m+4))&0x0800|
								 (asciitemp[5]<<(m+3))&0x0400|
								 (asciitemp[6]<<(m+2))&0x0200|
								 (asciitemp[7]<<(m+1))&0x0100)>>8;
			}
			
			b1 = 0x10|(column>>4);
			b0 = column&0x0f;
			LCD_WriteCommand(0xb1);             //Page address = 1
			LCD_WriteCommand(b1);               //Column address MSB
			LCD_WriteCommand(b0);               //Column address LSB
    		delay1ms();
			for(m=0; m<8; m++)
			{
				LCD_WriteData(changetemp[m]);
			}
			for(m=0; m<8; m++)
			{
				changetemp[m] = ((asciitemp[8]<<(m+8))&0x8000|
								 (asciitemp[9]<<(m+7))&0x4000|
								 (asciitemp[10]<<(m+6))&0x2000|
								 (asciitemp[11]<<(m+5))&0x1000|
								 (asciitemp[12]<<(m+4))&0x0800|
								 (asciitemp[13]<<(m+3))&0x0400|
								 (asciitemp[14]<<(m+2))&0x0200|
								 (asciitemp[15]<<(m+1))&0x0100)>>8;
			}
			
			b1 = 0x10|(column>>4);
			b0 = column&0x0f;
			LCD_WriteCommand(0xb0);             //Page address = 0
			LCD_WriteCommand(b1);               //Column address MSB
			LCD_WriteCommand(b0);               //Column address LSB
    		delay1ms();
			for(m=0; m<8; m++)
			{
				LCD_WriteData(changetemp[m]);
			}

			num++;
			column = column+8;
			if(column>=128) return;
		}
		else
		{
			b0 = text[num+1];
			b1 = b1-0xa0;
			b0 = b0-0xa0;
			hanzi = 16*((b1-1)*94+(b0-1));
			hanzitext = (uint16 *)(FLASH_ADDRESS+0x1b0000);
			for(i=0; i<16; i++)
			{
				hanzitemp[i] = hanzitext[i+hanzi];
			}

			for(m=0; m<16; m++)
			{
				changetemp[m] = ((hanzitemp[0]<<(m+8))&0x800000|
								 (hanzitemp[1]<<(m+7))&0x400000|
								 (hanzitemp[2]<<(m+6))&0x200000|
								 (hanzitemp[3]<<(m+5))&0x100000|
								 (hanzitemp[4]<<(m+4))&0x080000|
								 (hanzitemp[5]<<(m+3))&0x040000|
								 (hanzitemp[6]<<(m+2))&0x020000|
								 (hanzitemp[7]<<(m+1))&0x010000)>>16;
			}
			
			b1 = 0x10|(column>>4);
			b0 = column&0x0f;
			LCD_WriteCommand(0xb1);             //Page address = 1
			LCD_WriteCommand(b1);               //Column address MSB
			LCD_WriteCommand(b0);               //Column address LSB
    		delay1ms();
			for(m=0; m<16; m++)
			{
				LCD_WriteData(changetemp[m]);
			}
			for(m=0; m<16; m++)
			{
				changetemp[m] = ((hanzitemp[8]<<(m+8))&0x800000|
								 (hanzitemp[9]<<(m+7))&0x400000|
								 (hanzitemp[10]<<(m+6))&0x200000|
								 (hanzitemp[11]<<(m+5))&0x100000|
								 (hanzitemp[12]<<(m+4))&0x080000|
								 (hanzitemp[13]<<(m+3))&0x040000|
								 (hanzitemp[14]<<(m+2))&0x020000|
								 (hanzitemp[15]<<(m+1))&0x010000)>>16;
			}
			
			b1 = 0x10|(column>>4);
			b0 = column&0x0f;
			LCD_WriteCommand(0xb0);             //Page address = 0
			LCD_WriteCommand(b1);               //Column address MSB
			LCD_WriteCommand(b0);               //Column address LSB
    		delay1ms();
			for(m=0; m<16; m++)
			{
				LCD_WriteData(changetemp[m]);
			}

			num = num+2;
			column = column+16;
			if(column>=128) return;
		}
	}
}

//*******************************************************************
//*******************************************************************
//Clear LCD display
void LCD_Clear(uint8 page)
{
	uint8 b,column;

	if(page>=4) return;
	b = 0xb0|page;
	LCD_WriteCommand(b);                //Page address
	LCD_WriteCommand(0x10);             //Column address MSB = 0
	LCD_WriteCommand(0x00);             //Column address LSB = 0
    delay1ms();
	for(column=0; column<128; column++)
	{
		LCD_WriteData(0x00);
	}
    delay1ms();
}

//Write a command to LCD
void LCD_WriteCommand(uint8 data)
{
    imm2->gpio.G1OR &= ~MCF5249_GPIO36; //LCD_RS=0
    delayIIC();

  	//Wait for transmit to complete
  	while((imm->qspi.QDLYR)&MCF5249_QSPI_QDLYR_SPE);
  	
  	imm->qspi.QAR = 0x0020;             //command buffer
  	imm->qspi.QDR = 0x0e00;

  	imm->qspi.QAR = 0x0000;             //transmit buffer
  	imm->qspi.QDR = data;
  	
  	//initiate transfer
  	imm->qspi.QDLYR |= MCF5249_QSPI_QDLYR_SPE;
}

//Write a data to LCD
void LCD_WriteData(uint8 data)
{
    imm2->gpio.G1OR |= MCF5249_GPIO36;  //LCD_RS=1
    delayIIC();

  	//Wait for transmit to complete
  	while((imm->qspi.QDLYR)&MCF5249_QSPI_QDLYR_SPE);
  	
  	imm->qspi.QAR = 0x0020;             //command buffer
  	imm->qspi.QDR = 0x0e00;

  	imm->qspi.QAR = 0x0000;             //transmit buffer
  	imm->qspi.QDR = data;
  	
  	//initiate transfer
  	imm->qspi.QDLYR |= MCF5249_QSPI_QDLYR_SPE;
}

⌨️ 快捷键说明

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