📄 lcd1602.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 + -