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

📄 lcd1602.c

📁 基于51单片机
💻 C
字号:
#include <reg51.h>
#include <intrins.h>


/*************************宏定义******************************/
#define uchar unsigned char
#define uint  unsigned int

/************************管脚定义******************************/
sbit LcdRs		= P1^1;     //rs
sbit LcdRw		= P1^2;    //vo1.2
sbit LcdEn  	= P1^0;   //1.0
sfr  DBPort 	= 0x80;		//P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口

/************************LCD写入命令或数据************************/
#define LCD_COMMAND			0      // Command
#define LCD_DATA			   1      // Data
#define LCD_CLEAR_SCREEN	0x01   // 清屏
#define LCD_HOMING  		   0x02   // 光标返回原点
#define LCD_SHOW			   0x04   //显示开
#define LCD_HIDE			   0x00   //显示关	  
#define LCD_CURSOR			0x02 	 //显示光标
#define LCD_NO_CURSOR		0x00   //无光标		     
#define LCD_FLASH			   0x01   //光标闪动
#define LCD_NO_FLASH		   0x00   //光标不闪动
#define LCD_AC_UP			   0x02
#define LCD_AC_DOWN			0x00   // 
#define LCD_MOVE			   0x01   // 画面可平移
#define LCD_NO_MOVE			0x00    //default

int swap(int i)
{
  int tmp1,tmp2,k;

  for(k=0;k<4;k++)
 {
   tmp1=i&(1<<k);
   tmp2=i&(1<<(7-k));
  if(tmp1==0)
  {
   i=i&(~(1<<(7-k)));
  }
  else
  {
  i=i|(1<<(7-k));
  }
  if(tmp2==0)
  {
   i=i&(~(1<<k));
  }
  else
  {
  i=i|(1<<k);
  }
 }
 return i;
}

/************************内部等待函数******************************/
unsigned char LCD_Wait(void)
{
	LcdRs=0;
	LcdRw=1;	_nop_();
	LcdEn=1;	_nop_();
//	while(DBPort&0x80);//在用Proteus仿真时,注意用屏蔽此语句,在调用GotoXY()时,会进入死循环,
						 //可能在写该控制字时,该模块没有返回写入完备命令,即DBPort&0x80==0x80
						 //实际硬件时打开此语句
	LcdEn=0;
	return DBPort;		
}

/************************LCD_Write()******************************/
void LCD_Write(bit style, uchar input)
{
	LcdEn=0;
	LcdRs=style;
	LcdRw=0;		_nop_();
	DBPort=swap(input);	_nop_();//注意顺序
	LcdEn=1;		_nop_();//注意顺序
	LcdEn=0;		_nop_();
	LCD_Wait();	
}

/************************LCD_SetDisplay()******************************/
void LCD_SetDisplay(uchar DisplayMode)
{
	LCD_Write(LCD_COMMAND, 0x08|DisplayMode);	
}

/***********************设置输入模式***********************************/
void LCD_SetInput(uchar InputMode)
{
	LCD_Write(LCD_COMMAND, 0x04|InputMode);
}

/************************初始化LCD******************************/
void LCD_Initial()
{
	LcdEn=0;
	LCD_Write(LCD_COMMAND,0x38);           //8位数据端口,2行显示,5*7点阵
	LCD_Write(LCD_COMMAND,0x38);
	LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);    //开启显示, 无光标
	LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
	LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE);       //AC递增, 画面不动
}

/****************************GotoXY()**********************************/
void GotoXY(uchar x, uchar y)
{
	if(y==0)
		LCD_Write(LCD_COMMAND,0x80|x);
	if(y==1)
		LCD_Write(LCD_COMMAND,0x80|(x-0x40));
}

/****************************Print()**********************************/
void Print(uchar *str)
{
   for(;*str!='\0';str++)
   LCD_Write(LCD_DATA,*str);
}

⌨️ 快捷键说明

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