微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 自制51单片机常用头文件(LCD1602)

自制51单片机常用头文件(LCD1602)

时间:11-10 来源:互联网 点击:
/*--------------------------------------------------------------------------

LCD1602.H

The user function is C51.
Copyright (c) 1988-2004 Keil Elektronik GmbH sum zhaojun
All rights reserved.
--------------------------------------------------------------------------*/

#ifndef __LCD1602_H__
#define __LCD1602_H__

/*连接线图:
---------------------------------------------------
| LCM-----51  | LCM-----51  | LCM------51 |
| ----------------------------------------------- |
| DB0-----P0.0 | DB4-----P0.4 | RS-------P2.0 |
| DB1-----P0.1 | DB5-----P0.5 | RW-------P2.1 |
| DB2-----P0.2 | DB6-----P0.6 | E--------P2.2 |
| DB3-----P0.3 | DB7-----P0.7 | VLCD接1K电阻到GND |
---------------------------------------------------*/

/****************** LCD1602指令 ***********************************/
//输入方式设置
#define LCD_AC_AUTO_INCREMENT 0x06 // 数据读、写操作后,AC自动增一
#define LCD_AC_AUTO_DECREASE 0x04 // 数据读、写操作后,AC自动减一
#define LCD_MOVE_ENABLE 0x05 // 数据读、写操作,画面平移
#define LCD_MOVE_DISENABLE 0x04 // 数据读、写操作,画面不动
#define LCD_GO_HOME 0x02 // AC=0,光标、画面回HOME位
//设置显示、光标及闪烁开、关
#define LCD_DISPLAY_ON 0x0C // 显示开
#define LCD_DISPLAY_OFF 0x08 // 显示关
#define LCD_CURSOR_ON 0x0A // 光标显示
#define LCD_CURSOR_OFF 0x08 // 光标不显示
#define LCD_CURSOR_BLINK_ON 0x09 // 光标闪烁
#define LCD_CURSOR_BLINK_OFF 0x08 // 光标不闪烁
//光标、画面移动,不影响DDRAM
#define LCD_LEFT_MOVE 0x18 // LCD显示左移一位
#define LCD_RIGHT_MOVE 0x1C // LCD显示右移一位
#define LCD_CURSOR_LEFT_MOVE 0x10 // 光标左移一位
#define LCD_CURSOR_RIGHT_MOVE 0x14 // 光标右移一位
//工作方式设置
#define LCD_DISPLAY_DOUBLE_LINE 0x38 // 两行显示
#define LCD_DISPLAY_SINGLE_LINE 0x30 // 单行显示
#define LCD_CLEAR_SCREEN 0x01 // 清屏

/***********************LCD1602地址相关******************************/
#define LINE1_HEAD 0x80 // 第一行DDRAM起始地址
#define LINE2_HEAD 0xc0 // 第二行DDRAM起始地址
#define LINE1 0 // 第一行
#define LINE2 1 // 第二行
#define LINE_LENGTH 8 // 每行的最大字符长度

/***********************LCD1602接线引脚定义**************************/

#define LCM_RS P2_0 // 数据/命令选择信号
#define LCM_RW P2_1 // 读/写选择信号
#define LCM_E P2_2 // 使能信号
#define LCM_Data P0 // 显示数据端口
#define Busy 0x80 // 用于检测LCM状态字中的Busy标识

#define uchar unsigned char
#define uint unsigned int

//================================ LCM1602控制部分 =========================================================

/*****************************************************
函 数 名:void Delay_LCD(void)
功 能:5ms延时
说 明:LCD显示延时
入口参数:无
返 回 值:无
*****************************************************/
void Delay_LCD(void)
{
uint TempCyc = 5552; // 放入延时数据

while(TempCyc--)
{
;
}
}

/*****************************************************
函 数 名:uchar ReadStatusLCM()
功 能:读忙状态
说 明:判断LCM的工作状态;也可以不用此函数,用一段延时程序代替
入口参数:无
返 回 值:LCM_Data
*****************************************************/
//读状态
uchar ReadStatusLCM(void)
{
LCM_Data = 0xFF; // LCM数据口先置1

LCM_RS = 0;
LCM_RW = 1;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;

while (LCM_Data & Busy) // 检测忙信号.如果忙,则不执行
{
;
}

return (LCM_Data); // 不忙返回读取数据
}

/*****************************************************
函 数 名:void WriteDataLCM()
功 能:向LCM1602中写入数据
说 明:将形参WDLCM中的数据写入LCM中
入口参数:WDLCM
返 回 值:无
*****************************************************/
//写数据
void WriteDataLCM(uchar WDLCM)
{
ReadStatusLCM(); // 检测忙

LCM_Data = WDLCM; // 写入数据到LCM

LCM_RS = 1;
LCM_RW = 0;
LCM_E = 0; // 若晶振速度太高可以在这后加小的延时
LCM_E = 0; // 延时
LCM_E = 1;
}

/**************************************

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top