51单片机lcd1602全过程C语言编程显示大全
- 格式:pdf
- 大小:1.75 MB
- 文档页数:68
LCD1602程序代码及显示流程图LCD1602显示程序代码DB P0//--P0=DB0~DB7位LCD_RS=P2;//--P2.0=RS位LCD UrW=P2;//--P2.1=RW位LCD_Ue=P2;//-P2.2=E//--/--/----定义函数ා define uchar unsigned charා define uint unsigned int///—定义子例程函数void LCD_Uiinit(void);//-初始化LCD1602函数void LCD_2;write_uchar命令(uchar命令);//-写入命令功能无效LCD到LCD1602_Char数据(uchar DAT);//-将无效的LCD数据写入LCD1602_Uxset_XY(uchar x,uchar y);//设置LCD1602 void LCD_uchar(uchar x,uchar y,uchar DAT)的显示位置x(0-16),y(1-2);//-在LCD1602中,显示包含无效字符的LCD;uchar x,uchar y,uchar*s);在LCD1602上显示一个字符串//void LCD_ucheck_uBusy(void);//检查Busy函数。
我没有使用这个功能,因为通过率很低。
LCD_u2;delay_10us(uint n);//-10微秒延迟子程序void LCD_udelay_50uS(uint n);/-延迟子程序50微秒初始化(无效){LCD_udelay_10us(20);LCD_uwrite_10us(0x38);//-设置8位格式,2行,5x7 LCD_2;delay_10us(5);LCD_uwrite_u命令(0x0c);//-整体显示,关闭光标,不闪烁LCD 不闪烁LCD_延时延时10us(5);LCD_写写写命令(0x06);///-设置输入模式,增量增量不移位LCD_延时延时10us 10us(5);LCD_写写写命令(0x01);///-清除LCD_延时延时50uS在屏幕上的显示屏(40);}//将无效的LCD命令写入lcd602_写写写的命令(uchar dat){LCD_u写写写的命令(uchar dat){LCD_延迟延迟_10us(5;5);LCD液晶显示无Rs=0;//命令LCD液晶显示u 10us(5);LCD_Rs=0;//命令LCD_LCD_ _在LCD_Udb=dat;LCD_uDelay_10us(5);LCD_ue=1;//允许LCD_delay_10us(5);LCD_ue=0;}/-将无效的LCD写入LCD1602_写数据(uchar dat){LCD_u延时_10us(5);LCD_urs=1;//数据液晶显示液晶显示u RW=0;//数据液晶显示显示uu RW=0;//向LCD写入液晶显示的DB=dat;LCD_延迟延时10us 10us(5;5);LCD_E=E=1;//将无效的LCD写入LCD_延迟_延迟_(u (5);LCD液晶显示LCD_u延迟10us(5);LCD_E=0;}/-设置显示位置无效LCD_uxy(uchar (x,uchary y){uchar地址;如果(y==1){address=0x80+x;/-第一行位置}其他{地址=0xc0+x;///第二行位置}液晶显示器延时延时延时10us(5);LCD液晶显示写写命令(地址);}/-显示字符功能功能voidlcd xdisp char(ucharx,uchary y,uchardat的uchar dat)//--液晶显示器显示器的disp char(0,1,0x38 0x38);//-显示8{LCD显示液晶显示器xxxxx0,1,0x38);//-显示8{LCD[液晶显示设设设设设设设设设设设设设设设设设(x,y);液晶显示器延迟_10us(5);LCD_write_u2;Data(DAT);}/-显示字符串函数void LCD_uP_u3;string (uchar x,uchar y,uchar*s){LCD_uxset_xy(x,y);LCD_uuDelay_10us(5);while(*s!='\0'){LCD_2;write_uData(*s);s++;}//∠s++;}/∠s++/>check_Busy()///实践证明,在我的LCD1602上,check Busy命令的通过率很低,LCD正常使用。
//液晶显示温度#include "AT89X52.H"#define Ddata P0sbit RS=P2^7; //命令数据控制端sbit RW=P2^6; //读写选择端sbit LCDE=P2^5; //液晶使能端sbit DQ=P2^0; //ds18b20与单片机连接口#define uchar unsigned char#define uint unsigned intunsigned char hour=0,min=0,sec=0; //定义初值unsigned int count=0;unsigned char line1[16]={" temp: "}; //16个字符unsigned char line2[16]={" time: 00:00:00"}; //16个字符unsigned char tab[]={'0','1','2','3','4','5','6','7','8','9'}; //数组uchar data disdata[5];uint tvalue; //温度值uchar tflag; //温度正负标志void time();/*************************lcd1602程序**************************/ void delay1ms(unsigned int ms)//延时1毫秒(不够精确的){unsigned int i,j;for(i=0;i<ms;i++)for(j=0;j<110;j++);}void delay5ms()//延时5毫秒(不够精确的){unsigned int i;for (i=0;i<1000;i++);}void delay50us(){register int i;for (i=0;i<20;i++);}void delay(){unsigned char m,n;for(m=255;m>0;m--)for(n=255;n>0;n--);}void wr_com(unsigned char comm) //********写控制字符程序E=1 RS=0RW=0 **********//{LCDE=0; //使能端RS=0; //********RS寄存器选择输入端,当RS=0;当进行写模块操作,指向指令寄存器。
/****************************************************************************** *** 描述: LCD1602 滚动显示** 显示方式:* * 1、从左到右逐字显示,闪动二次,清屏。
* * 2、再从右到左逐字显示,闪动二次,清屏。
* * 3、周期性地重复上述显示方式。
* ******************************************************************************* */#include <reg51.h>#include <intrins.h>typedef unsigned char BYTE;typedef bit BOOL;sbit LCD_RS = P2^6;sbit LCD_RW = P2^5;sbit LCD_EP = P2^7;BYTE code dis1[] = {" WELCOME TO "};BYTE code dis2[] = {" "};BYTE code dis3[] = {" OT EMOCLEW "};BYTE code dis4[] = {" MOC.NIHCERP.WWW "};delay(int ms){ // 延时子程序int i;while(ms--){for(i = 0; i< 250; i++){_nop_();_nop_();_nop_();_nop_();}}}BOOL lcd_bz(){ // 测试LCD忙碌状态BOOL result;LCD_RS = 0;LCD_RW = 1;LCD_EP = 1;_nop_();_nop_();_nop_();_nop_();result = (BOOL)(P0 & 0x80);LCD_EP = 0;return result;}lcd_wcmd(BYTE cmd){ // 写入指令数据到LCD while(lcd_bz());LCD_RS = 0;LCD_RW = 0;LCD_EP = 0;_nop_();_nop_();P0 = cmd;_nop_();_nop_();_nop_();_nop_();LCD_EP = 1;_nop_();_nop_();_nop_();_nop_();LCD_EP = 0;}lcd_pos(BYTE pos){ //设定显示位置lcd_wcmd(pos | 0x80);}lcd_wdat(BYTE dat){ //写入字符显示数据到LCD while(lcd_bz());LCD_RS = 1;LCD_RW = 0;LCD_EP = 0;P0 = dat;_nop_();_nop_();_nop_();_nop_();LCD_EP = 1;_nop_();_nop_();_nop_();_nop_();LCD_EP = 0;}lcd_init(){ //LCD初始化设定lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据delay(1);lcd_wcmd(0x0c); //显示开,关光标delay(1);lcd_wcmd(0x06); //移动光标delay(1);lcd_wcmd(0x01); //清除LCD的显示内容delay(1);}main(){BYTE i;lcd_init(); // 初始化LCDdelay(10);while(1){lcd_wcmd(0x06); //向右移动光标lcd_pos(0); //设置显示位置为第一行的第1个字符i = 0;while(dis1[ i ] != '\0'){ //显示字符"WLCOME TO"lcd_wdat(dis1[ i ]);i++;delay(30); //控制两字之间显示速度}lcd_pos(0x40); //设置显示位置为第二行第1个字符i = 0;while(dis2[ i ] != '\0'){lcd_wdat(dis2[ i ]); //显示字符" "i++;delay(30); //控制两字之间显示速度}delay(800); //控制停留时间lcd_wcmd(0x01); //清除LCD的显示内容delay(1);lcd_wcmd(0x04); //向左移动光标lcd_pos(15); //设置显示位置为第一行的第16个字符i = 0;while(dis3[ i ] != '\0'){ //显示字符"WLCOME TO"lcd_wdat(dis3[ i ]);i++;delay(30); //控制两字之间显示速度}lcd_pos(0x4F); //设置显示位置为第二行的第16个字符i = 0;while(dis4[ i ] != '\0'){lcd_wdat(dis4[ i ]); //显示字符" "i++;delay(30); //控制两字之间显示速度}delay(800); //控制停留时间lcd_wcmd(0x01); //清除LCD的显示内容delay(200); //控制两屏转换时间}}。
1602汇编程序,刃单片机汇编程序,仅需修改引脚定义即可。
晶振大小12M,程序测试完全正确。
内部包含写数据、写命令(包括读忙和不读忙、初始化等子函数。
调用时先给LCD_DAT赋值,给出需要写入的数据或命令,然后调用。
;端口引脚定义区LCD_RS BIT P2.4 ;1602数据命令选择端口LCD_RW BIT P2.5 ;1602 读写选择端口LCD_EN BIT P2.6 ;1602 使能端口LCD_DATA EQU P0 ;1602 数据端口;变量声明区ALL_FLAG EQU 20H ;标志位LCD_FLAG EQU AL「FLAG.7 ;1602 读忙标志位LCD_DAT EQU 30H ;1602 数据命令字DELAYED EQU 31H 涎时字广★★★****★★★★★★★*★*★★**★*★★★*★*★★★★★*★*★*★1602读命令函数,高位存至LCD_LAG中★★★★★★★★★★★★★★★★★★★★★if******************* /LCD_R_DATA:MOV LCD_DATA,#OFFHSETB L CD RWNOPSETB L CD_ENNOPMOV Acc丄CD_DATAMOV C,Acc.7MOV LCD_FLAG,CCLR LCD_ENNOPJB LCD_FLAG ,L CD_BUSYRET/★****★***★*★***********************★*★*★*1602写数据函数,数据存在LCD_DAT★ if*************************************** /LCD_W_DATA:LCALLLCD_R_DATASETB L CD_RSNOPMOV LCD_DATA丄CD_DATSETB L CD_ENNOPCLR LCD_ENRET/* 1602LCD_DAT,检测忙信号LCD_W_CMD:LCALLLCD_R_DATACLR LCD_RSCLR LCD_RWNOPMOV LCD_DATA, LCD_DAT SETB L CD_ENNOPCLR LCD_ENRET /* 1602 与命令函数,命令存在LCD_DAT,不检测忙信号LCD CMD: 才***********才********************才才*****7写命令函数,命令存F在CLR LCD RWNOPMOV LCD_DATA, LCD_DAT SETB L CD_ENNOPCLR LCD_ENRET/***************************************** 4 QCC初始化函数★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/ LCD INIT:MOV DELAYED,#30LCALL DELAY_MSMOV LCD_DAT,#38HLCALL LCD_CMDMOV DELAYED,#10LCALL DELAY_MSMOV LCD_DAT,#38HLCALL LCD_CMDMOV DELAYED,#10LCALL DELAY_MSMOV LCD_DAT,#38HLCALL LCD CMDMOV DELAYED,#®LCALL DELAY_MSMOV LCD_DAT,#038HLCALL LCD_W_CMDMOV LCD_DAT,#08HLCALL LCD_W_CMDMOV LCD_DAT,#01HLCALL LCD_W_CMDMOV LCD_DAT,#06HLCALL LCD_W_CMDMOV LCD_DAT,#OCHLCALL LCD_W_CMDRET****************************************延时函数,延时时间为DELAYEDP.5毫秒0-100毫秒的延时***************************************** /DELAY_MS:MOV R7QELAYEDD1: MOV R6,#0F8HD2: DJNZ R6,D2DJNZ R7,D1RET广****************************************延时函数,延时时间为DELAYED*2微秒0-500微秒的延时***************************************** /DELAY_US:MOV R乙ADU1:DJNZ R7,DU1RET。
LCD1602之msp430单片机和C51单片机C语言/**************************************************************************/1.msp430单片机C语言/*************************************************************************/#include"msp430f6638.h"/*******************************************P5.3----E P57 P56 P55 P54 P53 P52 P51 P50P5.4----RSP5.5----RW P57 P56 RW RS E P52 P51 P50P2OUT---wdata********************************************/#define uchar unsigned char;#define uint unsigned int;//*********显示字符串可将字符串放入数组,例如显示ancd efdg******//**定义一个数组**//**uchar code ttt[]="ancd efdg";//字符串用双引号引起来,空格计入字符串的元素/*uchar code kkk[]="ffba ggddmm";//上句加空格9个元素,该句加两个空格12个元素/**********************************元素个数在循环显示时要使用*****/*********************为循环显示字符串还得定义一个变量**/// uchar n;/定义变量nvoid delay(int time) //延迟函数{while(time--); //延迟时间}void writeCommandLcd(unsigned char comd)// 写入命令{P5OUT &= ~0x10; //RS清0 (运算后P5=xxx0 xxxx,即RS=0其他位状态不变) P5OUT &= ~0x20; //RW清0 (运算后P5=xx0x xxxx, 即RW=0其他位状态不变) P5OUT &= ~0x08; //使能E清0 (运算后P5=xxxx 0xxx, 即E=0其他位状态不变)//上面三个语句执行完后P5OUT=xx000xxx,用P5OUT&=~0x38;可一次完成。
LCD显示电路#include<reg51.h>sbit RS=P3^7; //寄存器选择位,将RS位定义为P2.0引脚sbit RW=P3^6; //读写选择位,将RW位定义为P2.1引脚sbit E=P2^7; //使能信号位,将E位定义为P2.2引脚sbit BF=P0^7; //忙碌标志位,将BF位定义为P0.7引脚#define Lcd_Data P0#include <string.h>#include<intrins.h> //包含_nop_()函数定义的头文件unsigned char code string1[ ]={0x77,0x75,0x20,0x79,0x61,0x6E,0x67,0x20,0x79,0x61,0x6E,0x67,0x20,0x20,0x20,0x20}; //第一行显示的字符void Lcd_delay1ms() // 函数功能:延时1ms//注:不同单片机不同晶振需要对此函数进行修改{ unsigned char i,j;for(i=0;i<90;i++)for(j=0;j<33;j++);}void Lcd_delay(unsigned int n) // 函数功能:延时若干毫秒,入口参数:n{ unsigned int i;for(i=0;i<n;i++)Lcd_delay1ms();}/*****************************************************函数功能:判断液晶模块的忙碌状态返回值:result。
result=1,忙碌;result=0,不忙***************************************************/bit Lcd_BusyTest(void)bit result;RS=0; //根据规定,RS为低电平,RW为高电平时,可以读状态RW=1;E=1; //E=1,才允许读写_nop_(); //空操作_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间result=BF; //将忙碌标志电平赋给resultE=0;return result;}/*****************************************************函数功能:将模式设置指令或显示地址写入液晶模块入口参数:dictate***************************************************/void Lcd_WriteCom (unsigned char dictate){ while(Lcd_BusyTest()==1); //如果忙就等待RS=0; //根据规定,RS和R/W同时为低电平时,可以写入指令RW=0;E=0; //E置低电平(写指令时就是让E从0到1发生正跳变,所以应先置ぜ? _nop_();_nop_(); //空操作两个机器周期,给硬件反应时间Lcd_Data=dictate; //将数据送入P0口,即写入指令或地址_nop_();_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间E=1; //E置高电平_nop_();_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令}/*****************************************************函数功能:指定字符显示的实际地址x入口参数:注:此函数已经加上了0x80,故只需写上实际地址就行***************************************************/void Lcd_WriteAddress(unsigned char x){ Lcd_WriteCom(x|0x80); //显示位置的确定方法规定为80H+地址码x/*****************************************************函数功能:将数据(字符的标准ASCII码)写入液晶模块入口参数:y(为字符常量)***************************************************/void Lcd_WriteData(unsigned char y){while(Lcd_BusyTest()==1);RS=1; //RS为高电平,RW为低电平时,可以写入数据RW=0;E=0; //E置低电平(写指令时就是让E从0到1发生正跳变所以应先置ぜ?Lcd_Data=y; //将数据送入P0口,即将数据写入液晶模块_nop_();_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间E=1; //E置高电平_nop_();_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令}/*****************************************************函数功能:对LCD的显示模式进行初始化设置***************************************************/void Lcd_Int(void){Lcd_delay(15); //延时15ms,首次写指令时应给LCD一段较长的反应时间Lcd_WriteCom(0x38); //显示模式设置:16×2显示,5×7点阵,8位数据接口Lcd_delay(5); //延时5msLcd_WriteCom(0x38); //9次写设置模式Lcd_delay(5);Lcd_WriteCom(0x38); //9次写设置模式Lcd_delay(5);Lcd_WriteCom(0x38); //9次写设置模式Lcd_delay(5);Lcd_WriteCom(0x38); //9次写设置模式Lcd_delay(5);设置模式次写9// Lcd_WriteCom(0x38);Lcd_delay(5);Lcd_WriteCom(0x38); //9次写设置模式Lcd_delay(5);Lcd_WriteCom(0x38); //9次写设置模式Lcd_delay(5);Lcd_WriteCom(0x38); //9次写设置模式Lcd_delay(5);Lcd_WriteCom(0x38); //9次写设置模式Lcd_delay(5);Lcd_WriteCom(0x38); //9次写设置模式Lcd_delay(5);Lcd_WriteCom(0x38); //9次写设置模式Lcd_delay(5);Lcd_WriteCom(0x0C); //显示模式设置:显示开,有光标,光标闪烁Lcd_delay(5);Lcd_WriteCom(0x06); //显示模式设置:光标右移,字符不移Lcd_delay(5);Lcd_WriteCom(0x01); //清屏幕指令,将以前的显示内容清零Lcd_delay(5); }void hanying_show(void){unsigned char Lcd_i;Lcd_WriteCom(0x01);//清显示:清屏幕指令Lcd_delay(2);Lcd_WriteAddress(0x00); // 设置显示位置为最左侧Lcd_delay(2);Lcd_i=0;while(string1[Lcd_i]!='\0') //'\0'是数组结束标志需先将字符存入{Lcd_WriteData(string1[Lcd_i]); // 显示字符Lcd_i++;Lcd_delay(4);}}void main(){Lcd_Int(); //1602初始化while(1){hanying_show();}}。
1、关于1602液晶的电气参数一般市场上的1602液晶使用的驱动器为HD44780U或HD44780S,市场上大部分液晶用的是后者。
HD44780S的供电电压为5V±10%,而HD44780U 的供电电压为2.7V~5.5V。
也就是说,绝大部分1602液晶只能工作在5V 电压下,其供电电压必须为5V。
经过试验发现,1602液晶的供电虽然必须为5V,但其控制总线和数据总线可以用3.3V电平(因为对于TTL电平,一般大于2.5V以上都算高电平,不过最可靠的是大于3.6V),只不过在3.3V 电平下,数据的通信速度会大大降低,这一点需要在写驱动时注意。
需要时,可以将MCU的IO配置为漏极开路方式,用上拉电阻拉到5V电平;实在不能配置为漏极开路方式时,请查阅MCU的电气参数,在允许的条件下,直接使用电阻弱上拉也可以。
2、硬件连接1602液晶可以使用4位或8位通信模式,通信可以是双向的或单向的,双向通信主要是为了读取LCD忙标志和AC地址寄存器和DDRAM和CGRAM中的值,一般用处不大,因为1602不支持点阵绘图功能。
在连接时,注意4位通信方式下,LCD只使用DB7~DB4,一般情况下会使用MCU 某端口的高4位或低4位与之连接,注意写驱动时在必要的情况下对端口的其它几位要保护,防止破坏其数据;当然如果没有使用其它4位时则不必要保护(奇怪,不使用其它4位干嘛用4位通信方式嘛?)。
还要注意的是,如果需要双向通信,则必须选择既能做输入又能做输出的IO口,特别是对于RS、RW和E这三条控制线,若能选择支持位寻址的IO口则可以方便编程。
3、底层驱动问题通用1602液晶的时序如图:(1)、写时序(2)、读时序总的说来,按照这个时序图来编写驱动程序是不会出什么问题的,只是要深刻理解时序图中各参数的涵义。
编程中要特别关注E这根控制线。
写操作的时序应该是:①、RS=0(写指令寄存器)或RS=1(写数据寄存器);②、RW=0(写操作);③、将数据写到数据线上;④、E=1;⑤、E=0 。
基于51单⽚机控制LCD1602液晶屏显⽰LCD1602⼀共有16个接⼝,其中RS,RW,EN,D0,D1,D2,D3,D4,D5,D6,D7⽤于读写数据也就是说是并⾏通信。
判断液晶忙:判断STA7是否为1,所以将P0⼝总线的数据和0x80(1000 0000)进⾏与运算。
每次对1602写指令都需要判断是否忙。
void Read_busy(){uchar busy;P0 = 0xff;RS = 0;RW = 1;do{EN = 1;busy = P0;EN = 0;}while(busy & 0x80);}写字节和写数据都是按照1602的数据⼿册来写的。
写LCD1602命令⼀个字节:void Write_Cmd(uchar cmd){Read_busy();RS = 0;RW = 0;P0 = cmd;EN = 1;EN = 0;}写⼀个字节数据:void Write_Dat(uchar dat){Read_busy();RS = 1;RW = 0;P0 = dat;EN = 1;EN = 0;}由上⾯的函数,就可以初始化LCD1602。
1602初始化函数:void Init_LCD1602(){LCD1602_Write_Cmd(0x38); //设置16*2显⽰,5*7点阵,8位数据接⼝LCD1602_Write_Cmd(0x0c); //开显⽰,不显⽰光标(0xf开显⽰,显⽰光标,光标闪烁)LCD1602_Write_Cmd(0x01); //清除显⽰LCD1602_Write_Cmd(0x06); //读写⼀字节后地址指针加1 Write_Cmd(0x80 | 0x00); //设置显⽰地址(显⽰在第⼀⾏第⼀个)设置显⽰地址以及设置读写地址指针⽅向⼀定要在清除显⽰之后要不然仍会显⽰在第⼀个格)LCD1602RAM在显⽰数字的时候要⽤ Write_Dat(3 + '0');显⽰字母使⽤ASCLL码(例如:显⽰H:Write_Dat(0x48);)在指定位置显⽰⼀个字符:要显⽰的横坐标取值0-40要显⽰的⾏坐标取值0-1(0为第⼀⾏,1为第⼆⾏)dat:需要显⽰的数据以ASCLL形式显⽰void LCD1602_Dis_OneChar(uchar x, uchar y,uchar dat){if(y) x |= 0x40;x |= 0x80;LCD1602_Write_Cmd(x);LCD1602_Write_Dat(dat);}显⽰字符串的时候就需要⽤到指针:在指定位置显⽰字符串:要显⽰的横坐标取值0-40要显⽰的⾏坐标取值0-1(0为第⼀⾏,1为第⼆⾏)*str:需要显⽰的字符串void LCD1602_Dis_Str(uchar x, uchar y, uchar *str){if(y) x |= 0x40;x |= 0x80;LCD1602_Write_Cmd(x);while(*str != '\0'){LCD1602_Write_Dat(*str++);}}调⽤⽅式:uchar TestStr[] = {"Welcome!"};LCD1602_Dis_Str(0, 0, &TestStr[0]);显⽰简单的数字:#include <reg52.h>#define uchar unsigned char#define uint unsigned intsbit RS = P3^5;sbit RW = P3^6;sbit EN = P3^4;void Read_busy() //判断液晶忙{uchar busy;P0 = 0xff;RS = 0;RW = 1;do{EN = 1;busy = P0;EN = 0;}while(busy & 0x80);}void Write_Cmd(uchar cmd) //写LCD1602命令⼀个字节{Read_busy();RS = 0;RW = 0;P0 = cmd;EN = 1;EN = 0;}void Write_Dat(uchar dat) //写⼀个字节数据{Read_busy();RS = 1;RW = 0;P0 = dat;EN = 1;EN = 0;}void main(){Write_Cmd(0x38);//设置16*2显⽰Write_Cmd(0x0f);//开显⽰显⽰光标,光标闪烁Write_Cmd(0x01);//清屏Write_Cmd(0x06);//地址指针移位命令Write_Cmd(0x80 | 0x00);//显⽰地址Write_Dat(1 + '0');Write_Dat(2 + '0');Write_Dat(3 + '0');Write_Dat(4 + '0');Write_Dat(5 + '0');while(1);}显⽰字符串:#include <reg52.h>typedef unsigned char uchar;typedef unsigned int uint;#define LCD1602_DB P0 //LCD1602数据总线sbit LCD1602_RS = P3^5; //RS端sbit LCD1602_RW = P3^6; //RW端sbit LCD1602_EN = P3^4; //EN端sbit DU = P2^6;//sbit WE = P2^7;//数码管位选段选⽤于关闭数码管显⽰/*=================================================*函数名称:Read_Busy*函数功能:判断1602液晶忙,并等待=================================================*/void Read_Busy(){uchar busy;LCD1602_DB = 0xff;//复位数据总线LCD1602_RS = 0; //拉低RSLCD1602_RW = 1; //拉⾼RW读do{LCD1602_EN = 1;//使能ENbusy = LCD1602_DB;//读回数据LCD1602_EN = 0; //拉低使能以便于下⼀次产⽣上升沿}while(busy & 0x80); //判断状态字BIT7位是否为1,为1则表⽰忙,程序等待}/*=================================================*函数名称:LCD1602_Write_Cmd*函数功能:写LCD1602命令*调⽤:Read_Busy();*输⼊:cmd:要写的命令=================================================*/void LCD1602_Write_Cmd(uchar cmd){Read_Busy(); //判断忙,忙则等待LCD1602_RS = 0;LCD1602_RW = 0; //拉低RS、RW操作时序情况1602课件下中⽂使⽤说明基本操作时序章节 LCD1602_DB = cmd;//写⼊命令LCD1602_EN = 1; //拉⾼使能端数据被传输到LCD1602内LCD1602_EN = 0; //拉低使能以便于下⼀次产⽣上升沿}/*=================================================*函数名称:LCD1602_Write_Dat*函数功能:写LCD1602数据*调⽤:Read_Busy();*输⼊:dat:需要写⼊的数据=================================================*/void LCD1602_Write_Dat(uchar dat){Read_Busy();LCD1602_RS = 1;LCD1602_RW = 0;LCD1602_DB = dat;LCD1602_EN = 1;LCD1602_EN = 0;}/*=================================================*函数名称:LCD1602_Dis_OneChar*函数功能:在指定位置显⽰⼀个字符*调⽤:LCD1602_Write_Cmd(); LCD1602_Write_Dat();*输⼊:x:要显⽰的横坐标取值0-40,y:要显⽰的⾏坐标取值0-1(0为第⼀⾏,1为第⼆⾏)dat:需要显⽰的数据以ASCLL形式显⽰=================================================*/void LCD1602_Dis_OneChar(uchar x, uchar y,uchar dat){if(y) x |= 0x40;x |= 0x80;LCD1602_Write_Cmd(x);LCD1602_Write_Dat(dat);}/*=================================================*函数名称:LCD1602_Dis_Str*函数功能:在指定位置显⽰字符串*调⽤:LCD1602_Write_Cmd(); LCD1602_Write_Dat();*输⼊:x:要显⽰的横坐标取值0-40,y:要显⽰的⾏坐标取值0-1(0为第⼀⾏,1为第⼆⾏)*str:需要显⽰的字符串=================================================*/void LCD1602_Dis_Str(uchar x, uchar y, uchar *str){if(y) x |= 0x40;x |= 0x80;LCD1602_Write_Cmd(x);while(*str != '\0'){LCD1602_Write_Dat(*str++);}}/*=================================================*函数名称:Init_LCD1602*函数功能:1602初始化*调⽤: LCD1602_Write_Cmd();=================================================*/void Init_LCD1602(){LCD1602_Write_Cmd(0x38); // 设置16*2显⽰,5*7点阵,8位数据接⼝ LCD1602_Write_Cmd(0x0c); //开显⽰LCD1602_Write_Cmd(0x06); //读写⼀字节后地址指针加1LCD1602_Write_Cmd(0x01); //清除显⽰}void main(){uchar TestStr[] = {"Welcome!"};DU = 0;WE = 0;//关闭数码管显⽰Init_LCD1602();//1602初始化LCD1602_Dis_Str(0, 0, &TestStr[0]); //显⽰字符串LCD1602_Dis_OneChar(10, 1, 0xff); //显⽰⼀个⿊⽅格while(1);}。