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

📄 lcd.h

📁 香港科大机器人资料 单片机相关知识
💻 H
字号:
#ifndef _LCD_H_
#define _LCD_H_

#include "P89v51rx2.h"
#include "delay.h"
#include "io_assign.h"
#include "intrins.h"

/*
引脚说明
EN..........P1_2
RS..........P0_1
RW..........P0_0
LCDBUS......P0_4 - P0_7
*/

//------------------------LCD相关命令------------------------------------------
#define 	MSB 					0x80
#define  	DATA_MODE    			0x28
#define  	OPEN_SCREEN    			0x0C
#define  	DISPLAY_ADDRESS   		0x80
//------------------------------------------------------------------------------

//----------------------------全局变量声明-------------------------------------
#define LCDBUS            P0
#define LCD_ENABLE        P1_2
#define LCD_RS            P0_1
#define LCD_RW            P0_0
//------------------------------------------------------------------------------

static uchar temp_num[7]={0,0,0,0,0,0,0};

//-------------------------------函数声明---------------------------------------
void LCM1602_write_cmd_4b(unsigned char comm);
void LCM1602_write_cmd(unsigned char comm); 
void LCM1602_write_data(unsigned char dat);

void LCM1602_Init(void);
void LCM1602_clear(void);							
void LCM1602_set_xy(unsigned char x, unsigned char y);						
void LCM1602_write_char(unsigned x,unsigned char y,unsigned char dat);		
void LCM1602_write_string(unsigned char x,unsigned char y,unsigned char *s);
void LCM1602_Read_BF(void);													
void num(unsigned char x,unsigned char y,unsigned int n);
void num16(unsigned char row,unsigned char col,unsigned int n);
//-------------------------------------------------------------------------------- 

void LCM1602_Init(void)
{
	LCM1602_write_cmd(DATA_MODE);
	LCM1602_write_cmd(DATA_MODE);
	LCM1602_write_cmd(DATA_MODE);		//set 4 bit data transmission mode 
	LCM1602_write_cmd(OPEN_SCREEN);		//open display (enable lcd display)
	LCM1602_write_cmd(DISPLAY_ADDRESS);	//set lcd first display address 
	LCM1602_write_cmd(0x01);			//clear screen
}


void LCM1602_Read_BF(void)
{
	LCD_RW=1;		//RW 1
	LCD_RS=0;		//RS 0
	LCD_ENABLE=1;	//EN 1	Read BF
 	LCDBUS=LCDBUS&0x0F|0xf0;
	while(LCDBUS&MSB);
	LCD_ENABLE=0;		
}
void LCD_en_write(void)		//EN端产生一个高电平脉冲,写LCD
{
	LCD_ENABLE=1;
	_nop_();
	LCD_ENABLE=0;	
}

//*********************************************
void LCM1602_write_cmd(unsigned char command)
{
	LCM1602_Read_BF();
	LCD_RS=0;   	//RS 0 
	LCD_RW=0;		//RW 0 
	
	LCDBUS&=0x0F;
	LCDBUS=command&0xf0 | LCDBUS&0x0f;
	LCD_en_write();
	command=command<<4; 
	LCDBUS&=0x0F;
	LCDBUS=command&0xf0 | LCDBUS&0x0f;
	LCD_en_write();
}

void LCM1602_write_data(unsigned char dat)
{
	LCM1602_Read_BF();
	LCD_RS=1;	 //RS 1 
	LCD_RW=0;	 //RW 0 
	LCDBUS &=0x0F;
	LCDBUS=dat&0xf0 | LCDBUS&0x0f;
	LCD_en_write();
	dat=dat<<4;
	LCDBUS &=0x0F;
	LCDBUS=dat&0xf0 | LCDBUS&0x0f;
	LCD_en_write();
}
  

void LCM1602_clear(void)
{
	LCM1602_write_cmd(0x01);	
	LCM1602_Read_BF();
	delay_ms(5);
}					

void LCM1602_set_xy(unsigned char x,unsigned char y)
{
	unsigned char address;
	y&=0x0f;
	if(!x)	
		address=0x80+y;
	else 			
		address=0xc0+y;
	LCM1602_write_cmd(address); 
}

void LCM1602_write_string(unsigned char x,unsigned char y,const unsigned char *s)
{
	LCM1602_set_xy(x,y); 
	while(*s)  
	{
		LCM1602_write_data(*s);   
		s++;
	}
}

void num(unsigned char x,unsigned char y,unsigned int n)
{
	unsigned char i,length;
	unsigned int nx=n;
	for(i=0;i<7;i++)
	temp_num[i]=0;
	for(i=0;i<6;i++)
	{
		if(nx>=1)length++;
		nx/=10;
	}
	nx=n;
	for(;length>0;length--)
	{
		temp_num[length-1]=nx%10+48;
		nx/=10;
	}
	if(n==0)temp_num[0]='0';
	LCM1602_write_string(x,y,temp_num);
}

/***********************************************************************
功能:在第row行,col列处显示16进制数据n
************************************************************************/
void num16(unsigned char row,unsigned char col,unsigned int n)
{
	unsigned char i=0;
	unsigned int nx=n;
	for(i=0;i<7;i++)
	temp_num[i]=0;
	if(nx<=0xFF)
	{
		temp_num[3]=nx%16;
		nx/=16;
		temp_num[2]=nx%16;
		for(i=2;i<4;i++)
		{
			if(temp_num[i]<10)temp_num[i]+=48;
			else temp_num[i]+=55;
		}
		temp_num[4]=0x00;
	}
	else
	{
		temp_num[5]=nx%16;
		nx/=16;
		temp_num[4]=nx%16;
		nx/=16;
		temp_num[3]=nx%16;
		nx/=16;
		temp_num[2]=nx%16;
		for(i=2;i<6;i++)
		{
			if(temp_num[i]<10)temp_num[i]+=48;
			else temp_num[i]+=55;
		}
	}
	temp_num[1]='x';
	temp_num[0]='0';
	LCM1602_write_string(row,col,temp_num);
}

#endif

⌨️ 快捷键说明

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