1.写端口等待采取延时的方式
#ifndef LCD1602
#include <intrins.h>
/**********************************端口定义***********************************/
sbit LcdRs = P2^4;
sbit LcdRw = P2^5;
sbit LcdEn = P2^6;
sbit LcdCs = P2^3;
sfr DBPort = 0x80; //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口
/*********************************延时子函数***********************************/
void Delay_1ms(unsigned int k)
{
unsigned char i;
while(k--)
{
for(i=0;i<125;i++);
}
}
/****************************向LCD写入命令或数据******************************/
#define LCD_COMMAND 0 // 选择命令寄存器(RS)
#define LCD_DATA 1 // 选择数据寄存器
#define LCD_CLEAR_SCREEN 0x01 // 清屏
#define LCD_HOMING 0x02 // 光标返回原点
void LCD_Write(bit style, unsigned char input)
{
DBPort=input;
LcdCs=0;
LcdRs=style;
LcdRw=0;
LcdEn=0;
Delay_1ms(1);
LcdEn=1;
LcdCs=1;
}
//*******************************设置显示模式**********************************/
#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 //光标不闪动
void LCD_SetDisplay(unsigned char DisplayMode)
{
LCD_Write(LCD_COMMAND, 0x08|DisplayMode);
}
//*******************************设置输入模式**********************************/
#define LCD_AC_UP 0x02 //右移
#define LCD_AC_DOWN 0x00 //左移
#define LCD_MOVE 0x01 //移动有效
#define LCD_NO_MOVE 0x00 //移动无效
void LCD_SetInput(unsigned char 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_SetDisplay(LCD_HIDE); //关闭显示
LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);//清屏
LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //右移,移动无效
}
//********************************定位显示地址*********************************/
void GotoXY(unsigned char x, unsigned char y)
{
if(y==0)
LCD_Write(LCD_COMMAND,0x80|x);
if(y==1)
LCD_Write(LCD_COMMAND,0x80|(x-0x40));
}
//********************************输入显示字符*********************************/
void Print(unsigned char *str)
{
while(*str!='\0')
{
LCD_Write(LCD_DATA,*str);
str++;
}
}
#endif
2.写端口等待采取采取忙标志位的方式
/*****************************************************************************/
#ifndef LCD1602
#include <intrins.h>
/**********************************端口定义***********************************/
sbit LcdRs = P2^4;
sbit LcdRw = P2^5;
sbit LcdEn = P2^6;
sbit LcdCs = P2^3;
sfr DBPort = 0x80; //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口
/*******************************内部等待函数*********************************/
unsigned char LCD_Wait(void)
{
LcdRs=0;//读忙信号
LcdRw=1; _nop_();
LcdEn=1; _nop_();
while(DBPort&0x80);//忙,等待
LcdEn=0;//EN由1-->0,数据写入
return DBPort;
}
/****************************向LCD写入命令或数据*****************************/
#define LCD_COMMAND 0 // 选择命令寄存器(RS)
#define LCD_DATA 1 // 选择数据寄存器
#define LCD_CLEAR_SCREEN 0x01 // 清屏
#define LCD_HOMING 0x02 // 光标返回原点
void LCD_Write(bit style, unsigned char input)
{
LcdEn=0;
LcdRs=style;
LcdRw=0; _nop_();
DBPort=input; _nop_();
LcdCs=0;
LcdEn=1; _nop_();
LcdEn=0; _nop_();
LCD_Wait();
LcdCs=1;
}
/****************************向LCD写入命令或数据******************************/
#define LCD_COMMAND 0 // 选择命令寄存器(RS)
#define LCD_DATA 1 // 选择数据寄存器
#define LCD_CLEAR_SCREEN 0x01 // 清屏
#define LCD_HOMING 0x02 // 光标返回原点
void LCD_Write(bit style, unsigned char input)
{
DBPort=input;
LcdCs=0;
LcdRs=style;
LcdRw=0;
LcdEn=0;
Delay_1ms(1);
LcdEn=1;
LcdCs=1;
}
//*******************************设置显示模式**********************************/
#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 //光标不闪动
void LCD_SetDisplay(unsigned char DisplayMode)
{
LCD_Write(LCD_COMMAND, 0x08|DisplayMode);
}
//*******************************设置输入模式**********************************/
#define LCD_AC_UP 0x02 //右移
#define LCD_AC_DOWN 0x00 //左移
#define LCD_MOVE 0x01 //移动有效
#define LCD_NO_MOVE 0x00 //移动无效
void LCD_SetInput(unsigned char 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_SetDisplay(LCD_HIDE); //关闭显示
LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);//清屏
LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //右移,移动无效
}
//********************************定位显示地址*********************************/
void GotoXY(unsigned char x, unsigned char y)
{
if(y==0)
LCD_Write(LCD_COMMAND,0x80|x);
if(y==1)
LCD_Write(LCD_COMMAND,0x80|(x-0x40));
}
//********************************输入显示字符*********************************/
void Print(unsigned char *str)
{
while(*str!='\0')
{
LCD_Write(LCD_DATA,*str);
str++;
}
}
#endif
文章评论(0条评论)
登录后参与讨论