3_1602液晶屏使用文档

文件网盘链接:https://pan.baidu.com/s/158e_RyHuAqLyWNqZZhgi2A?pwd=1111 提取码:1111

1、1602液晶屏工作原理

本次使用的是长沙太阳人电子有限公司的1602液晶屏(规格书在网盘链接中),其他厂家的1602液晶屏使用方法同理,只要根据具体厂家规格书中的指令和时序图操作即可。
1602液晶屏的命名含义是液晶屏每行可显示16个字符,有2行。引脚如下图所示,引脚说明如下表所示。
image image
1602液晶屏内部含有80字节RAM,有1个地址指针和数据指针,两行屏幕字符位置地址如下图所示。
image
1602液晶屏操作分为读/写操作,读操作分为读状态字和读数据,写操作分为写指令和写数据。操作时序如下表所示。
image
1602液晶屏读/写时序图如下图所示。
image image
image
1602液晶屏状态字可用于判忙(当1602液晶屏处于繁忙状态时,用户不要向1602液晶屏进行读/写操作,否则会出错),1602液晶屏的状态字有8位STA7-STA0(高位到低位),STA7为1时禁止向1602液晶屏进行读/写操作(STA7为0时允许),STA6-STA0是当前数据地址指针的值。1602的指令类型可分为六种,如下表所示。
image
长沙太阳人电子公司的1602液晶屏规格书的初始化过程如下表所示。
image

2、外围电路原理图

image

3、仿真工程及代码

3.1 仿真工程

image

3.2 仿真代码

1、delay的头文件

点击查看代码
#ifndef	__DELAY_H__
#define __DELAY_H__

#define uint8 unsigned char
#define uint16 unsigned int
#define uint32 unsigned long

void delay(uint8 xms);

#endif

2、delay的C文件

点击查看代码
#include "delay.h"

/**********************************************************
函数名:void delay(uint8 xms)
函数功能:延时x毫秒
函数调用:delay(uint8 xms)
参数列表:xms,x毫秒(取值范围0~65535)
函数返回值:无
***********************************************************/
void delay(uint8 xms)
{
	uint8 x,y;
	for(x=xms;x>0;x--)
		for(y=110;y>0;y--);
}

3、1602LCD的头文件

点击查看代码
#ifndef __1602LCD_H__
#define __1602LCD_H__

#define uint8 unsigned char
#define uint16 unsigned int
#define uint32 unsigned long

void Init_1602();
void Busy_1602();
void write_order_1602(uint8 order_1602);
void write_data_1602(uint8 data_1602);
void display_string_1602(uint8 x_1602,uint8 y_1602,uint8 *p_1602,uint8 count_1602);
void display_number_1602(uint8 x_1602,uint8 y_1602,uint32 number,uint8 count_1602);

#endif

4、1602LCD的C文件

点击查看代码
#include <reg52.h>
#include "delay.h"
#include "1602LCD.h"

#define LCD_1602_IO P0 //P0口作为1602的8位数据口
sbit EA_1602=P2^4; //1602液晶屏使能端
sbit RS_1602=P2^5; //选择数据/命令(高/低电平有效)
sbit RW_1602=P2^6; //选择读/写指令(高/低电平有效)

/**********************************************************
函数名:Init_1602()
函数功能:1602液晶屏初始化设置
参数列表:无
函数返回值:无
***********************************************************/
void Init_1602()
{
	delay(15); //延时15ms
	write_order_1602(0x38); //写指令0x38,1602显示模式设置
	delay(5); //延时5ms
	write_order_1602(0x38); //写指令0x38,1602显示模式设置
	delay(5); //延时5ms
	write_order_1602(0x38); //写指令0x38,1602显示模式设置
	
	//后续每次读/写操作前要先对1602进行判忙
	Busy_1602(); //判忙
	write_order_1602(0x38); //写指令0x38,1602显示模式设置
	Busy_1602(); //判忙
	write_order_1602(0x08); //写指令0x08,1602显示关闭
	Busy_1602(); //判忙
	write_order_1602(0x01); //写指令0x01,1602显示清屏(数据指针和显示数据清零)
	Busy_1602(); //判忙
	write_order_1602(0x06); //写指令0x06,读/写一个字符后数据指针和光标自动加一,写一个字符后整屏显示不移动
	Busy_1602(); //判忙
	write_order_1602(0x0c); //写指令0x0C,打开1602的显示,关闭光标,光标不闪烁
}

/**********************************************************
函数名:Busy_1602()
函数功能:1602液晶屏判忙函数,检测1602液晶屏是否可以进行读/写操作(判忙函数)
参数列表:无
函数返回值:无
***********************************************************/
void Busy_1602()
{
	uint8 Busy_data=0; //暂存1602的8位数据
	LCD_1602_IO=0xff; //用单片机IO口读取数据前要先手动置1释放总线
	//读状态字时序
	//每次读状态字都要改变一次时序,但不用每次都改变3个引脚的时序
	//只要改变其中一个脚的时序,其余两个脚的电平保持不变即可
	RS_1602=0;
	RW_1602=1;
	//EA_1602=1; //在循环内改变EA脚的时序,每次读状态字前改变EA脚的时序即可
	do{	
		EA_1602=1; //改变EA时序,读状态字
		Busy_data=LCD_1602_IO; //P0口读状态字并暂存在Busy_data中	
		EA_1602=0; //读完状态字后将EA手动置0,等下一轮再用
	}while(Busy_data & 0x80); //STA7为0时允许对1602读/写,此时结束循环
	LCD_1602_IO=0xff; //用单片机IO口读完数据后手动置1释放总线
}

