超强的51+LCD1602控制四位八位控制1602函数全集+写入字库Word格式.docx
《超强的51+LCD1602控制四位八位控制1602函数全集+写入字库Word格式.docx》由会员分享,可在线阅读,更多相关《超强的51+LCD1602控制四位八位控制1602函数全集+写入字库Word格式.docx(16页珍藏版)》请在冰豆网上搜索。
![超强的51+LCD1602控制四位八位控制1602函数全集+写入字库Word格式.docx](https://file1.bdocx.com/fileroot1/2022-12/15/381a4d27-8cdc-4be2-9283-02f07a104b7b/381a4d27-8cdc-4be2-9283-02f07a104b7b1.gif)
(unsignedcharcmd);
//写入指令
voidLCD_dat
(unsignedchardat);
//写入数据
voidLCD_pos
(unsignedcharx,unsignedchary);
//显示定位
voidLCD_printc(unsignedcharx,unsignedchary,unsignedcharc);
//定位输出字符
voidLCD_prints(unsignedcharx,unsignedchary,unsignedchar*s);
//定位输出字符串
voidLCD_printn(unsignedcharx,unsignedchary,unsignedintnum);
//定位输出16位二进制数字
unsignedcharLCD_current_addr(void);
//读出AC当前地址(DB6~DB0)或忙标志位DB7
unsignedcharLCD_current_addr_dat(void);
//读出AC当前地址的数据
unsignedcharLCD_addr_dat(unsignedcharx,unsignedchary);
//读出AC指定地址的数据
voidLCD_pos_CG(unsignedcharx,unsignedchar*CGRAM_dat);
//指定地址(x:
0-7)写入8bytes数据CGRAM
/*-------------------------------------------------------------*/
//光标、画面移动,不影响DDRAM
#defineLCD_LEFT_MOVE
LCD_cmd(0x18);
//LCD显示左移一位
#defineLCD_RIGHT_MOVE
LCD_cmd(0x1c);
//LCD显示右移一位
#defineLCD_CURSOR_LEFT_MOVE
LCD_cmd(0x10);
//光标左移一位
#defineLCD_CURSOR_RIGHT_MOVE
LCD_cmd(0x14);
//光标右移一位
/*--------------------------------------------------------------*/
//设置显示、光标及闪烁开、关
#defineLCD_DISPLAY_ON
LCD_cmd(0x0c);
//LCD开显示
#defineLCD_DISPLAY_OFF
LCD_cmd(0x08);
//LCD关显示
#defineLCD_CURSOR_ON
LCD_cmd(0x0e);
//光标显示
#defineLCD_CURSOR_OFF
//光标不显示
#defineLCD_CURSOR_BLINK_ON
LCD_cmd(0x0f);
//光标闪烁
#defineLCD_CURSOR_BLINK_OFF
//光标不闪烁
#defineLCD_GO_HOME
LCD_cmd(0x02);
//AC=0,光标、画面回HOME位,DDRAM内容不变
#defineLCD_CLR
LCD_cmd(0x01);
//LCD清屏,清除DDRAM,清除屏幕,置AC为0,光标回位?
//工作方式设置
#defineLCD_DISPLAY8_DOUBLE_LINE
LCD_cmd(0x38);
//两行显示8-bits
#defineLCD_DISPLAY8_SINGLE_LINE
LCD_cmd(0x30);
//单行显示8-bits
#defineLCD_DISPLAY4_DOUBLE_LINE
LCD_cmd(0x28);
//两行显示4-bits
#defineLCD_DISPLAY4_SINGLE_LINE
LCD_cmd(0x20);
//单行显示4-bits
//输入方式设置
#defineLCD_AC_AUTO_INCREMENT
LCD_cmd(0x06);
//数据读、写操作后,AC自动加1
#defineLCD_AC_AUTO_DECREASE
LCD_cmd(0x04);
//数据读、写操作后,AC自动减1
#defineLCD_MOVE_ENABLE
LCD_cmd(0x07);
//数据读、写操作,画面平移
#defineLCD_MOVE_DISENABLE
//数据读、写操作,画面不动
以下是液晶驱动头文件:
//File:
LCD1602_8A.H
//Time:
20:
10
//Modi:
09-5-17
//防止被重复定义
#ifndef__LCD1602_8A_H__
#define__LCD1602_8A_H__
#defineInt_Transfer
//=1,
允许中断服务函数调用
//=0,不允许中断服务函数调用
//LCD1602与单片机接口定义
sfr
LCD_IO=0x80;
//P0-0x80,P1-0x90,P2-0xA0,P3-0xB0;
sbit
LCD_RS=P2^0;
//LCD数据/命令选择端(H/L)
LCD_RW=P2^1;
//LCD
读/写
选择端(H/L)
LCD_EN=P2^2;
//LCD使能控制端
//LCD1602地址相关
/*
#defineLINE1_HEAD
0x80
//第一行DDRAM起始地址
#defineLINE2_HEAD
0xc0
//第二行DDRAM起始地址
#defineLINE1
0
//第一行
#defineLINE2
//第二行
#defineLINE_LENGTH
16
//每行的最大字符长度(40-DDRAM)
#ifPort_Type_Select
//选择八位数据模式
unsignedcharLCD_current_addr(void)
{
unsignedcharac_addr;
LCD_EN=0;
LCD_RS=0;
//指令
LCD_RW=1;
//读出
LCD_IO=0xff;
//端口置为输入方式(P0)
LCD_EN=1;
ac_addr=LCD_IO;
return(ac_addr);
}
#else
//选择四位数据模式
LCD_IO|=0xf0;
ac_addr=LCD_IO&
0xf0;
//高四位
ac_addr|=LCD_IO>
>
4;
//低四位
#endif
//检测LCD忙状态
#ifInt_Transfer
//允许中断服务函数调用
voidLCD_busy(void)
unsignedcharac_dat;
unsignedcharbusy_flag;
do
ac_dat=LCD_current_addr();
busy_flag=ac_dat&
0x80;
}while(busy_flag);
//=1表示忙,=0表示空闲
//不允许中断服务函数调用
bitbusy_flag;
busy_flag=(bit)(ac_dat&
0x80);
unsignedcharLCD_current_addr_dat(void)
unsignedcharaddr_dat;
//
unsignedchari;
LCD_busy();
//或者检查忙最可靠
for(i=0;
i<
3;
i++)
//要连续读出三次才会有效
LCD_RS=1;
//数据
addr_dat=LCD_IO;
return(addr_dat);
addr_dat=LCD_IO&
addr_dat|=LCD_IO>
voidLCD_cmd(unsignedcharcmd)
//检测忙
LCD_RW=0;
//写入
LCD_IO=cmd;
//传指令
//下降沿有效
LCD_IO&
=0x0f;
//清高四位
LCD_IO|=cmd&
//写高四位
cmd<
<
=4;
//低四位移到高四位
voidLCD_dat(unsignedchardat)
LCD_IO=dat;
//传数据
LCD_IO|=dat&
dat<
//显示定位DDRAM
voidLCD_pos(unsignedcharx,unsignedchary)
if(y)
LCD_cmd(x|0xc0);
//y=1第二行显示,y=0第一行显示
0<
=x<
16(40-DD