3_1602液晶屏使用文档
文件网盘链接:https://pan.baidu.com/s/158e_RyHuAqLyWNqZZhgi2A?pwd=1111 提取码:1111
1、1602液晶屏工作原理
本次使用的是长沙太阳人电子有限公司的1602液晶屏(规格书在网盘链接中),其他厂家的1602液晶屏使用方法同理,只要根据具体厂家规格书中的指令和时序图操作即可。
1602液晶屏的命名含义是液晶屏每行可显示16个字符,有2行。引脚如下图所示,引脚说明如下表所示。
1602液晶屏内部含有80字节RAM,有1个地址指针和数据指针,两行屏幕字符位置地址如下图所示。
1602液晶屏操作分为读/写操作,读操作分为读状态字和读数据,写操作分为写指令和写数据。操作时序如下表所示。
1602液晶屏读/写时序图如下图所示。
1602液晶屏状态字可用于判忙(当1602液晶屏处于繁忙状态时,用户不要向1602液晶屏进行读/写操作,否则会出错),1602液晶屏的状态字有8位STA7-STA0(高位到低位),STA7为1时禁止向1602液晶屏进行读/写操作(STA7为0时允许),STA6-STA0是当前数据地址指针的值。1602的指令类型可分为六种,如下表所示。
长沙太阳人电子公司的1602液晶屏规格书的初始化过程如下表所示。
2、外围电路原理图
3、仿真工程及代码
3.1 仿真工程
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)
{
}
}