#include <REGX51.H>
#include "delay.h"
#include "lcd1602.h"
#include "string.h"
unsigned char i;
void main()
{
unsigned char *str = "Hello World";
unsigned char *str1 = "1213123213";
LCD_Init();
DelayXms(10);
//LCD_WriteCmd(LCD_CURSOR_RIGHT); //初始设置的字符输入模式整屏左移
LCD_WriteCmd(0x80); //发送指令写入 DDRAM地址
for(i=0;i<strlen(str);i++) //DDRAM地址确定往地址写入数据
{
LCD_WriteData(str[i]);
DelayXms(200);
}
LCD_WriteCmd(0xC0); //切换至第二行 继续写入数据
for(i=0;i<strlen(str1);i++)
{
LCD_WriteData(str1[i]);
DelayXms(200);
}
while(1)
{
LCD_WriteCmd(LCD_DIS_MOVE_LEFT);//显示左移
DelayXms(1000);
}
}
LCD1602.C
#include "lcd1602.h"
/*
void LCD_ReadBF() //LCD1602忙检测
{
unsigned char BF_State;//忙检测状态
unsigned char i = 0;
LCD_1602_DB = 0xFF; //读取GPIO前要赋值 避免上一次GPIO有更改
LCD1602_RS = 0; //命令 0 数据1
LCD1602_RW = 1; //写是 0 读是1
do{
LCD1602_EN = 1; //使能
BF_State = LCD_1602_DB; //读取GPIO上BF的数据
LCD1602_EN = 0; //关闭使能
i++;
if(i>20)break;
}while(BF_State & 0x80);
}
*/
void LCD_WriteCmd(unsigned char cmd) //写命令
{
LCD1602_RS = 0; //命令 0 数据1
LCD1602_RW = 0; //写是 0 读是1
LCD_1602_DB = cmd;
LCD1602_EN = 1; //使能
DelayXms(1);
LCD1602_EN = 0; //关闭使能
}
void LCD_WriteData(unsigned char date) //写数据
{
LCD1602_RS = 1; //命令 0 数据1
LCD1602_RW = 0; //写是 0 读是1
LCD_1602_DB = date;
LCD1602_EN = 1; //使能
DelayXms(1);
LCD1602_EN = 0; //关闭使能
}
void LCD_Init()
{
LCD_WriteCmd(LCD_MODE_PIN8); //8位数据口,两行,5*8点阵
LCD_WriteCmd(LCD_DIS_CUR_BLK_ON); //显示开,光标开,光标闪烁
LCD_WriteCmd(LCD_CURSOR_RIGHT); //光标右移,显示不移动
LCD_WriteCmd(LCD_SCREEN_CLR); //清屏
}
//x和y范围 x y
//第一行 0~27 0
//第二行 40~67 1
void LCD_ShowStr(unsigned char x,unsigned y,unsigned char *str)
{
if(y==0) //第一行
{
LCD_WriteCmd(0x80|x);
}
else if(y==1)
{
LCD_WriteCmd(0x80|(0x40+x));
}
while(*str != '\0')
{
LCD_WriteData(*str++);
}
}
LCD1602.H
#ifndef LCD_1602__H
#define LCD_1602__H
#include <REGX51.H>
#include "delay.h"
//I0接口的声明
#define LCD_1602_DB P0
sbit LCD1602_RS = P2^5; //命令 0 数据1
sbit LCD1602_RW = P2^6; //写是 0 读是1
sbit LCD1602_EN = P2^7; //使能
void LCD_ReadBF(); //LCD1602忙检测
void LCD_WriteCmd(unsigned char cmd); //写命令
void LCD_WriteData(unsigned char date); //写数据
void LCD_Init();
void LCD_ShowStr(unsigned char x,unsigned y,unsigned char *str);
//LCD1602指令
//显示模式设置指令
//DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
//0 0 1 DL N F * *
//DL = 1,8位数据接口;DL =0,4位数据接口
//N = 1,两行显示;N =0,单行显示。
//F=1,5*10点阵字符;:F=0,5*8点阵字符。
#define LCD_MODE_PIN8 0X38//8位数据口,两行,5*8点阵
#define LCD_MODE_PIN4 0x28//4位数据口,两行,5*8点阵
#define LCD_SCREEN_CLR 0x01//清屏
#define LCD_CURSOR_RST 0x02//光标复位
//显示开关控制指令
#define LCD_DIS_CUR_BLK_ON 0x0F //显示开,光标开,光标闪烁
#define LCD_DIS_CUR_ON 0x0E //显示开,光标开,光标不闪烁
#define LCD_DIS_ON 0x0E //显示开,光标关,光标不闪烁
#define LCD_DIS_OFF 0x08 //显示关,光标关,光标不闪炼
//显示模式控制
#define LCD_CURSOR_RIGHT 0x06 //光标右移,显示不移动
#define LCD_CURSOR_LEFT 0x04 //光标左移,显示不移动
#define LCD_DIS_MODE_LEFT 0x07 //操作后,AC自增,画面平移。
#define LCD_DIS_MODE_RIGHT 0x05 //操作后,AC自减,画面平移。
//光标、显示移动指令
#define LCD_CUR_MOVE_LEFT 0x10 //光标左移
#define LCD_CUR_MOVE_RIGHT 0x14 //光标右移
#define LCD_DIS_MOVE_LEFT 0x18 //显示左移
#define LCD_DIS_MOVE_RIGHT 0x1C //显示左移
//CGRAM 地址设置,character generator RAM(0~3FH)
//DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
// 0 1 A5 A4 A3 A2 A1 A0
//DDRAM地址设置
//DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
// 1 A6 A5 A4 A3 A2 A1 A0
// N = 0,单行显示A6~A0=00H~4FH
// N = 1,首行 A6~A0=00H~27H
// 次行 A6~A0=40H~67H
//读BF、AC值(BF:BusyFlag.)
//RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
// 0 1 BF A6 A5 A4 A3 A2 A1 A0
//写数据
//RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
// 1 0 A7 A6 A5 A4 A3 A2 A1 A0
//写命令
//RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
// 0 0 A7 A6 A5 A4 A3 A2 A1 A0
#endif
DELAY
#include "delay.h"
/****************************************
函数名:DelayXms
功能:毫秒级延时函数6
参数:unsigned int(1-65535)
返回值:无
*****************************************/
void DelayXms(unsigned int xms)
{
unsigned int i,j;
for(i=xms;i>0;i--)
for(j=124;j>0;j--);
}
#ifndef DELAY__H
#define DELAY__H
void DelayXms(unsigned int xms);
#endif
懒得写介绍了 不懂的话就下载整个工程吧
————源码来自B站UP主金善愚