51单片机Proteus仿真实现LCD1602显示及移屏幕操作

 

#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主金善愚

https://www.bilibili.com/video/BV1cV411z7pS/?spm_id_from=pageDriver&vd_source=fa74e9709c6faa09847c6b3053d6e372

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值