📄 lcd1602.c
字号:
/***************************************/
/* CopyRight 2005 LiuYong *
/****************************************
文件名称:LCD1602.C
文件版本:V1.0
创建人员:LiuYong cau_ly@163.com
创建日期:2005.5.30
功能描述:完成LCD的显示
相关硬件:at89s52兼容单片机,晶体11.0592M,LCD为1602
修改记录:
***************************************/
#include <regx52.H>
#include <intrins.h>
#include "delay.h"
#define uchar unsigned char
#define LCDDB P0 //LCD数据总线
//LCD EN
sbit LCDE =P1^4;
//LCD WR
sbit LCDWR =P3^6;
//LCD RD
sbit LCDRS =P3^7;
//busy flag
sbit LCDBUSY =P0^7;
/*************************************************
* 函数名称:void LcdCheckBusy(void)
* 创建日期:2005.6.3
* 功能描述:确保LCD为不忙的状态
* 入口参数:无
* 返回值: 无
* 修改日志:
*************************************************/
void LcdCheckBusy(void)
{
LCDDB=0XFF;//必须
LCDRS=0;
LCDWR=1;
LCDE=1;
_nop_();
while(LCDBUSY)
{
_nop_();
}
LCDE=0;
}
/*************************************************
* 函数名称:void LcdWtInstruct(uchar ucInstruct)
* 创建日期:2005.6.3
* 功能描述:写指令码到IR寄存器
* 入口参数: ucInstruct:指令码,是否检查忙的标志,若为1检查,为0不检查
* 返回值: 无
* 修改日志:
*************************************************/
void LcdWtInstruct(uchar ucInstruct,bit bIfChkBsy)
{
if(bIfChkBsy)
{
LcdCheckBusy(); //检查LCD是否忙
}
LCDE=0;
LCDRS=0;
LCDWR=0;
_nop_(); //liuyong add 6.13
LCDE=1;
LCDDB=ucInstruct;
//LCDE=1;
_nop_(); //liuyong add 6.13
_nop_(); //liuyong add 6.13
LCDE=0;
}
/*************************************************
* 函数名称:void LcdWtData(uchar ucLcdData)
* 创建日期:2005.6.3
* 功能描述:向LCD写数据
* 入口参数:ucLcdData:写入的数据
* 返回值: 无
* 修改日志:
*************************************************/
void LcdWtData(uchar ucLcdData)
{
LcdCheckBusy(); //检查LCD是否忙
LCDE=0;
LCDRS=1;
LCDWR=0;
LCDE=1;
LCDDB=ucLcdData;
LCDE=0;
LCDRS=0; //liuyong 0612
LCDWR=1;//liuyong 0612
}
/*************************************************
* 函数名称:void LcdInit(void)
* 创建日期:2005.6.3
* 功能描述:初始化LCD的一些配置
* 入口参数:无
* 返回值: 无
* 修改日志:2005.6.24.LcdWtInstruct(0x3c,1);由原来的38改为3c,增加某些字符的显示
*************************************************/
void LcdInit(void)
{
/********************************************************
6号指令:功能设置命令,0B 0B 1B DLB NB FB *B *B ,
DL:高电平时为4位总线,低电平时为8位总线
N:低电平时为单行显示,高电平时双行显示
F: 低电平时显示5x7的点阵字符,高电平时显示
5x10的点阵字符 指令
***********************************************************/
//LcdWtInstruct(0x38,1); //设置16*12显示,5*7点阵,8位数据接口
LcdWtInstruct(0x3c,1); //设置16*12显示,5*10点阵,8位数据接口
//关显示
LcdWtInstruct(0x08,1);
//指令1:清显示,指令码01H,光标复位到地址00H位置
LcdWtInstruct(0x01,1);
/********************************************************
3号指令:光标和显示模式设置,0B 0B 0B 0B 0B 1B I/DB SB ,
I/D:光标移动方向,高电平右移,低电平左移
S:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效
***********************************************************/
LcdWtInstruct(0x06,1); //屏幕上的光标和文字右移
/********************************************************
4号指令:显示开关控制,0B 0B 0B 0B 1B DB CB BB ,
D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示
C:控制光标的开与关,高电平表示有光标,低电平表示无光标
B:控制光标是否闪烁,高电平闪烁,低电平不闪烁
***********************************************************/
LcdWtInstruct(0x0c,1); //开显示、不显示光标,光标不闪烁
}
/*************************************************
* 函数名称:void LcdDisplay(uchar *pDis,uchar ucLine)
* 创建日期:2005.6.3
* 功能描述:显示字符串
* 入口参数: *pDis:要显示的字符串,x:x坐标,取值范围是0到15;y: y坐标取0或1
ucAdr:字符串显示所在的地址ucNo:写入字符的个数,
共32个字符,第一行16个,第二行16个
* 返回值: 无
* 修改日志:
*************************************************/
void LcdDisplay(uchar *pDis,uchar x,uchar y,uchar ucNo)
{
uchar i=0;
uchar ucAdr;
if(y)
{
ucAdr=0xc0;
}
else
{
ucAdr=0x80;
}
LcdWtInstruct(ucAdr+x,1); //写入显示的数据地址指针
for(i=0;i<ucNo;i++)
{
LcdWtData(*(pDis+i));
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -