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

📄 lcd_k.c

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

#include  "..\inc\config.h"

#define	 LCD_DATAOUT	IO0DIR |= 0xF<<4;
#define	 LCD_DATAIN	IO0DIR &=(U8)(~(0xF<<4));


#define HD44780_INPUT_SET_MASK        (U8)(~(0xf<<4))
#define HD44780_OUTPUT_SET_MASK       ((0x0f<<4)|(7<<24))

/********************************************************************************************************
* 函数名称:HD44780_BUS_DLY(void)
* 功能描述:延时1uS,液晶模块的基本节拍时间。
* 入口参数:无
* 出口参数:无
********************************************************************************************************/

volatile void HD44780_BUS_DLY(void)
{
	U8 dly;
	for(dly = 0x2E;dly>0;--dly);
}

/********************************************************************************************************
* 函数名称:Delay100us( unsigned int n_100us )
* 功能描述:延时100uS
* 入口参数:无
* 出口参数:无
********************************************************************************************************/

volatile void Delay100us( U32 arg )		
{
	U32 tmp;
	for(;arg>0;--arg)
		for(tmp=0;tmp<760;tmp++);
}

/********************************************************************************************************
* 函数名称:U8 CheckStatus(void)
* 功能描述:状态查询
* 入口参数:无
* 出口参数:U8 status		当前LCD的状态
********************************************************************************************************/

U8 CheckStatus (void)
{
	U8 data;
	IO0SET = LCD_RW;							
	IO0CLR = LCD_RS;
        IO0DIR&=0XFFFFFF0F;

	IO0SET = LCD_E;	
	data  = IO0PIN & 0xF0;	
	HD44780_BUS_DLY();
	IO0CLR = LCD_E;
        HD44780_BUS_DLY();
	IO0SET = LCD_E;	
        data |= (IO0PIN >> 4) & 0x0F;
   	HD44780_BUS_DLY();
	IO0CLR = LCD_E;
	return data;
}

/********************************************************************************************************
* 函数名称:U8 BusyCheck(void)
* 功能描述:忙查询等待
* 入口参数:无
* 出口参数:U8 status		当前LCD的状态
********************************************************************************************************/

U8 BusyCheck(void)
{
	U8 status  = 0;
	U16 counter = 0;
	do
	{
		status = 0x80 & CheckStatus();
		if((counter++) >= 0x3F)
		{
			status = 1;
			break;	
		}
	}while(status);
	return status;
}

/********************************************************************************************************
* 函数名称:WriteData (U8 Data)
* 功能描述:发送一个字节到LCD
* 入口参数:Data	要发送的数据
* 出口参数:无
********************************************************************************************************/

void WriteData (U8 Data)
{
	IO0CLR = LCD_RW;
	IO0SET = LCD_RS;
        IO0DIR|=0XF0;
	IO0PIN  = (IO0PIN & 0xFFFFFF0F)|(Data & 0xF0);  //读取高4位数据
        IO0SET = LCD_E;

        HD44780_BUS_DLY();
	IO0CLR = LCD_E;
        HD44780_BUS_DLY();

        IO0PIN  = (IO0PIN & 0xFFFFFF0F)|((Data<<4) & 0xF0); //读取低4位数据
        IO0SET = LCD_E;
	HD44780_BUS_DLY();
	IO0CLR = LCD_E;
	HD44780_BUS_DLY();
	BusyCheck();

}

/********************************************************************************************************
* 函数名称:U8 ReadData(void)
* 功能描述:读取一个字节
* 入口参数:无
* 出口参数:data	回读的数据
********************************************************************************************************/

U8 ReadData(void)
{
	U8 data;
	IO0SET = LCD_RW | LCD_RS;
        IO0DIR&=0XFFFFFF0F;       //输入模式
	IO0SET = LCD_E;
	HD44780_BUS_DLY();
	data = IO0PIN & 0xF0;
	
	IO0CLR = LCD_E;
        HD44780_BUS_DLY();
	IO0SET = LCD_E;	
        HD44780_BUS_DLY();
        data |= (IO0PIN >> 4)&0x0F;	
	return data;
}

/********************************************************************************************************
* 函数名称:WriteCommand(U8 command)
* 功能描述:发送一个字节命令
* 入口参数:U8 command		发送的命令数据
* 出口参数:无
********************************************************************************************************/

void WriteCommand (U8 Command)
{
	IO0CLR = LCD_RW | LCD_RS;
        IO0DIR|=0XF0;
        IO0PIN = (IO0PIN & 0xFFFFFF0F) |(Command & 0xF0);
	IO0SET = LCD_E;
	
        HD44780_BUS_DLY();
	IO0CLR = LCD_E;
        HD44780_BUS_DLY();
        IO0PIN = (IO0PIN & 0xFFFFFF0F) |((Command<<4) & 0xF0);
        IO0SET = LCD_E;
		
	HD44780_BUS_DLY();
	IO0CLR = LCD_E;
	HD44780_BUS_DLY();
	BusyCheck();	
}


/********************************************************************************************************
* 函数名称:void ShowString(U8 Addr,const U8 *Str,U8 No)
* 功能描述:显示字符串
* 入口参数:U8 Addr			-- 显示DDRAM地址
*	    const U8 *Str	        -- 源字符串指针
*	    U8 No			-- 符串长度
* 出口参数:无
********************************************************************************************************/
void ShowString(int Addr,const U8 *Str,U8 No)
{
	U8 tmp=0;
        while(*Str)
        {
          WriteCommand((Addr + tmp) | 0x80);
          WriteData(*Str);
          tmp++;
          Str++;
        }
        WriteCommand(0x0C);	
}
/********************************************************************************************************
* 函数名称:void ShowHex(U8 Addr,U8 Data)
* 功能描述:显示十六进制数
* 入口参数:U8 Addr	-- 要显示的地址
*			U8 Data  -- 要显示的值
* 出口参数:无
********************************************************************************************************/
void ShowHex(int Addr,U8 Data)
{
	U8 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;					
	IO0DIR = HD44780_OUTPUT_SET_MASK|LCD_BL;		                // 设置所有控制引脚为输出口
        IO0SET=LCD_BL;
	Delay100us(1510);						// 1.等待15.1mS
	//WriteCommand(0x20);					        // 测试实验得知、该操作可省略
	WriteCommand(0x28);						// 四线操作、双行显示、5*8字体
	WriteCommand(0x0C);						// 设置显示模式:使能显示,关光标显示
	WriteCommand(0x01);						// 清屏
	Delay100us(16);							// 清屏操作等待
	WriteCommand(0x06);						// 12

}

/********************************************************************************************************
* 函数名称:void PLL_Init(void)
* 功能描述:PLL上电初始化。
* 入口参数:无
* 出口参数:无
********************************************************************************************************/
void PLL_Init(void)
{
        PLLCON = 1;//启动PLL时钟
	#if ((Fcclk / 4) / Fpclk) == 1
		VPBDIV = 0;
	#endif
	#if ((Fcclk / 4) / Fpclk) == 2
		VPBDIV = 2;
	#endif
	#if ((Fcclk / 4) / Fpclk) == 4
		VPBDIV = 1;
	#endif
	#if (Fcco / Fcclk) == 2
		PLLCFG = ((Fcclk / Fosc) - 1) | (0 << 5);
	#endif
	#if (Fcco / Fcclk) == 4
		PLLCFG = ((Fcclk / Fosc) - 1) | (1 << 5);
	#endif
	#if (Fcco / Fcclk) == 8
		PLLCFG = ((Fcclk / Fosc) - 1) | (2 << 5);
	#endif
	#if (Fcco / Fcclk) == 16
		PLLCFG = ((Fcclk / Fosc) - 1) | (3 << 5);
	#endif
		PLLFEED = 0xaa;
		PLLFEED = 0x55;
		while((PLLSTAT & (1 << 10)) == 0);//等待锁定
		PLLCON = 3;//启用PLL时钟作为系统时钟
		PLLFEED = 0xaa;
		PLLFEED = 0x55;	
}

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

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

const U8 st7[] ="                ";
const U8 st8[] ="       LK       ";
const U8 st9[] ="      LPEK      ";
const U8 st10[]="     LPC-EK     ";
const U8 st11[]="    LPC2x-EK    ";
const U8 st12[]="   LPC210x-EK   ";
const U8 st13[]="Polar Star";
const U8 st14[]="LPC210x-EK";
const U8* sr[6]={st1,st2,st3,st4,st5,st6};
const U8* sr2[6]={st7,st8,st9,st10,st11,st12};

/********************************************************************************************************
* 函数名称:main()
* 功能描述:显示字符串
* 入口参数:无
* 出口参数:无
********************************************************************************************************/
void main(void)
{
	U8 tmp,tmp1;
	const U8 **p1,**p2;
        PLL_Init();
	PowerUpInit();


	while(1)
	{
		p1 = sr;
		p2 = sr2;
		for(tmp=0;tmp<6;tmp++)				// 两边伸展显示操作控制
		{
			ShowString(0,p1[tmp],16);
			ShowString(0x40,p2[tmp],16);
			Delay100us(800);
			WriteCommand(1);
			Delay100us(40);
		}
		ShowString(0,p1[5],16);				// 画面定格
		ShowString(0x40,p2[5],16);	
		Delay100us(6000);	
		for(tmp=5;tmp>0;tmp--)				// 中间收缩显示操作控制
		{
			ShowString(0,p1[tmp],16);
			ShowString(0x40,p2[tmp],16);//2nd line
			Delay100us(800);
			WriteCommand(1);
			Delay100us(40);
		}		
		Delay100us(2000);	
		tmp1 = 0x10;
		for(tmp=0;tmp<0x19;tmp++)			// 两端相对运动操作控制
		{
			tmp1--;
			ShowString(0+tmp-9,st13,9);
			ShowString(0x40+tmp1,st14,9);
			Delay100us(800);
			if(tmp==12)						// 对齐定格操作
			Delay100us(6000);
			WriteCommand(1);
			 Delay100us(40);			
		}			
		tmp1=0;
		for(tmp=0xf;tmp1<0x19;tmp--)		// 两端相对运动操作控制
		{
			ShowString(0+tmp,st13,9);
			ShowString(0x40+tmp1-9,st14,9);
			Delay100us(800);
			if(tmp==3)						// 对齐定格操作
			Delay100us(6000);			
			WriteCommand(1);
			Delay100us(40);
			tmp1++;
		}
		Delay100us(12000);
	
	}
	
}

⌨️ 快捷键说明

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