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

📄 lcd_drive.c

📁 Lpc2103的小程序
💻 C
字号:
/*************************************** Copyright (c) *************************************************
*
*										POLAR STAR
*								北天星国际贸易(深圳)有限公司
*								http://www.po-star.com
*
*	文 件 名: LCD_DRIVE.C
*	文件描述:实现对16X2点阵液晶屏模块的显示驱动,并动态显示字符串。
*             该模块的内部芯片是HD44780。内部集成部分简单字库
*
*	说    明:将跳线器JP7的所有跳线短接至LCD控制的引脚。
*			  将跳线器JP6的所有跳线短接;
*
********************************************************************************************************/

#include  "config.h"
#include  "LCD_DRIVE.H"

#define	 LCD_DATAOUT	IODIR |= 0xF<<4;
#define	 LCD_DATAIN		IODIR &=(uint8)(~(0xF<<4));

#define	 LCD_E			1<<24
#define	 LCD_RW			1<<25
#define	 LCD_RS			1<<26
#define  BEEP			1<<21

#define HD44780_INPUT_SET_MASK        (uint8)(~(0xf<<4))
#define HD44780_OUTPUT_SET_MASK       ((0x0f<<4)|(7<<24))
/********************************************************************************************************
*
* 函数名称:HD44780_BUS_DLY(void)
*
* 功能描述:延时1uS,液晶模块的基本节拍时间。
*
* 入口参数:无
* 出口参数:无
*
* 全局变量: 无
* 调用模块: 无
*
********************************************************************************************************/

void HD44780_BUS_DLY(void)
{
	uint16 dly;
	for(dly = 0x2E;dly>0;--dly);
}
/********************************************************************************************************
*
* 函数名称:Delay100us( unsigned int n_100us )
*
* 功能描述:延时100uS
*
* 入口参数:无
* 出口参数:无
*
* 全局变量: 无
* 调用模块: 无
*
********************************************************************************************************/

static void Delay100us( uint32 arg )		//Timer0,Delay (100*n_100us)us
{
	uint32 tmp;
	for(;arg>0;--arg)
		for(tmp=0;tmp<760;tmp++);
}
/********************************************************************************************************
*
* 函数名称:uint8 CheckStatus(void)
*
* 功能描述:状态查询
*
* 入口参数:无
* 出口参数:uint8 status		当前LCD的状态
*
* 全局变量: 无
* 调用模块: 无
*
********************************************************************************************************/

uint8 CheckStatus (void)
{
	uint8 data;
	IOSET = LCD_RW;							
	IOCLR = LCD_RS;
	//LCD_DATAIN;
	IOSET = LCD_E;	
	data  = IOPIN & 0xF0;	
	HD44780_BUS_DLY();
	IOCLR = LCD_E;
    HD44780_BUS_DLY();
	IOSET = LCD_E;	
    
    data |= (IOPIN >> 4) & 0x0F;
   	HD44780_BUS_DLY();
	IOCLR = LCD_E;
	
	//LCD_DATAOUT;
	return data;
}

/********************************************************************************************************
*
* 函数名称:uint8 BusyCheck(void)
*
* 功能描述:忙查询等待
*
* 入口参数:无
* 出口参数:uint8 status		当前LCD的状态
*
* 全局变量: 无
* 调用模块: 无
*
********************************************************************************************************/

uint8 BusyCheck(void)
{
	uint8 status  = 0;
	uint16 counter = 0;
	do
	{
		status = 0x80 & CheckStatus();
		if((counter++) >= 0x3F)
		{
			status = 1;
			break;	
		}
	}while(status);
	return status;
}
/********************************************************************************************************
*
* 函数名称:WriteData (uint8 Data)
*
* 功能描述:发送一个字节到LCD
*
* 入口参数:Data	要发送的数据
* 出口参数:无
*
* 全局变量: 无
* 调用模块: 无
*
********************************************************************************************************/

void WriteData (uint8 Data)
{
	IOCLR = LCD_RW;
	IOSET = LCD_RS;
	IOSET = LCD_E;
	IOPIN  = (IOPIN & 0xFFFFFF0F)|(Data & 0xF0);
    HD44780_BUS_DLY();
	IOCLR = LCD_E;
    HD44780_BUS_DLY();
    IOSET = LCD_E;
	IOPIN  = (IOPIN & 0xFFFFFF0F)|((Data<<4) & 0xF0);
	HD44780_BUS_DLY();
	IOCLR = LCD_E;
	HD44780_BUS_DLY();
	BusyCheck();
}

/********************************************************************************************************
*
* 函数名称:uint8 ReadData(void)
*
* 功能描述:读取一个字节
*
* 入口参数:无
* 出口参数:data	回读的数据
*
* 全局变量: 无
* 调用模块: 无
*
********************************************************************************************************/

uint8 ReadData(void)
{
	uint8 data;
	IOSET = LCD_RW | LCD_RS;
	IOSET = LCD_E;
	HD44780_BUS_DLY();
	data = IOPIN & 0xF0;
	
	IOCLR = LCD_E;
    HD44780_BUS_DLY();
	IOSET = LCD_E;	
    HD44780_BUS_DLY();
    data |= (IOPIN >> 4)&0x0F;	
	IOCLR = LCD_E;
	return data;
}

/********************************************************************************************************
*
* 函数名称:WriteCommand(uint8 command)
*
* 功能描述:发送一个字节命令
*
* 入口参数:uint8 command		发送的命令数据
* 出口参数:无
*
* 全局变量: 无
* 调用模块: 无
*
********************************************************************************************************/

void WriteCommand (uint8 Command)
{
	IOCLR = LCD_RW | LCD_RS;
	IOSET = LCD_E;
	IOPIN = (IOPIN & 0xFFFFFF0F) |(Command & 0xF0);
    HD44780_BUS_DLY();
	IOCLR = LCD_E;
    HD44780_BUS_DLY();
    IOSET = LCD_E;
	IOPIN = (IOPIN & 0xFFFFFF0F) |((Command<<4) & 0xF0);	
	HD44780_BUS_DLY();
	IOCLR = LCD_E;
	HD44780_BUS_DLY();
	BusyCheck();	
}


/********************************************************************************************************
*
* 函数名称:void ShowString(uint8 Addr,const uint8 *Str,uint8 No)
*
* 功能描述:显示字符串
*
* 入口参数:uint8 Addr			-- 显示DDRAM地址
*			const uint8 *Str	-- 源字符串指针
*			uint8 No			-- 符串长度
* 出口参数:无
*
* 全局变量: 无
* 调用模块: 无
*
********************************************************************************************************/
void ShowString(uint8 Addr,const uint8 *Str,uint8 No)
{
	uint8 tmp;
	for(tmp=0;tmp<=No;tmp++)
	{
		WriteCommand((Addr + tmp) | 0x80);
		WriteData(*Str++);		
	}
}
/********************************************************************************************************
*
* 函数名称:void ShowHex(uint8 Addr,uint8 Data)
*
* 功能描述:显示十六进制数
*
* 入口参数:uint8 Addr	-- 要显示的地址
*			uint8 Data  -- 要显示的值
* 出口参数:无
*
* 全局变量: 无
* 调用模块: 无
*
********************************************************************************************************/
void ShowHex(uint8 Addr,uint8 Data)
{
	uint8 DataH,DataL;
	DataH=(Data/10)+'0';		
	DataL=(Data%10)+'0';	
	WriteCommand(Addr|0x80);		
	WriteData(DataH);
	WriteCommand((Addr+1)|0x80);
	WriteData(DataL);
}

/********************************************************************************************************
*
* 函数名称:void PowerUpInit(void)
*
* 功能描述:上电初始化,请严格参照HD44780的四线宽度的初始化说明。
*
* 入口参数:无
* 出口参数:无
*
* 全局变量: 无
* 调用模块: 无
*
********************************************************************************************************/
void PowerUpInit(void)
{
	/* Init MCU IO */
	PINSEL0 = 0x00000000;					// 设置所有控制引脚为GPIO口
	PINSEL1 = 0x00000000;					
	IODIR = HD44780_OUTPUT_SET_MASK;		// 设置所有控制引脚为输出口
	Delay100us(1510);						// 1.等待15.1mS
	WriteCommand(0x30);						// 2.8位接口
	Delay100us(41);							// 3.等待4.1mS
	WriteCommand(0x30);						// 4.8位接口
	Delay100us(2);							// 5
	WriteCommand(0x30);						// 6.
	//WriteCommand(0x20);					// 测试实验得知、该操作可省略
	WriteCommand(0x28);						// 四线操作、双行显示、5*8字体
	WriteCommand(0x0C);						// 设置显示模式:使能显示,关光标显示
	WriteCommand(0x01);						// 清屏
	Delay100us(20);							// 清屏操作等待
	WriteCommand(0x06);						// 12
}

/********************************************************************************************************/

const uint8 st1[]="                ";
const uint8 st2[]="       P        ";
const uint8 st3[]="      Po r      ";
const uint8 st4[]="     Pol ar     ";
const uint8 st5[]="    Pola tar    ";
const uint8 st6[]="   Polar Star   ";

const uint8 st7[] ="                ";
const uint8 st8[] ="       LK       ";
const uint8 st9[] ="      LPEK      ";
const uint8 st10[]="     LPC-EK     ";
const uint8 st11[]="    LPC2x-EK    ";
const uint8 st12[]="   LPC210x-EK   ";
const uint8 st13[]="Polar Star";
const uint8 st14[]="LPC210x-EK";
const uint8* sr[6]={st1,st2,st3,st4,st5,st6};
const uint8* sr2[6]={st7,st8,st9,st10,st11,st12};
/********************************************************************************************************
*
* 函数名称:main()
*
* 功能描述:显示字符串
*
* 入口参数:无
* 出口参数:无
*
* 全局变量: 无
* 调用模块: 无
*
********************************************************************************************************/
int main(void)
{
	int8 tmp,tmp1;
	const uint8 **p1,**p2;
	PowerUpInit();
	
	while(1)
	{
		p1 = sr;
		p2 = sr2;
		for(tmp=0;tmp<6;tmp++)				// 两边伸展显示操作控制
		{
			ShowString(0,p1[tmp],16);
			ShowString(0x40,p2[tmp],16);
			Delay100us(3000);
			WriteCommand(1);
			Delay100us(40);
		}
		ShowString(0,p1[5],16);				// 画面定格
		ShowString(0x40,p2[5],16);	
		Delay100us(12000);	
		for(tmp=5;tmp>=0;tmp--)				// 中间收缩显示操作控制
		{
			ShowString(0,p1[tmp],16);
			ShowString(0x40,p2[tmp],16);
			Delay100us(3000);
			WriteCommand(1);
			Delay100us(40);
		}		
		Delay100us(12000);
		tmp1 = 0x10;
		for(tmp=0;tmp<0x19;tmp++)			// 两端相对运动操作控制
		{
			tmp1--;
			ShowString(0+tmp-9,st13,9);
			ShowString(0x40+tmp1,st14,9);
			Delay100us(3000);
			if(tmp==12)						// 对齐定格操作
			Delay100us(12000);
			WriteCommand(1);
			Delay100us(40);			
		}			
		tmp1=0;
		for(tmp=0xf;tmp1<0x19;tmp--)		// 两端相对运动操作控制
		{
			ShowString(0+tmp,st13,9);
			ShowString(0x40+tmp1-9,st14,9);
			Delay100us(3000);
			if(tmp==3)						// 对齐定格操作
			Delay100us(12000);			
			WriteCommand(1);
			Delay100us(40);
			tmp1++;
		}
		Delay100us(12000);
	
	}
	return(0);
}

⌨️ 快捷键说明

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