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

📄 lcd.c

📁 2005年全国大学生电子设计竞赛论文集
💻 C
字号:
#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 + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -