📄 lcd1602.c
字号:
/*************************************************************************
本文件是LCD1602的读写程序,即LCD1602的驱动程序,文件名为:lcd1602.c
编写:puke7381
日期:20081029
版本:V yf08.c.01
*************************************************************************/
#include "at89x51.h"
#include "init8051.h"
#include "intrins.h"
#include "string.h"
#include "lcd1602.h"
//#define Busy 0x80
code unsigned char lcd_initcode[] = {0x30,0x30,0x30,0x38,0x08,0x01,0x06,0x0c}; //数据总线8位,2行5X7字体,AC自动加1,开光标且闪
/*************************************************************************
名称:Lcd_writecmd
功能:写指令到1602LCD的指令寄存器中,同时对检查BF位作出要求
参数:cmd ,require
调用:Lcd_statusread
返回:无
*************************************************************************/
void Lcd_writecmd( unsigned char cmd, unsigned char require )
{
unsigned char flag_BF;
if( require )
{
do{
flag_BF = Lcd_statusread();
Delay_ms( 1 );
}while( flag_BF != 0 ); //检查是否处于空闲状态
}
Lcd_E = 0;
Lcd_RS = 0;
Lcd_RW = 0;
Lcd_DataPort = cmd;
Lcd_E = 1;
_nop_();
Lcd_E = 0;
}
/*************************************************************************
名称:Lcd_statusread
功能:读取LCD的状态字,用以判断BF位是否为0,为0则表示闲,可以对LCD进行操作
参数:无
调用:无
返回:flag_BF
*************************************************************************/
unsigned char Lcd_statusread( void )
{
unsigned char lcd_BF;
Lcd_E = 0; //读状态字操作,E=0->1,RS=0,RW=1
Lcd_RS = 0;
Lcd_RW = 1;
Lcd_DataPort = 0xff; //消除干扰,以防读出假数据
Lcd_E = 1;
lcd_BF = Lcd_DataPort & 0x80 ; //读出状态字数据,包涵BF位,与上0x80得到BF位
Lcd_E = 0;
return lcd_BF;
}
/*************************************************************************
名称:Lcd_writedata
功能:写数据到LCD的CGRAM/DDRAM中
参数:dat
调用:Lcd_statusread
返回:无
*************************************************************************/
void Lcd_writedata( unsigned char dat )
{
unsigned char flag_BF;
do{
flag_BF = Lcd_statusread();
Delay_ms( 1 );
}while( flag_BF != 0 );
Lcd_E = 0;
Lcd_RS= 0;
Lcd_RW = 0;
Lcd_DataPort = dat;
Lcd_RS = 1;
Lcd_E = 1;
_nop_();
Lcd_E = 0;
}
/*************************************************************************
名称:Lcd_dataread
功能:从LCD中的显示缓冲RAM当中读一个字节的显示数据
参数:无
调用:Lcd_statusread
返回:data_temp
*************************************************************************/
/*unsigned char Lcd_dataread( void )
{
unsigned char data_temp, flag_BF;
do{
flag_BF = Lcd_statusread() & 0x80;
Delay_ms( 1 );
}while( flag_BF != 0);
Lcd_E = 1;
Lcd_RS = 1;
Lcd_RW = 1;
data_temp = Lcd_DataPort;
Lcd_E = 0;
return data_temp;
}*/
/*************************************************************************
名称:Lcd_init
功能:初始化LCD1602模块,对显示,光标等进行设置
参数:无
调用:Lcd_writecmd
返回:无
*************************************************************************/
void Lcd_init( void )
{
unsigned char data_temp,i;
unsigned char *p;
p = ( unsigned char * )lcd_initcode; //获取初始化序列数据的首地址
for( i = 0; i < 3; i++ )
{
data_temp = *p++;
Lcd_writecmd( data_temp, 0 ); //三次显示设置,不检测BF位
Delay_ms( 5 );
}
Lcd_writecmd( *p++, 1 ); //写指令0x38,显示效果设置
Lcd_writecmd( *p++, 1 ); //写指令0x08,关显示
Lcd_writecmd( *p++, 1 ); //写指令0x01,清屏
Lcd_writecmd( *p++, 1 ); //写指令0x06,数据地址指针及光标/画面移动设置
Lcd_writecmd( *p++, 1 ); //写指令0x0c,显示及光标设置
}
/*************************************************************************
名称:Lcd_display
功能:由LCD 1602显示数据
参数:*string_p,addr(要显示的数据和显示位置)
调用:Lcd_writecmd,Lcd_writedata
返回:无
*************************************************************************/
void Lcd_display( unsigned char *string_p, unsigned char addr )
{
Lcd_writecmd( addr, 1 ); //写指令,指定显示位置
while( *string_p != 0 )
{
Lcd_writedata( *string_p ); //写显示数据
string_p++;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -