lcd.c

来自「2005年全国大学生电子设计竞赛论文集」· C语言 代码 · 共 182 行

C
182
字号
#include <SPCE061V004.h>
#include "LCD.h"

void Delay( unsigned int delay )
{
	unsigned int i ;
	
	for( i = 0 ; i < delay ; i++ )
	{
		*P_Watchdog_Clear=0x0001;
	}
}

void LCD_Init( )
{
	
	//LCD初始化
	Delay( 1000 ) ;
	LCD_WriteCmd( LCD_Func | LCD_FuncBit8  | LCD_FuncDual | LCD_Func0508 ) ;
	Delay( 300 ) ;
	LCD_WriteCmd( LCD_Func | LCD_FuncBit8  | LCD_FuncDual | LCD_Func0508 ) ;
	Delay( 300 ) ;
	LCD_WriteCmd( LCD_Func | LCD_FuncBit8  | LCD_FuncDual | LCD_Func0508 ) ;
	Delay( 300 ) ;
	while( LCD_isBusy( ) ) ;
	LCD_WriteCmd( LCD_Func | LCD_FuncBit8  | LCD_FuncDual | LCD_Func0508 ) ;
	while( LCD_isBusy( ) ) ;
	LCD_WriteCmd( LCD_OnOff | LCD_ScrOff | LCD_CurOff | LCD_FlashOn ) ;
	while( LCD_isBusy( ) ) ;
	LCD_WriteCmd( LCD_Clear ) ;
	while( LCD_isBusy( ) ) ;
	LCD_WriteCmd( LCD_Mode | LCD_AC_Inc | LCD_NoRoll ) ;
	while( LCD_isBusy( ) ) ;
	LCD_WriteCmd( LCD_OnOff | LCD_ScrOn | LCD_CurOn | LCD_FlashOn ) ;
	while( LCD_isBusy( ) ) ;
}

void LCD_Lamp( unsigned int on_off )
{
	if( on_off )
	{
		LCD_SetLT ;
	}
	else
	{
		LCD_ClrLT ;
	}
}

void LCD_WriteCmd( unsigned int cmd )
{

	//A口高8位作为数据口,设为同相输出状态
	*P_IOA_Buffer = *P_IOA_Buffer & 0x00ff ;
	*P_IOA_Attrib = *P_IOA_Attrib | 0xff00 ;
	*P_IOA_Dir = *P_IOA_Dir | 0xff00 ;
	
	LCD_ClrRS ;
	LCD_ClrRW ;
	
	
	*P_IOA_Buffer = ( *P_IOA_Buffer & 0x00ff ) | ( cmd << 8 ) ;
		
	LCD_NegEdgeEN ;
}

unsigned int LCD_ReadStat( void )
{
	unsigned int state ;
	

	*P_IOA_Buffer = *P_IOA_Buffer | 0xff00 ;
	*P_IOA_Attrib = *P_IOA_Attrib & 0x00ff ;
	*P_IOA_Dir = *P_IOA_Dir & 0x00ff ;
	
	LCD_ClrRS ;
	LCD_SetRW ;
	LCD_SetEN ;
	
	state = ( *P_IOA_Data & 0xff00 ) >> 8 ;
	return ( state ) ;
}

void LCD_WriteDat( unsigned int dat )
{
	*P_IOA_Buffer = *P_IOA_Buffer & 0x00ff ;
	*P_IOA_Attrib = *P_IOA_Attrib | 0xff00 ;
	*P_IOA_Dir = *P_IOA_Dir | 0xff00 ;
		
	LCD_SetRS ;
	LCD_ClrRW ;
	
	*P_IOA_Buffer = ( *P_IOA_Buffer & 0x00ff ) | ( dat << 8 ) ;

	LCD_NegEdgeEN ;
}

unsigned int LCD_ReadDat( void )
{
	unsigned int dat ;
	
	//A口高8位作为数据口,设为上拉输入方式
	*P_IOA_Buffer = *P_IOA_Buffer | 0xff00 ;
	*P_IOA_Attrib = *P_IOA_Attrib & 0x00ff ;
	*P_IOA_Dir = *P_IOA_Dir & 0x00ff ;
	
	LCD_SetRS ;
	LCD_SetRW ;
	LCD_SetEN ;
	
	dat = ( *P_IOA_Data & 0xff00 ) >> 8 ;

	return ( dat ) ;
}

unsigned int LCD_isBusy( void )
{
	unsigned int busy ;
	
	//A口高8位作为数据口,设为上拉输入方式
	*P_IOA_Buffer = *P_IOA_Buffer | 0xff00 ;
	*P_IOA_Attrib = *P_IOA_Attrib & 0x00ff ;
	*P_IOA_Dir = *P_IOA_Dir & 0x00ff ;
	
	busy = LCD_ReadStat( ) & 0x0080 ;
	
	return ( busy ) ;
}

void LCD_Display( unsigned int pos ,unsigned char chara )
{
	unsigned int ddram ;
	
	if( pos < 16 )
	{
		ddram = pos ;
	}
	else
	{
		ddram = pos - 16 + 0x40 ;
	}
	while( LCD_isBusy( ) ) ;
	LCD_WriteCmd( LCD_AddrDDRAM | ddram ) ;
	while( LCD_isBusy( ) ) ;
	LCD_WriteDat( chara ) ;
	while( LCD_isBusy( ) ) ;
}

void LCD_Load( unsigned char *src )
{
	unsigned int i ;
	
	for( i = 0 ;i < 32 ; i++ )
	{
		*( LCD_Buffer + i ) = *( src + i ) ;
	}
	LCD_Buffer[ 32 ] = 0 ;
}

void LCD_Update( void )
{
	unsigned int i ;
	
	for( i = 0 ; (i<32)&&(LCD_Buffer[i]!=0) ; i++ )
	{
		LCD_Display( i , LCD_Buffer[ i ] );
	}
}

void LCD_CurShow( unsigned int on_off )
{
	if( on_off )
	{
		while( LCD_isBusy( ) ) ;
		LCD_WriteCmd( LCD_OnOff | LCD_ScrOn | LCD_CurOn | LCD_FlashOn ) ;
	}
	else
	{
		while( LCD_isBusy( ) ) ;
		LCD_WriteCmd( LCD_OnOff | LCD_ScrOn | LCD_CurOff | LCD_FlashOff ) ;
	}
}

⌨️ 快捷键说明

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