lcd1602显示及测试程序
LCD1602显示的程序
WriteOneChar(0xbe);//发温度转换命令
readtemp[0]=ReadOneChar();//读取相应的温度值低位
readtemp[1]=ReadOneChar();//读取相应的温度值高位
sflag[h]=0;
delayy(20);
}
//18B20读一个字节
ReadOneChar(void)
{
unsigned char i="0";
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
}
}
readtemp[1]=readtemp[1]<<4;//将高低温度和为一个字节,本方法避免了*0。0625,很简单,很准确
readtemp[1]=readtemp[1] & 0x70;
xx="readtemp"[0];
{
displaybuf[k+1]= fentemp%10;
fentemp= fentemp/10;
}
displaybuf[k]= fentemp;
k+=2;
xx="xx">>4;
xx="xx"& 0x0f;
readtemp[1]=readtemp[1] | xx;
temp[h]=readtemp[1];
fentempபைடு நூலகம்"temp"[h];//拆分两路温度值送入显示单元
LCD1602中文资料程序和使用说明
LCD1602中文资料程序和使用说明一、硬件连接和初始化步骤:1.将LCD1602的16个引脚连接到MCU(单片机)的相应引脚上。
其中,VCC和GND分别接到电源正负极,VO接到可调电位器的中间引脚(用于调节背光亮度),RS、RW和E分别接到MCU的IO口上,D0-D7分别接到MCU的8个IO口上。
2.初始化LCD1602的操作包括设置显示模式、显示光标、输入模式等,具体步骤如下:a.将8位数据接口设置为并行输入模式,即设置D0-D3为输入模式。
b.设置显示模式为2行显示,5x8点阵字符,显示器不移动。
c.将显示光标设置为闪烁显示。
d.设置数据输入方式为向右移动,同时字符显示不移动。
e.清除显示内容,将光标位置设置为第一行第一列。
f.打开显示器和光标显示功能。
二、常用函数和操作方法:1. void lcd1602_init( 初始化LCD1602,包括上述硬件连接和初始化步骤。
2. void lcd1602_clear( 清除显示内容。
3. void lcd1602_setCursor(int row, int column) 设置光标位置,row表示行数(从0开始),column表示列数(从0开始)。
4. void lcd1602_print(String str) 在当前光标位置打印字符串str。
5. void lcd1602_shiftDisplayLeft( 将显示内容向左移动一位。
6. void lcd1602_shiftDisplayRight( 将显示内容向右移动一位。
7. void lcd1602_scrollDisplayLeft( 将整个显示内容向左滚动一格。
8. void lcd1602_scrollDisplayRight( 将整个显示内容向右滚动一格。
9. void lcd1602_noCursor( 关闭光标显示。
10. void lcd1602_cursor( 打开光标显示。
LCD1602液晶显示实验
LCD1602液晶显示实验1.实验原理1.1 基本原理1.1.1 1602字符型LCD简介字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式LCD,目前常用16*1,16*2,20*2和40*2行等的模块。
1.1.2 1602LCD的基本参数及引脚功能1602LCD分为带背光和不带背光两种,基控制器大部分为HD44780,带背光的比不带背光的厚,是否带背光在应用中并无差别,两者尺寸差别如下图1-2所示:图1-2 1602LCD尺寸图1.1602LCD主要技术参数:显示容量: 16×2个字符芯片工作电压: 4.5~5.5V工作电流: 2.0mA(5.0V)模块最佳工作电压: 5.0V字符尺寸: 2.95×4.35(W×H)mm2.引脚功能说明:1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表:表1-3引脚接口说明表编符号引脚说明编号符号引脚说明号1 VSS 电源地9 D2 数据2 VDD 电源正极10 D3 数据3 VL 液晶显示偏压11 D4 数据4 RS 数据/命令选择12 D5 数据5 R/W 读/写选择13 D6 数据6 E 使能信号14 D7 数据7 D0 数据15 BLA 背光源正极8 D1 数据16 BLK 背光源负极1.1.3 1602LCD的指令说明及时序1602液晶模块内部的控制器共有11条控制指令,如表1-4所示:表1-4 控制命令表序号指令RS R/W D7 D6 D5 D4 D3 D2 D1 D01 清显示0 0 0 0 0 0 0 0 0 12 光标返回0 0 0 0 0 0 0 0 1 *3 置输入模式0 0 0 0 0 0 0 1 I/D S4 显示开/关控制0 0 0 0 0 0 1 D C B5 光标或字符移位0 0 0 0 0 1 S/C R/L * *6 置功能0 0 0 0 1 DL N F * *7 置字符发生存贮器地址0 0 0 1 字符发生存贮器地址8 置数据存贮器地址0 0 1 显示数据存贮器地址9 读忙标志或地址0 1 BF 计数器地址10 写数到CGRAM或DDRAM)1 0 要写的数据内容11 从CGRAM或DDRAM读数1 1 读出的数据内容1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。
LCD1602显示~~C程序
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 。
LCD1602原理与显示程序
LCD1602原理与显示程序LCD1602的原理是基于液晶显示技术。
液晶是一种特殊的物质,具有双折射性质,即能将入射的光线分成两束,通过改变液晶分子的排列方式,可以改变其双折射的性质,从而使得光线透过液晶时会发生偏转。
LCD1602利用这一原理,在液晶显示面板上设置了16列和2行的像素点阵,通过控制每个像素点的液晶分子的排列方式,来实现字符的显示。
初始化是指在使用LCD1602之前,需要对其进行一系列的初始化操作,以确保其正常工作。
具体的初始化步骤如下:1.设置通信协议:LCD1602可以通过并行接口和串行接口进行通信,根据具体的接口方式,选择相应的通信协议。
2.设置工作模式:LCD1602有两种工作模式,分别是4位模式和8位模式。
选择适合的工作模式,并设置相应的控制寄存器。
3.设置显示模式:LCD1602可以显示不同的字符集,如英文字符、数字、特殊符号等。
选择合适的字符集,并设置显示模式。
4.清除显示:设置清除显示寄存器,将显示区域清空。
5.光标设置:设置光标位置和显示方式,如光标是否闪烁、光标位置等。
完成初始化后,就可以将要显示的数据写入LCD1602数据写入是指将要显示的字符或数字写入到LCD1602的显示区域。
具体的数据写入步骤如下:1.设置光标位置:根据需要显示的字符位置,设置光标的位置。
2.数据写入:通过通信接口,将要显示的数据写入到LCD1602的数据寄存器。
3.延时:由于LCD1602的刷新速度较慢,需要等待一定的时间,使得数据能够稳定显示在液晶屏上。
4.更新光标位置:根据数据的长度和显示方式,更新光标的位置。
通过以上的步骤,就可以实现LCD1602的显示功能。
总结起来,LCD1602的原理是基于液晶显示技术,通过控制液晶分子排列方式来实现字符的显示。
其显示程序包括初始化和数据写入两个方面的内容,通过设置通信协议、工作模式、显示模式等参数,并将要显示的数据写入到LCD1602的显示区域,来实现字符的显示。
LCD1602液晶显示实验实验报告及程序
LCD1602液晶显示实验实验报告及程序一、实验目的本次实验的主要目的是熟悉并掌握 LCD1602 液晶显示屏的工作原理和编程方法,能够成功实现字符在液晶屏幕上的显示和控制。
二、实验原理LCD1602 是一种工业字符型液晶,能够显示 16x2 个字符,即每行16 个字符,共 2 行。
它的工作原理是通过控制液晶分子的偏转来实现字符的显示。
LCD1602 有 16 个引脚,主要引脚功能如下:1、 VSS:接地。
2、 VDD:接电源(通常为+5V)。
3、 V0:对比度调整引脚,通过外接电位器来调节屏幕显示的对比度。
4、 RS:寄存器选择引脚,高电平时选择数据寄存器,低电平时选择指令寄存器。
5、 RW:读写选择引脚,高电平时进行读操作,低电平时进行写操作。
6、 E:使能引脚,下降沿触发。
7、 D0 D7:数据引脚,用于传输数据和指令。
LCD1602 的指令集包括清屏、归位、输入方式设置、显示开关控制、光标或显示移位、功能设置、CGRAM 和 DDRAM 地址设置以及读忙标志和地址等。
三、实验设备与材料1、单片机开发板2、 LCD1602 液晶显示屏3、杜邦线若干4、电脑四、实验步骤1、硬件连接将 LCD1602 的 VSS 引脚接地。
将 VDD 引脚接+5V 电源。
将 V0 引脚通过一个 10K 的电位器接地,用于调节对比度。
将 RS、RW、E 引脚分别连接到单片机的三个 I/O 口。
将 D0 D7 引脚连接到单片机的 8 个 I/O 口。
2、软件编程包含必要的头文件。
定义与 LCD1602 连接的 I/O 口。
编写初始化函数,包括设置显示模式、清屏、输入方式等。
编写写指令函数和写数据函数,用于向LCD1602 发送指令和数据。
编写显示字符串函数,实现字符在屏幕上的显示。
3、编译下载程序使用编译软件对编写的程序进行编译,生成可执行文件。
将可执行文件下载到单片机开发板中。
4、观察实验结果给开发板上电,观察 LCD1602 液晶显示屏上是否正确显示预设的字符。
lcd1602流程图
lcd1602流程图LCD1602流程图是指在液晶显示屏模块上显示特定信息的流程图。
下面我们将介绍一个简单的LCD1602流程图,包括初始化液晶模块、设置显示模式、输入要显示的内容等步骤。
首先,我们需要准备一个Arduino开发板和一个LCD1602模块。
将LCD模块的VCC和GND引脚分别连接到Arduino的3.3V和GND引脚上,将SDA和SCL引脚连接到Arduino的A4和A5引脚上。
然后,编写以下步骤来实现流程图。
第一步,初始化液晶模块。
在Arduino开发环境中,我们需要包含LiquidCrystal_I2C.h库文件,然后创建一个LiquidCrystal_I2C对象。
使用begin()函数初始化LCD模块,并设置显示模式和光标的闪烁。
第二步,设置显示模式。
使用setCursor()函数将光标移动到特定位置,并使用print()函数输入要显示的内容。
根据需要可以设置一到两行进行显示。
第三步,设置滚动显示。
使用scrollDisplayLeft()或scrollDisplayRight()函数在屏幕上滚动显示内容。
第四步,设置光标显示状态。
使用noCursor()函数关闭光标显示,使用cursor()函数开启光标显示。
第五步,设置光标闪烁状态。
使用noBlink()函数关闭光标闪烁,使用blink()函数开启光标闪烁。
第六步,设置显示打开/关闭状态。
使用noDisplay()函数关闭显示,使用display()函数开启显示。
第七步,设置自定义字符。
使用createChar()函数在CGRAM (字符生成RAM)中自定义字符,并使用write()函数在屏幕上显示。
第八步,清除屏幕。
使用clear()函数清除屏幕上的内容。
第九步,设置屏幕显示次数。
使用blinkDisplay()函数设置屏幕的显示次数,并使用count()函数检测屏幕的显示次数。
第十步,控制光标位置。
使用setCursor()函数将光标移动到特定位置。
STM32的LCD1602显示程序
STM32的LCD1602显⽰程序STM32的LCD1602显⽰程序以下为课设期间为1602显⽰屏驱动写的stm32的程序,其中参考了许多⼤佬的例⼦程序设计:硬件原理:D0-D7⽤的是PD0-PD7,RS为PB10,E为PB11,RW为PB12,使⽤的板⼦是STM32F103VET6下⾯是我的程序,只完成了基础功能,并没有⾃定义字模部分的代码lcd.h#ifndef __LCD_H#define __LCD_H#include "stm32f10x.h"/////////////////////////////////////////////////////////#define D0_1 GPIO_SetBits(GPIOD,GPIO_Pin_0)#define D0_0 GPIO_ResetBits(GPIOD,GPIO_Pin_0)#define D1_1 GPIO_SetBits(GPIOD,GPIO_Pin_1)#define D1_0 GPIO_ResetBits(GPIOD,GPIO_Pin_1)#define D2_1 GPIO_SetBits(GPIOD,GPIO_Pin_2)#define D2_0 GPIO_ResetBits(GPIOD,GPIO_Pin_2)#define D3_1 GPIO_SetBits(GPIOD,GPIO_Pin_3)#define D3_0 GPIO_ResetBits(GPIOD,GPIO_Pin_3)#define D4_1 GPIO_SetBits(GPIOD,GPIO_Pin_4)#define D4_0 GPIO_ResetBits(GPIOD,GPIO_Pin_4)#define D5_1 GPIO_SetBits(GPIOD,GPIO_Pin_5)#define D5_0 GPIO_ResetBits(GPIOD,GPIO_Pin_5)#define D6_1 GPIO_SetBits(GPIOD,GPIO_Pin_6)#define D6_0 GPIO_ResetBits(GPIOD,GPIO_Pin_6)#define D7_1 GPIO_SetBits(GPIOD,GPIO_Pin_7)#define D7_0 GPIO_ResetBits(GPIOD,GPIO_Pin_7)#define RS_1 GPIO_SetBits(GPIOB,GPIO_Pin_10)#define RS_0 GPIO_ResetBits(GPIOB,GPIO_Pin_10)#define RW_1 GPIO_SetBits(GPIOB,GPIO_Pin_12)#define RW_0 GPIO_ResetBits(GPIOB,GPIO_Pin_12)#define E_1 GPIO_SetBits(GPIOB,GPIO_Pin_11)#define E_0 GPIO_ResetBits(GPIOB,GPIO_Pin_11)/////////////////////////////////////////////////////////void LCD_Init(void);//初始化void LCD_Clear(void);//清除显⽰void LCD_CursorReset(void);//光标返回void LCD_SetInput(u16,u16);//置输⼊模式void LCD_Display(u16,u16,u16);//显⽰开关控制void LCD_COD(u16,u16);//光标或显⽰移动指令void LCD_Mode(u16,u16,u16);//⼯作⽅式设置void LCD_CGRAM_Addr(u8);//设置CGRAN地址,除置位位以外共六位void LCD_DDRAM_Addr(u8);//设置DDRAM地址,除置位位以外共七位void LCD_RB(void);//当1602处于忙状态时,不接受指令,当不忙时,接受指令void LCD_Write(u8);//写⼊数据void LCD_Read(void);//读取数据void LCD_WriteStr(u8*,int);//写⼊字符串#endiflcd.c#include "lcd.h"#include "stm32f10x_gpio.h"void LCD_Init(void){GPIO_InitTypeDef GPIO_LCDStr;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_LCDStr.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_LCDStr.GPIO_Speed=GPIO_Speed_50MHz;GPIO_LCDStr.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7; GPIO_Init(GPIOD,&GPIO_LCDStr);GPIO_LCDStr.GPIO_Pin=GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_10;GPIO_Init(GPIOB,&GPIO_LCDStr);}//////////////////////////////////////////////////////////////////////////////void LCD_Clear(void){E_0;LCD_RB();RS_0;RW_0;GPIO_Write(GPIOD,0x01);E_1;E_0;}//////////////////////////////////////////////////////////////////////////////////void LCD_CursorReset(void){E_0;LCD_RB();RS_0;RW_0;GPIO_Write(GPIOD,0x02);E_1;E_0;}//////////////////////////////////////////////////////////////////////////////////////void LCD_SetInput(u16 ID,u16 S){E_0;LCD_RB();RS_0;RW_0;D7_0;D6_0;D5_0;D4_0;D3_0;D2_1;if(ID==1)/*⾼电平光标右移,低电平左移*/D1_1;else if(ID==0)D1_0;if(S==1)/*屏幕上所有的⽂字是否左移或右移,⾼电平有效,低电平⽆效*/ D0_1;else if(S==0)D0_0;E_1;E_0;}//////////////////////////////////////////////////////////////////////////////////////////void LCD_Display(u16 D,u16 C,u16 B){E_0;LCD_RB();RS_0;RW_0;D7_0;D6_0;D5_0;D4_0;D3_1;if(D==1)//⾼电平开,低电平关D2_1;else if(D==0)D2_0;if(C==1)//⾼电平有光标,低电平⽆光标D1_1;else if(C==0)D1_0;if(B==1)//光标是否闪烁,⾼电平闪烁,低电平⽆D0_1;else if(B==0)D0_0;E_1;E_0;}////////////////////////////////////////////////////////////////////////////////////////////void LCD_COD(u16 SC,u16 RL){E_0;LCD_RB();RS_0;RW_0;D7_0;D6_0;D5_0;D4_1;D1_1;D0_1;if(SC==1)//⾼电平显⽰移动的⽂字,低电平移动坐标D3_1;else if(SC==0)D3_0;if(RL==1)//⾼电平右移,低电平左移D2_1;else if(RL==0)D2_0;E_1;E_0;}////////////////////////////////////////////////////////////////////////////////////////////void LCD_Mode(u16 DL,u16 N,u16 F){E_0;LCD_RB();E_1;RS_0;RW_0;D7_0;D6_0;D5_1;D1_1;D0_1;if(DL==1)//⾼电平⼋位数据接⼝,低电平四位数据接⼝D4_1;else if(DL==0)D4_0;if(N==1)//⾼电平两⾏显⽰,低电平⼀⾏显⽰D3_1;else if(N==0)D3_0;if(F==1)//⾼电平5x10点阵,低电平5x8点阵D2_1;else if(F==0)D2_0;E_0;}////////////////////////////////////////////////////////////////////////////////////////void LCD_CGRAM_Addr(u8 addr)//{E_0;LCD_RB();RS_0;RW_0;D6_1;E_1;E_0;}//////////////////////////////////////////////////////////////////////////////void LCD_DDRAM_Addr(u8 addr)//{E_0;LCD_RB();RS_0;RW_0;GPIO_Write(GPIOD,0x0000);//清空地址GPIO_Write(GPIOD,addr);E_1;E_0;}//////////////////////////////////////////////////////////////////////////////////void LCD_RB(void)//{GPIO_InitTypeDef pp;RS_0;RW_1;pp.GPIO_Mode=GPIO_Mode_IN_FLOATING;pp.GPIO_Speed=GPIO_Speed_50MHz;pp.GPIO_Pin=GPIO_Pin_7;GPIO_Init(GPIOD,&pp);//将端⼝设为输⼊E_1;while(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_7));//若忙信号存在,则⼀直循环,直⾄忙信号结束E_0;pp.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7; pp.GPIO_Mode=GPIO_Mode_Out_PP;pp.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOD,&pp);//将端⼝重新设为输出}//////////////////////////////////////////////////////////////////////////////////////////void LCD_Write(u8 data)//{LCD_RB();RS_1;RW_0;E_1;GPIO_Write(GPIOD,data);E_0;}////////////////////////////////////////////////////////////////////////////void LCD_Read(void)//{LCD_RB();RS_1;RW_1;E_1;E_0;}////////////////////////////////////////////////////////////////////////////void LCD_WriteStr(u8 *str,int length)//{int i=0;for(i=0;i<length;i++){if(i<=15){LCD_DDRAM_Addr(0x80+i);LCD_Write(str[i]);}else{LCD_DDRAM_Addr(0xc0+i-16);LCD_Write(str[i]);}}}main.c#include "lcd.h"#include "string.h"int main(){u8 strMCU[]=" **** YOU 1602! TEST TEST "; LCD_Init();LCD_Clear();LCD_SetInput(1,0);LCD_Display(1,0,0);LCD_Mode(1,1,0);LCD_WriteStr(strMCU,strlen(strMCU));。
LCD1602液晶显示实验要点
LCD1602液晶显示实验要点一、液晶显示原理液晶显示屏是一种电场调制显示器件,通过激励电场使液晶分子的排列状态发生变化,从而控制光的透过程度,实现图像显示。
液晶显示器的基本结构是两块平行的玻璃基板夹层液晶,上面由导电涂层构成的液晶单元。
在液晶单元上方有一块透明电极玻璃,根据控制信号排列液晶分子,形成图像。
二、LCD1602液晶显示屏三、实验器材1. Arduino开发板2.LCD1602液晶显示屏3.面包板4.杜邦线等四、实验步骤1. 接线:将LCD1602液晶显示屏与Arduino开发板通过杜邦线连接。
将VCC接到5V电源、GND接到地、SCL接到A5口、SDA接到A4口。
2. 编写程序:打开Arduino开发环境,编写程序代码,实现液晶显示功能。
3. 初始化:使用LiquidCrystal库,编写代码进行液晶显示屏的初始化设置。
4. 显示字符:通过调用lcd.print(函数,将指定字符显示在液晶屏上。
5. 光标控制:调用lcd.setCursor(函数,设置光标所在位置。
6. 清屏:调用lcd.clear(函数,清除液晶屏上的字符。
7. 控制显示:通过调用lcd.noDisplay(和lcd.Display(函数,控制液晶屏的显示和关闭。
8. 自定义字符:通过调用lcd.createChar(函数,创建自定义字符并显示在液晶屏上。
五、实验注意事项1.液晶显示屏的类型应与编程语言库文件匹配。
2.接线时要确保正确连接,以免损坏LCD1602显示屏。
3.初始化液晶显示屏时,要设置液晶屏的列数和行数。
4.控制液晶显示屏时,要注意操作指令的执行顺序,以免出现误操作。
六、实验结果展示通过编写相应的程序,可以实现在液晶显示屏上显示指定字符、自定义字符,以及控制光标的移动和屏幕的清除等功能。
实验成功时,可以在液晶显示屏上看到所期望的字符和效果。
七、实验应用液晶显示屏广泛应用于各种电子设备和仪器仪表,如电子体温计、电子秤、数码相册、电视机等。
lcd1602显示(c语言)简单测试
因编译器出了问题,加汉字注释老是编译不能通过,故所加注释较少,看一下lcd1602的资料就明白了电路图如下(该图只是仿真图,做实物时要1脚应加一小电阻,实物中1602还有两个脚,是背光电源正负极,正极要加可变电阻调节亮度,网上能找到详细的电路图):原程序:#include<reg51.h>unsigned char code str1[]={"count: "};unsigned char data disdata[1];unsigned int snum=0;sbit RS=P3^0;sbit RW=P3^1;sbit EN=P3^2;void delay1ms(unsigned int t)延时{unsigned int i,j;for(i=0;i<t;i++)for(j=0;j<100;j++);}void wr_com(unsigned char com)//写指令// { delay1ms(1);RS=0;RW=0;EN=0;P2=com;delay1ms(1);EN=1;delay1ms(1);EN=0;}void wr_dat(unsigned char dat)//写数据// { delay1ms(1);;RS=1;RW=0;EN=0;P2=dat;delay1ms(1);EN=1;delay1ms(1);EN=0;}void lcd_init()//初始化设置//{delay1ms(15);wr_com(0x38);delay1ms(5);wr_com(0x08);delay1ms(5);wr_com(0x01);delay1ms(5);wr_com(0x06);delay1ms(5);wr_com(0x0c);delay1ms(5);}void numpro()循环显示数字{ delay1ms(250);delay1ms(250);if(snum==20)snum=0;elsesnum++;disdata[0]=snum/10+0x30;disdata[1]=snum%10+0x30;wr_com(0x86);wr_dat(disdata[0]);wr_com(0x87);wr_dat(disdata[1]);wr_com(0xc6);wr_dat(disdata[0]);wr_com(0xc7);wr_dat(disdata[1]);}void display(unsigned char *p)//显示字符串// {while(*p!='\0'){wr_dat(*p);p++;delay1ms(1);}}void main(){ lcd_init();wr_com(0x80);display(str1);wr_com(0xc0);display(str1);while(1){numpro(); }}。
超声波测距程序(LCD1602液晶显示)
#include<reg52.h>#include<intrins.h>#define uint unsignedint#define uchar unsigned char#define NOP() {_nop_();_nop_();_nop_();_nop_();}//------LCD引脚-----sbit LCD_RS=P2^6;sbit LCD_RW=P2^5;sbit LCD_EN=P2^7;//------超声波引脚-------sbitTx=P3^3; //触发控制信号输入Trigsbit Rx=P3^2; //回响信号输出Echouchar code table[]={"Distance Test:"}; //LCD第一行显示uchartemp_dis[]= {"000.0 cm"}; //LCD第二行longintt,distance;uchar cache[4]={0,0,0,0};//--------延时-------void delay(uintms){uint t;while(ms--)for(t=0;t<120;t++);}//-------读LCD状态-------ucharread_lcd_state(){uchar state;LCD_RS=0;LCD_RW=1;LCD_EN=1;_nop_();state=P0;LCD_EN=0;_nop_();return state;}//-------忙等待------voidlcd_busy_wait(){while((read_lcd_state() & 0x80)==0x80);NOP();}//----------LCD写指令----------voidlcd_write_com(uchar com){lcd_busy_wait();LCD_RS=0; //RS为0时,写指令,RS为1时,写数据LCD_RW=0;P0=com;NOP();LCD_EN=1;NOP();LCD_EN=0;}//----------LCD写数据----------voidlcd_write_data(uchardat){lcd_busy_wait();LCD_RS=1;LCD_RW=0;P0=dat;NOP();LCD_EN=1;NOP();LCD_EN=0;}//-------LCD初始化-------voidlcd_init(){LCD_EN=0;lcd_write_com(0x38); //LCD显示模式设置lcd_write_com(0x0c); //LCD显示开/关及光标设置lcd_write_com(0x06); //当写一个字符后地址指针加1,且光标加1 lcd_write_com(0x01); //显示清屏}//---------设置液晶显示位置-----------voidset_lcd_pos(uchar p){lcd_write_com(p|0x80);}//---------液晶显示程序----------voidlcd_print(ucharp,uchar *s,uint low){uintnum;set_lcd_pos(p);for(num=0;num<low;num++){lcd_write_data(s[num]);delay(1);}}void HC05_Init(){Tx=1; //触发脉冲NOP();NOP();NOP();NOP();Tx=0;distance=0.17*t; //距离计算}voiddistance_convert(long intdat){cache[0]=dat/1000;cache[1]=dat/100%10;cache[2]=dat/10%10;cache[3]=dat%10;temp_dis[0]=cache[0]+'0';temp_dis[1]=cache[1]+'0';temp_dis[2]=cache[2]+'0';temp_dis[4]=cache[3]+'0';}//------------主程序-----------void main(){lcd_init();delay(5);TMOD=0x19;EA=1; //开总中断TR0=1; //启动定时器EX0=1; //开外部中断IT0=1; //设置为下降沿中断方式while(1){HC05_Init();distance_convert(distance);lcd_print(0x01,table,14);lcd_print(0x44,temp_dis,8);}}//外部中断0void int0() interrupt 0{t=(TH0*256+TL0); //计算高电平持续的时间,上升沿到来时候开始计时,下降沿到来进入外部中断,关闭计时器,停止计时TH0=0;TL0=0;}。
LCD1602字符测试显示程序与仿真
#include "reg51.h"#include "intrins.h"#define uchar unsigned char#define uint unsigned intuchar code table1 []={" WELCOME "}; //欢迎显示,包括空格在内<=16 uchar code table2 []={"Name: "};//欢迎显示,包括空格在内<=16 //************管脚定义************************sbit lcd_rs = P3^0; //液晶数据命令选择端sbit lcd_en = P3^1; //液晶使能//************参数定义************************uint tvalue;//温度值uchar tflag;//温度正负标志uchar data disdata[5];//************子函数定义************************void delay(uchar z); //delay延时子程序void init_lcd(); //LCD1602初始化函数void write_com(uchar com); //LCD1602写指令函数void write_data(uchar date); //LCD1602写数据函数void lcd1602_display(uchar *q,uchar *p);//LCD1602显示函数void welcome_1(); //LCD1602显示欢迎函数1//************主函数************************void main(){welcome_1();delay(200);while(1);}//************delay延时子程序************************void delay(uchar z){uchar x,y;for(x=0;x<z;x++)for(y=0;y<114;y++);}//************LCD1602初始化函数************************void init_lcd(){lcd_en = 0; // 将使能端置0以完成脉冲write_com(0x38); //设置16*2显示,5*7点阵,8位数据接口write_com(0x08); //写一个字符后地址指针加1write_com(0x01); //显示清零,数据指针清零write_com(0x06); //写一个字符后地址指针加1write_com(0x0c); //关显示,光标不显示不闪烁}//************LCD1602写指令函数************************void write_com(uchar com){delay(5);lcd_rs = 0; // 选择写指令lcd_en = 0; // 将使能端置0P2 = com; // 将要写的命令送到数据总线上delay(5); // 延时5ms,待数据稳定lcd_en = 1; // 由于初始化已将lcd_en置为0,使能端给一个高脉冲,delay(5); // 延时5ms,待数据稳定lcd_en = 0; // 将使能端置0以完成脉冲}//************LCD1602写数据函数************************void write_data(uchar date){delay(5);lcd_rs = 1; // 选择写数据lcd_en = 0; // 将使能端置0P2 = date; // 将要写的数据送到数据总线上delay(5); // 延时5ms,待数据稳定lcd_en = 1; // 由于初始化已将lcd_en置为0,使能端给一个高脉冲,delay(5); // 延时5ms,待数据稳定lcd_en = 0; // 将使能端置0以完成脉冲}//************LCD1602显示函数******************void lcd1602_display(uchar *q,uchar *p){write_com(0x80); // 现将数据指针定位到第一行第一个字处while(*q!='\0'){write_data(*q);q++;delay(1);}write_com(0xc0); // 现将数据指针定位到第二行第一个字处while(*p!='\0'){write_data(*p);p++;delay(1);}}//************LCD1602显示欢迎函数1******************void welcome_1(){init_lcd();lcd1602_display(table1,table2);delay(200);}。
LCD1602原理及显示程序
在日常生活中,我们对液晶显示器并不陌生。
液晶显示模块已作为很多电子产品的通过器件,如在计算器、万用表、电子表与很多家用电子产品中都可以看到,显示的主要是数字、专用符号和图形。
在单片机的人机交流界面中,一般的输出方式有以下几种:发光管、LED数码管、液晶显示器。
发光管和LED数码管比较常用,软硬件都比较简单,在前面章节已经介绍过,在此不作介绍,本章重点介绍字符型液晶显示器的应用。
在单片机系统中应用晶液显示器作为输出器件有以下几个优点:显示质量高由于液晶显示器每一个点在收到信号后就一直保持那种色彩和亮度,恒定发光,而不像阴极射线管显示器(CRT)那样需要不断刷新新亮点。
因此,液晶显示器画质高且不会闪烁。
数字式接口液晶显示器都是数字式的,和单片机系统的接口更加简单可靠,操作更加方便。
体积小、重量轻液晶显示器通过显示屏上的电极控制液晶分子状态来达到显示的目的,在重量上比一样显示面积的传统显示器要轻得多。
功耗低相对而言,液晶显示器的功耗主要消耗在其内部的电极和驱动IC上,因而耗电量比其它显示器要少得多。
10.8.1 液晶显示简介①液晶显示原理液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。
液晶显示器具有厚度薄、适用于大规模集成电路直接驱动、易于实现全彩色显示的特点,目前已经被广泛应用在便携式电脑、数字摄像机、PDA移动通信工具等众多领域。
②液晶显示器的分类液晶显示的分类方法有很多种,通常可按其显示方式分为段式、字符式、点阵式等。
除了黑白显示外,液晶显示器还有多灰度有彩色显示等。
如果根据驱动方式来分,可以分为静态驱动(Static)、单纯矩阵驱动(Simple Matrix)和主动矩阵驱动(Active Matrix)三种。
③液晶显示器各种图形的显示原理:线段的显示点阵图形式液晶由M×N个显示单元组成,假设LCD显示屏有64行,每行有128列,每8列对应1字节的8位,即每行由16字节,共16×8=128个点组成,屏上64×16个显示单元与显示RAM区1024字节相对应,每一字节的内容和显示屏上相应位置的亮暗对应。
lcd1602显示及测试程序
本程序共分为三个文件:Main.c Lcd1602.c Lcd1602.h/************文件Main.c*************/#include<reg52.h>#include<Lcd1602.h>#define uchar unsigned char#define uint unsigned intvoid delay_ms(uint x){uint i,j;for(i=0;i<x;i++)for(j=0;j<120;j++);}void main(){Lcd_init();Write_char(0,10,'a');Write_string(1,0,"b b");delay_ms(1000);Clear_line(0);Write_string(0,0,"clear 0 line OK!");delay_ms(1000);Clear_line(1);Write_string(1,0,"clear 1 line OK!");delay_ms(1000);Clear_all();Write_string(0,1,"Clear all Ok!") ;while(1);}/********文件Lcd1602.c**************/#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int#define Nop _nop_()#define Lcd_data P0 /*数据口*/#define busy 0x80 /*检测忙状态*/sbit rs = P2^4;sbit rw = P2^5;sbit en = P2^6;void delay(uchar x){uchar i,j;for(i=0;i<x;i++)for(j=0;j<125;j++); }/*写命令*/void Write_com(uchar com) {rs = 0;delay(5);rw = 0;delay(5);Lcd_data = com;delay(5);en = 0;delay(10);en =1;delay(10);}/*写数据*/void Write_data(uchar dat) {rs = 1;delay(5);rw = 0;delay(5);Lcd_data = dat;delay(10);en =0;delay(5);en = 1;delay(10);}/*初始化*/void Lcd_init(){Lcd_data = 0x00;delay(15);Write_com(0x38);delay(5);Write_com(0x38);delay(5);Write_com(0x38);delay(5);Write_com(0x38); /*显示模式设置*/Write_com(0x08); /*显示关闭*/Write_com(0x01); /*显示清屏*/Write_com(0x06); /*显示光标移动设置*/Write_com(0x0c); /*显示开及光标设置*/}void Write_char(uchar x,uchar y,uchar dat){x &=0x1; /*限制x不能大于1*/y &=0xf; /*限制y不能大于15*/if(x)y |= 0x40 ; /*如果y大于1,则在第二行显示*/ y |= 0x80;Write_com(y);Write_data(dat);}void Write_string(uchar x,uchar y,uchar *str){uchar length = 0;x &=0x1; /*限制x不能大于1*/y &=0xf; /*限制y不能大于15*/while(*str!='\0'){Write_char(x,y,*str);y++;str++;}}void Clear_line(uchar line){Write_string(line,0," ");switch(line){case 0: Write_com(0x80);case 1: Write_com(0x80+0x40);default : break;}}void Clear_all(){Write_com(0x01);Write_com(0x80);}/**********文件Lcd1602.h**************/#define uchar unsigned char#define uint unsigned int#ifndef Lcd1602_h#define Lcd1602_hextern Lcd_init();extern Write_data(uchar dat);extern Write_char(uchar x,uchar y,uchar dat);extern Write_string(uchar x,uchar y,uchar *dat);extern Clear_line(uchar line);extern Clear_all();#endif已经测试通过,由于百度文库不能上传压缩包,故分三个文件。
51单片机LCD1602液晶显示程序
LCD1602_E = 1; //写入时序
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
}
#endif
/******************************************************************************
*
*函数名 * 函数功能
: 初始化 LCD 屏 :无 :无
*******************************************************************************
/
#ifndef
LCD1602_4PINS
void LcdInit()
//LCD 初始化子程序
{ LcdWriteCom(0x38); //开显示
//以下程序都是在 VC++6.0 上调试运行过的程序,没有错误,没有警告。 //单片机是 STC89C52RC,但是在所有的 51 52 单片机上都是通用的。51 只是一个学习的基础 平台,你懂得。 //程序在关键的位置添加了注释。 //用//11111111111111111 代表第一个程序。//2222222222222222222222222 代表第二个程序, 以此类推
for(a=1;a>0;a--); } }
//误差 0us
}
/******************************************************************************
*
*函数名 * 函数功能
: LcdWriteCom : 向 LCD 写入一个字节的命令
LCD1602_E = 0;
LCD1602原理与显示程序
LCD1602原理与显示程序首先,液晶显示屏是由液晶分子填充在两块平行的玻璃基板之间组成的。
每个液晶分子都是一个由长链有机分子构成的棒状结构,其中的双键允许分子在电场的作用下进行旋转。
液晶分子通过平行阵列技术排列,使得液晶屏幕变为一个有序的结构,可以透过光束。
在液晶显示屏的基板上有多个透明电极排列,它们分别与控制芯片连接。
控制芯片通过对这些电极施加电压,调整液晶的扭曲程度。
当没有电压施加在液晶上时,液晶分子处于平行排列的状态,光线经过液晶屏会发生旋转,从而可以通过另一边的透光板透过。
当电压施加到液晶上时,液晶分子会以一定的角度旋转,光线经过时则发生偏波而无法穿过。
这样就实现了液晶显示屏的亮暗变化。
为了实现文字和图形的显示,我们需要通过控制芯片向液晶屏发送指令和数据。
控制芯片和液晶显示屏之间的连接是通过并行通信实现的,常用的通信方式是使用4位或8位并行数据线。
在发送指令和数据之前,我们需要将控制芯片配置为指令或数据模式。
指令模式下,控制芯片接收的数据被视为设定控制参数,比如清屏、光标移动等;数据模式下,控制芯片接收的数据被视为要显示的字符或图形。
液晶显示屏的显示程序可以使用任意的微控制器或单片机来编写。
程序的基本思路是通过对控制芯片发送指令和数据来控制液晶屏的显示。
首先,我们需要初始化液晶显示屏,这包括设置通信参数、清屏、光标重置等操作。
然后,我们可以通过写入数据寄存器来显示字符或图形。
通过控制芯片提供的指令,可以实现光标的位置移动、屏幕的滚动、光标的显示和隐藏等功能。
在程序中,我们可以定义字符和图形的数据,然后通过写入数据寄存器将其显示在液晶屏上。
有些控制芯片还提供了自定义字符的能力,可以通过修改字符发生器生成字符的模式来实现。
总结起来,LCD1602的原理是通过调整液晶的光透过性来实现显示,显示程序通过控制芯片向液晶屏发送指令和数据来控制显示内容。
程序的基本思路是初始化液晶显示屏,然后通过写入数据寄存器来显示字符或图形,通过发送指令来实现其他功能。
LCD1602简单显示程序(单片机)
#include <reg51.h>#define uchar unsigned char#define uint unsigned intsbit LCD_E=P3^5; //定义接口sbit LCD_RW=P3^6;sbit LCD_RS=P3^7;#define LCD_Data P1 //数据接口uchar up[]={"IvU,hupeixian"};uchar code down[]={"_by fu "}/*************************延时函数*****************************/void Delay_ms(uint time){uint i,j;for(i = 0;i < time;i ++)for(j = 0;j < 930;j ++);}/**********************检测状态************************************/ uchar LCD_ReadStatus(void){LCD_Data = 0xFF;LCD_RS = 0;LCD_RW = 1;LCD_E = 1;LCD_E = 1;LCD_E = 0;while (LCD_Data & 0x80); //检测忙信号return(LCD_Data);}/************************写数据***********************************/ void LCD_WriteData(uchar WDLCD){LCD_ReadStatus();//检测忙LCD_Data = WDLCDLCD_RS = 1;LCD_RW = 0;LCD_E = 1;//若晶振速度太高可以在这后加小的延时LCD_E = 1;//延时LCD_E = 0;}/************************写指令********************************/ void LCD_WriteCommand(uchar WCLCD,BuysC) //BuysC为0时忽略忙检测{if (BuysC)LCD_ReadStatus(); //根据需要检测忙LCD_Data = WCLCD;LCD_RS = 0;LCD_RW = 0;LCD_E = 1;LCD_E = 1;LCD_E = 0;}/*****************初始化***********************************/void LCD_Init(void){LCD_Data = 0;LCD_WriteCommand(0x38,0);//三次显示模式设置,不检测忙信号Delay_ms(5);LCD_WriteCommand(0x38,0);Delay5Ms();LCD_WriteCommand(0x38,0);Delay_ms(5);LCD_WriteCommand(0x38,1); //显示模式设置,开始要求每次检测忙信号LCD_WriteCommand(0x08,1); //关闭显示LCD_WriteCommand(0x01,1); //显示清屏LCD_WriteCommand(0x06,1); // 显示光标移动设置LCD_WriteCommand(0x0C,1); // 显示开及光标设置}/***********************显示一个字符********************************/ void DisplayOneChar(uchar X, uchar Y, uchar DData){Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;X |= 0x80; // 算出指令码LCD_WriteCommand(X, 0); //这里不检测忙信号,发送地址码LCD_WriteData(DData);}/************************显示一串字符*******************************/ void DisplayListChar(uchar X, uchar Y, uchar code *DData){uchar ListLength;ListLength = 0;Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1 while (DData[ListLength]>0x20) //若到达字串尾则退出{if (X <= 0xF) //X坐标应小于0xF{DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符ListLength++;X++;}}}/******************************************************************/ void main(void){Delay_ms(400); //启动等待,等LCD讲入工作状态LCD_Init(); //LCD初始化Delay_ms(5); //延时片刻(可不要)DisplayListChar(0, 1, up);DisplayListChar(6, 0, down);LCD_Data=0xff;while(1);}。
实验八 LCD1602液晶显示实验
实验报告八实验名称:LCD1602液晶显示实验实验目的:1了解LCD显示的基本原理2了解LCD的接口与控制方法3掌握LCD显示图形的方法4掌握LCD显示字符的方法实验原理:1、LCD显示器是通过给不同的液晶单元供电,控制其光线的通过与否,从而达到显示的目的。
因此,LCD的驱动控制归于对每个液晶单元通断电的控制,每个液晶单元都对应着一个电极,对其通电,便可使用光线通过(也有刚好相反的,即不通电时光线通过,通电时光线不通过)。
,2、由于LCD已经带有驱动硬件电路,因此模块给出的是总线接口,便于与单片机的总线进行接口。
驱动模块具有八位数据总线,外加一些电源接口和控制信号。
而且还自带显示缓存,只需要将要显示的内容送到显示缓存中就可以实现内容的显示。
由于只有八条数据线,因此常常通过引脚信号来实现地址与数据线复用,以达到把相应数据送到相应显示缓存的目的。
硬件原理图:1602液晶显示模块可以和单片机AT89C51直接接口,电路如图下图所示:PROTEUS中仿真观察结果.图一程序如下所示:RS EQU p2.6RW EQU p2.5E EQU p2.7ORG 0000HMOV SP , #70HMOV p0, #01HCALL ENABLEMOV p0, #38HCALL ENABLEMOV p0, #0FHCALL ENABLEMOV p0, #06HCALL ENABLEMOV p0, #80HCALL ENABLEMOV DPTR, #TABLE1CALL WRITE1MOV p0, #0C0HCALL ENABLEMOV DPTR, #TABLE2CALL WRITE1MOV p0, #0C2HCALL ENABLEJMP $ENABLE: CLR RSCLR RWCLR ECALL DELAYSETB ERETWRITE1: MOV R1, #00HA1: MOV A, R1MOVC A, @A+DPTRCALL WRITE2INC R1CJNE A, #00H, A1RETWRITE2: MOV p0 , ASETB RSCLR RWCLR ECALL DELAYSETB ERETDELAY: MOV R4, #05D1: MOV R5, #0FFHDJNZ R5, $DJNZ R4, D1RETTABLE1: DB" XIA MEN GUANJIE ",00HTABLE2: DB"XIAN SHI QI TECHNOLOGY ",00H END程序流程图如下所示:实验现象:从左往右逐字显示,闪动两次,清屏,再从右往左显示,闪动两次,清屏,安周期性重复上述现象!。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
");
switch(line) { case 0: Write_com(0x80); case 1: Write_com(0x80+0x40); default : break; } } void Clear_all() {
Write_com(0x01); Write_com(0x80); } /**********文件Lcd1602.h**************/ #define uchar unsigned char #define uint unsigned int #ifndef Lcd1602_h #define Lcd1602_h extern Lcd_init(); extern Write_data(uchar dat); extern Write_char(uchar x,uchar y,uchar dat); extern Write_string(uchar x,uchar y,uchar *dat); extern Clear_line(uchar line); extern Clefine uint unsigned int #define Nop _nop_() #define Lcd_data P0 #define busy 0x80 sbit rs = P2^4; sbit rw = P2^5; sbit en = P2^6; void delay(uchar x) { uchar i,j; for(i=0;i<x;i++) for(j=0;j<125;j++); } /*写命令*/ void Write_com(uchar com) { rs = 0; delay(5); rw = 0; delay(5); Lcd_data = com; delay(5); en = 0; delay(10); en =1; delay(10); } /*写数据*/ void Write_data(uchar dat) { rs = 1; /*数据口*/ /*检 如有错误欢迎指出 547886405@ ^_^
本程序共分为三个文件:Main.c Lcd1602.c Lcd1602.h /************文件Main.c*************/ #include<reg52.h> #include<Lcd1602.h> #define uchar unsigned char #define uint unsigned int void delay_ms(uint x) { uint i,j; for(i=0;i<x;i++) for(j=0;j<120;j++); } void main() { Lcd_init(); Write_char(0,10,'a'); Write_string(1,0,"b b"); delay_ms(1000); Clear_line(0); Write_string(0,0,"clear 0 line OK!"); delay_ms(1000); Clear_line(1); Write_string(1,0,"clear 1 line OK!"); delay_ms(1000); Clear_all(); Write_string(0,1,"Clear all Ok!") ; while(1); } /********文件Lcd1602.c**************/ #include<reg52.h> #include<intrins.h> #define uchar unsigned char
delay(5); rw = 0; delay(5); Lcd_data = dat; delay(10); en =0; delay(5); en = 1; delay(10); } /*初始化*/ void Lcd_init() { Lcd_data = 0x00; delay(15); Write_com(0x38); delay(5); Write_com(0x38); delay(5); Write_com(0x38); delay(5); Write_com(0x38); Write_com(0x08); Write_com(0x01); Write_com(0x06); Write_com(0x0c); } void Write_char(uchar x,uchar y,uchar dat) { x &=0x1; /*限制x不能大于1*/ y &=0xf; /*限制y不能大于15*/ if(x) /*显示模式设置*/ /*显示关闭*/ /*显示清屏*/ /*显示光标移动设置*/ /*显示开及光标设置*/
y |= 0x40 ; /*如果y大于1,则在第二行显示*/ y |= 0x80; Write_com(y); Write_data(dat); } void Write_string(uchar x,uchar y,uchar *str) { uchar length = 0; x &=0x1; /*限制x不能大于1*/ y &=0xf; /*限制y不能大于15*/ while(*str!='\0') { Write_char(x,y,*str); y++; str++; } } void Clear_line(uchar line) { Write_string(line,0,"