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

📄 ht46r24.c

📁 利用HOLTEK单片机开发的1602液晶驱动
💻 C
字号:
#include <ht46r24.h>

/*=========================================================================== 
KS0070(44780) 16x2 字符液晶屏驱动演示程序总线方式 晓奇
=============================================================================
连接线图: 
LCM-------51 LCM-------51 LCM--------51
DB0-----PB.0 DB4-----PB.4 RS-------PA.0
DB1-----PB.1 DB5-----PB.5 RW-------PA.1
DB2-----PB.2 DB6-----PB.6 E--------PA.2
DB3-----PB.3 DB7-----PB.7 

[注]:HT46R24的晶振频率为12MHz
============================================================================*/

//========= 变量类型标识的宏定义,大家都喜欢这么做 ==============
#define Uchar unsigned char
#define Uint unsigned int

// ================= LCM1602A端口地址定义 =======================

#define LCD_RS  _pa0		
#define LCD_RW  _pa1		
#define LCD_E   _pa2		

#define SET_LCD_E       LCD_E=1			// LCD: E = 1
#define CLR_LCD_E       LCD_E=0			// LCD: E = 0
#define SET_LCD_RW      LCD_RW=1		// LCD: R/W = 1 (read)
#define CLR_LCD_RW      LCD_RW=0		// LCD: R/W = 0 (write)
#define SET_LCD_RS      LCD_RS=1		// LCD: R/S = 1 (data reg)
#define CLR_LCD_RS      LCD_RS=0		// LCD: R/S = 0 (status reg)
#define Busy			0x80			//用于检测LCM状态字中的Busy标识


void Delay400Ms(void);
void Delay5Ms(void);
void WaitForEnable( void );
void LcdWriteData( char dataW );
void LcdWriteCommand( Uchar CMD,Uchar AttribC );
void LcdReset( void );
void Display( Uchar dd );
void DispOneChar(Uchar x,Uchar y,Uchar Wdata);
void ePutstr(Uchar x,Uchar y, Uchar *ptr);

//测试主程序
void main(void)
{
	Uchar temp;
	char example[]="For an example. - By xiaoqi\n";

	Delay400Ms();

	LcdReset();
	temp = 32;
	ePutstr(0,0,example); // 上面一行显示一个预定字符串

	Delay400Ms();
	Delay400Ms();
	Delay400Ms();
	Delay400Ms();
	Delay400Ms();
	Delay400Ms();
	Delay400Ms();
	Delay400Ms();

	while(1)
	{
		temp &= 0x7f; // 只显示ASCII字符
		if (temp<32)temp=32; // 屏蔽控制字符,不予显示
		Display( temp++ );
		Delay400Ms();
	}
}

/*=======================================================
显示字符串
=======================================================*/
void ePutstr(Uchar x,Uchar y, Uchar  *ptr)
{
	Uchar i,l=0;
	while (ptr[l] >31){l++;};
	for (i=0;i<l;i++) 
	{
		DispOneChar(x++,y,ptr[i]);
		if ( x == 8 )
		{
			x = 0; y ^= 1;
		}
	}
}

/*=======================================================
演示一行连续字符串,配合上位程序演示移动字串
=======================================================*/
void Display( Uchar dd ) 
{

	Uchar i;

	for (i=0;i<8;i++)
	{
		DispOneChar(i,1,dd++);
		dd &= 0x7f;
		if (dd<32) dd=32;
	}
}

/*=======================================================
显示光标定位
=======================================================*/
void LocateXY( char posx,char posy) 
{

	Uchar temp;

	temp = posx & 0xf;
	posy &= 0x1;
	if ( posy )temp |= 0x40;
	temp |= 0x80;
	LcdWriteCommand(temp,0);
}

/*=======================================================
按指定位置显示数出一个字符
=======================================================*/
void DispOneChar(Uchar x,Uchar y,Uchar Wdata)
{

	LocateXY( x, y ); // 定位显示地址
	LcdWriteData( Wdata ); // 写字符
}

/*=======================================================
初始化程序, 必须按照产品资料介绍的初始化过程进行
=======================================================*/
void LcdReset( void ) 
{

    LcdWriteCommand( 0x38, 0); // 显示模式设置(不检测忙信号)
	Delay5Ms();
	LcdWriteCommand( 0x38, 0); // 共三次
	Delay5Ms();
	LcdWriteCommand( 0x38, 0);
	Delay5Ms();

	LcdWriteCommand( 0x28, 1); // 显示模式设置(以后均检测忙信号)
	LcdWriteCommand( 0x08, 1); // 显示关闭
	LcdWriteCommand( 0x01, 1); // 显示清屏
	LcdWriteCommand( 0x06, 1); // 显示光标移动设置
	LcdWriteCommand( 0x0c, 1); // 显示开及光标设置
}

/*=======================================================
写控制字符子程序: E=1 RS=0 RW=0
=======================================================*/
void LcdWriteCommand( Uchar CMD,Uchar AttribC ) 
{

	if (AttribC) WaitForEnable(); // 检测忙信号?
	
	_pbc=0;
	CLR_LCD_RS; 
	CLR_LCD_RW;
	_delay(1);
	_pb = CMD;
	_delay(1); // 送控制字子程序
	SET_LCD_E;
	_delay(1);
	_delay(1);
	CLR_LCD_E;
	_delay(1); 
	_pb = CMD << 4;
	_delay(1);
	_delay(1); // 送控制字子程序
	SET_LCD_E;
	_delay(1);
	_delay(1);
	CLR_LCD_E;
}

/*=======================================================
当前位置写字符子程序: E =1 RS=1 RW=0
=======================================================*/
void LcdWriteData( char dataW )
{

	WaitForEnable(); // 检测忙信号
	
	_pbc=0;
	SET_LCD_RS; 
	CLR_LCD_RW;
	_delay(1); 

	_pb = dataW; 
	_delay(1); 
	SET_LCD_E; 
	_delay(1);
	_delay(1);
	CLR_LCD_E; // 操作允许脉冲信号
	_delay(1); 

	_pb = dataW<<4; 
	_delay(1); 
	SET_LCD_E; 
	_delay(1);
	_delay(1);
	CLR_LCD_E; // 操作允许脉冲信号

}

/*=======================================================
正常读写操作之前必须检测LCD控制器状态: CS=1 RS=0 RW=1
DB7:    0  LCD控制器空闲; 1  LCD控制器忙
========================================================*/
void WaitForEnable( void )
{
	CLR_LCD_RS; 
	SET_LCD_RW;
	_delay(1);

	SET_LCD_E; 
	_delay(1);
	_delay(1);
	_pbc=0xff;

	while( _pb & Busy );

	CLR_LCD_E;

	SET_LCD_E; 
	_delay(1);
	_delay(1);
	CLR_LCD_E;

} 


void Delay5Ms(void)		// 短延时
{
	_delay(15000);
}


void Delay400Ms(void)	//长延时
{
	int i;
	for(i=0;i<20;i++)
	{
		_delay(60000);
	}
}


//////////////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

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