/**********************************************************
函数名:write_order_1602(uint8 order_1602)
函数功能:给1602液晶屏写指令
参数列表:
					order_1602,8位指令码
函数返回值:无
***********************************************************/
void write_order_1602(uint8 order_1602)
{
	Busy_1602(); //1602判忙,1602空闲后才能写指令
	//写指令时序
	EA_1602=0;
	RW_1602=0;
	RS_1602=0; //选择指令	
	LCD_1602_IO=order_1602; //将要发送的指令存入IO口准备发送
	EA_1602=1; //发送指令
	EA_1602=0; //发送结束,EA置0
	LCD_1602_IO=0xff; //释放总线
}

/**********************************************************
函数名:write_data_1602(uint8 data_1602)
函数功能:给1602液晶屏写数据
参数列表:
					data_1602,8位数据(ASCII码)
函数返回值:无
***********************************************************/
void write_data_1602(uint8 data_1602)
{
	Busy_1602(); //1602判忙,1602空闲后才能写指令
	//写数据时序
	EA_1602=0;
	RW_1602=0;
	RS_1602=1; //选择数据	
	LCD_1602_IO=data_1602; //将要发送的数据存入IO口准备发送
	EA_1602=1; //发送数据
	EA_1602=0; //发送结束,EA置0
	LCD_1602_IO=0xff; //释放总线
}

/**********************************************************
函数名:void display_string_1602(uint8 x_1602,uint8 y_1602,uint8 *p_1602,uint8 count_1602)
函数功能:在1602液晶屏任意行、任意列写一个任意位数的字符串
参数列表:
					x_1602,行坐标(取值范围1~2)
					y_1602,列坐标(取值范围1~16)
					*p_1602,指向要输出的字符串的指针
					count_1602,字符串位数(取值范围1~16)
函数返回值:无
***********************************************************/
void display_string_1602(uint8 x_1602,uint8 y_1602,uint8 *p_1602,uint8 count_1602)
{
	uint8 i=0;
	for(i=0;i<count_1602;i++)
	{
		if(x_1602==1)
			y_1602 |= 0x80; //第1行列坐标从0x80开始
		else
			y_1602 |= 0xc0; //第2行列坐标从0xc0开始
		write_order_1602(y_1602-1); //写指令,在第y_1602-1个位置显示字符(下标从0开始)
		write_data_1602(*p_1602); //写数据,显示数据*p_1602
		y_1602++; //列坐标加一,指针加一
		p_1602++;		
	}
}  

/**********************************************************
函数名:void display_number_1602(uint8 x_1602,uint8 y_1602,uint32 number,uint8 count_1602)
函数功能:在1602液晶屏任意行、任意列写一个任意位数的十进制数
函数调用:display_number_1602(uint8 x_1602,uint8 y_1602,uint32 number,uint8 count_1602)
参数列表:
					x_1602,行坐标(取值范围1~2)
					y_1602,列坐标(取值范围1~16)
					number,要在1602液晶屏显示的十进制数(uint32是32位,取值范围0~4294967296)
					count_1602,十进制数位数(取值范围1~10)
函数返回值:无
***********************************************************/
void display_number_1602(uint8 x_1602,uint8 y_1602,uint32 number,uint8 count_1602)
{
	uint32 tmp=number; //暂存number的值
	uint8 number_arr[10]={0}; //将number按位存入number_arr[]中
	uint8 i=0;
	
	do
	{
		number_arr[i++]=tmp%10; //将tmp的个位存入number_arr[]中
		tmp/=10; //舍弃tmp的个位
	}while(tmp!=0); //当tmp等于0时结束循环
	
	for(i=0;i<count_1602;i++)
	{
		if(x_1602==1)
			y_1602 |= 0x80; //第1行列坐标从0x80开始
		else
			y_1602 |= 0xc0; //第2行列坐标从0xc0开始
		write_order_1602(y_1602-1); //写指令,在第y_1602-1个位置显示数字(下标从0开始)
		//1602显示的字符是ASCII码,而number_arr[]存储的是十进制数,0的ASCII码是0x30
		//因此要将number_arr[]存储的十进制数加上0x30转换为ASCII码
		write_data_1602(number_arr[count_1602-1-i]+0x30); //从高位到低位输出要显示的十进制数
		y_1602++; //列坐标加一
	}
}

5、main函数C文件

点击查看代码
#include <reg52.h>
#include "delay.h"
#include "1602LCD.h"

void main()
{
	Init_1602(); //1602初始化

//	write_order_1602(0x80); //在第1行第1列写数据
//	write_data_1602(0x61); //写数据0x61(ASCII码是字符a)
//	delay(1000);
	
//	display_string_1602(1,1,"0123456789abcdef",16); //在第1行第1列显示字符串0123456789abcdef
//	display_string_1602(2,1,"0123456789abcdef",16); //在第2行第1列显示字符串0123456789abcdef
//	delay(1000);
	
//	write_order_1602(0x01); //清屏
//	display_number_1602(1,1,4294967295,10); //在第1行第1列显示数字4294967295
//	delay(1000);
	
	display_string_1602(1,1,"  hello world!  ",16); //在第1行第1列显示  hello world!  
	
	while(1)
	{
		
	}
	
}

posted @ 2022-05-18 23:00  zhaoo_o  阅读(692)  评论(0编辑  收藏  举报