LCD1602.c文件的内容(这个一个完善的用51单片机实现1602液晶屏驱动文件带protues仿真文件):
完整的程序源码和仿真文件下载: http://www.51hei.com/f/TLC1543c51.rar
/*----File Description----
- File Name : LCD1602.h
- Functions :
- Description : None
- Author : Mason 别名:小菜
- Create Date : 2013/7/25
- Performance : Finished
- Global Variable : None
- File static Variable : None
- -------------------------------------------
- Revision History
- No. Date Revised by Item Description
-
-------------------------------------------------------------------------*/
/*----------------------------Head---------------------------------------*/
#include "LCD1602.h"
#include "delay.h"
/*----------------------------Code---------------------------------------*/
// LCD1602上电后初使化
void LCD1602_Init(void)
{
delayms(50); // 上电延时50ms.
write1602_byte(0x3c,0); // 功能设置:双行、8位数据接口、5*10点阵字符.
while(Read1602_BF()); // 读取1602的繁忙状态(Busy Flag),直至空闲。
write1602_byte(0x0c,0); // 显示开关:开;光标显示:关;闪烁控制:关;
while(Read1602_BF()); // 读取1602的繁忙状态(Busy Flag),直至空闲。
write1602_byte(0x06,0); // 操作后,AC自增,画面不动。
while(Read1602_BF()); // 读取1602的繁忙状态(Busy Flag),直至空闲。
write1602_clear();
CursorRST_1602(); // 光标复位,但DDRAM内容不变
}
/*----Function Description----
- Function Name : write1602_byte(uchar dat,bit RorS)
- Description : 发送一个字节数据
- Return Code : None
- Parameters/Arguments : dat 是一个字节数据,RorS 指定 dat 是数据还是指令
- Global Variable : None
- static Variable : None
-------------------------------------------------------------------------*/
void write1602_byte(uchar dat,bit RorS)
{
RW_1602 = 0; // 写
EN_1602 = 0;
delayus(10); // 数据建立时间,需大于1us.这里延时25us.
if(RorS) RS_1602 = 1; // dat is a data.
else RS_1602 = 0; // dat is a command.
EN_1602 = 1; // 使能脉冲需大于450ns。
DP_1602 = dat; // 整个使能周期需大于1ms。
delayus(10); // 延时25us
EN_1602 = 0;
delayms(1); // 指令执行时间,需大于40us.这里延时1ms.
}
/*----Function Description----
- Function Name : bit Read1602_BF(void)
- Description : 判断1602指令执行状态。
- Return Code : BF(busy flag),BF = 1 : busy.
- Parameters/Arguments : None
- Global Variable : None
- static Variable : None
-------------------------------------------------------------------------*/
bit Read1602_BF(void) // 读取1602的空闲状态(Busy Flag)
{
RW_1602 = 1; // 读
RS_1602 = 0;
delayus(50); // 延时100us,这里的延时需大于
DP_1602 <<= 1; // 读指令最大执行时间40us.
return CY; // 将BF位移至CY位并返回.
}
void write1602_clear(void)
{
write1602_byte(CLRLCD1602,0); // 发送清屏指令。
delayms(50); // 延时需大于15.2ms,这里延时50ms
}
void CursorRST_1602(void) // 光标复位,但DDRAM内容不变
{
write1602_byte(CURRST1602,0); // 发送清屏指令。
delayms(50); // 延时需大于15.2ms,这里延时50ms
}
/*----Function Description----
- Function Name : write1602_DDRAM_pos(uchar px,uchar py)
- Description : DDRAM 为显示数据存储器。本函数更改指向DDRAM
的指针AC。
- Return Code : None
- Parameters/Arguments : py : row . 0 : First row . 1 : Second row .
px : 从左至右分别为 0 ~ 15 .
- Global Variable : None
- static Variable : None
-------------------------------------------------------------------------*/
void write1602_DDRAM_pos(uchar px,uchar py)
{
if(py){
write1602_byte( px|0x80 + 0x40 , 0 );
}else{
write1602_byte( px|0x80 , 0 );
}
}
/*----Function Description----
- Function Name : write1602_CGRAM(uchar dat[8],uchar add)
- Description : 将一个字符(8个字节的数组)写入 CGRAM。
- Return Code : None
- Parameters/Arguments : uchar dat[8]为字符数组。
uchar add 为自定义字符的访问地址,取值应在 0~7.
- Global Variable : None
- static Variable : None
-------------------------------------------------------------------------*/
void write1602_CGRAM(uchar dat[8],uchar add)
{
uchar temp;
add %= 8; // 数据有效性处理
for(temp=0;temp<8;temp++)
{
write1602_byte( add<<3|0x40+temp , 0 ); // 写 CGRAM 地址。
write1602_byte( dat[temp] , 1 ); // 写 CGRAM 字符数据。
}
}
void draw1602_basic(void)
{
uchar temp;
for(temp=0;temp<8;temp++) // 装载8个自定义符号
write1602_CGRAM(dat1602[temp],temp);
write1602_DDRAM_pos(0,0);
write1602_byte(4,1); // 显示8个自定义符号
write1602_DDRAM_pos(15,0);
write1602_byte(5,1); // 显示8个自定义符号
write1602_DDRAM_pos(0,1);
write1602_byte(6,1); // 显示8个自定义符号
write1602_DDRAM_pos(15,1);
write1602_byte(7,1); // 显示8个自定义符号
write1602_DDRAM_pos(5,0);
write1602_byte('m',1);
write1602_byte('a',1);
write1602_byte('s',1);
write1602_byte('o',1);
write1602_byte('n',1);
write1602_DDRAM_pos(2,1);
write1602_byte('v',1);
write1602_byte('o',1);
write1602_byte('l',1);
write1602_byte('t',1);
write1602_byte(':',1);
}
LCD1602.h头文件的内容(这个一个完善的1602液晶屏驱动文件带protues仿真文件):
/*----Head Description----
- File Name : LCD1602.h
- Author : Mason 别名:小菜
- Create Date : 2013/7/25
- -------------------------------------------
- Revision History
- No. Date Revised by Item Description
-
-------------------------------------------------------------------------*/
/*----------------------------Head---------------------------------------*/
#include <reg52.h>
#include "MICRO.h"
#ifndef _LCD1602_H_
#define _LCD1602_H_
/*----------------------------Interface----------------------------------*/
sbit RS_1602 = P0^5; // 1:数据;0:指令。
sbit RW_1602 = P0^6; // 1:读; 0:写。
sbit EN_1602 = P0^7; // 高电平使能
#define DP_1602 P2 // 数据/指令接口
/*----------------------------Micro--------------------------------------*/
// 指令设置(若不另加说明):需令RS1602 = 0;RW1602 = 0 ;
// 清屏
// DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
// 0 0 0 0 0 0 0 1
#define CLRLCD1602 0x01 // Clear LCD1602. 清屏
// 光标复位
// DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
// 0 0 0 0 0 0 1 *
#define CURRST1602 0x02 // Cursor restoration. 光标复位
// 输入方式设置 // I : Increase, D : Decrease. AC : address counter. 地址寄存器。
// DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
// 0 0 0 0 0 1 I/D S
#define MODEIN1602 0x06 // AC Increase,Not Shift. 操作后,AC自增,画面不动。
#define MODEDN1602 0x04 // AC Decrease,Not Shift. 操作后,AC自减,画面不动。
#define MODEIS1602 0x07 // AC Increase,Shift. 操作后,AC自增,画面平移。
#define MODEDS1602 0x05 // AC Decrease,Shift. 操作后,AC自减,画面平移。
// 显示开关控制 Display Setup
// DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
// 0 0 0 0 1 D C B
// D: Display Switch. 显示开关。
// C: Cursor Switch. 光标开关。置位时显示光标。
// B: Blink Switch. 闪烁控制。置位时光标闪烁。
// 将下列相应功能宏相或后赋值操作。
#define DISSET1602 0x08
#define SETDIS1602 0x04
#define SETCUR1602 0x02
#define SETBLI1602 0x01
// 光标/画面位移(不改变DDRAM内容)
// DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
// 0 0 0 1 S/C R/L * *
// S/C: Screen or Cursor.
// R/L: Right or left.
// 功能设置
// 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*7点阵字符。
// 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:Busy Flag.)
// 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
// 0 1 BF A6 A5 A4 A3 A2 A1 A0
/*------------------------------Code Variable----------------------------*/
extern uchar code dat1602[][8]; // 自定义字符
/*----------------------------Function Declaration-----------------------*/
bit Read1602_BF(void); // 读取1602的空闲状态(Busy Flag)
void LCD1602_Init(void); // LCD1602上电初使化
void CursorRST_1602(void); // 光标复位,但DDRAM内容不变
void write1602_clear(void); // 清屏
void write1602_byte(uchar dat,bit RorS); // 写一字节数据/指令.
void write1602_DDRAM_pos(uchar px,uchar py);// 写指向DDRAM的地址指针
void write1602_CGRAM(uchar dat[8],uchar add);// 将一个5*8自定义字符写入CGRAM中
void draw1602_basic(void);
#endif