关于1602显示数字程序设计
1602数字显示及采样

1//1602液晶显示程序, TX-1B实验板上的1602LCD的R/W读写端接地, 即始终只写, 不读数据2//使用1602LCD显示DS18B20转换的温度值3#include <reg52.H>4#include <intrins.H>5#include <math.H>67#define uchar unsigned char8#define uint unsigned int9sbit dula = P2^6;10sbit wela = P2^7;11sbit RS = P3^5; //数据/命令选择端(H/L)13sbit LCDEN = P3^4; //使能端14void delayUs()16{17 _nop_();18}1920void delayMs(uint a)21{22uint i, j;23for(i = a; i > 0; i--)24for(j = 100; j > 0; j--);25}2627//第一行开始地址为0x80, 第二行开始地址为0xc0;28//写命令:RS=0, RW=0;29void writeComm(uchar comm)30{31 RS = 0;32 P0 = comm;33 LCDEN = 1;34 delayUs();35 LCDEN = 0;36 delayMs(1);37}3839//写数据:RS=1, RW=0;40void writeData(uchar dat)41{42 RS = 1;43 P0 = dat;44 LCDEN = 1;45 delayUs();46 LCDEN = 0;47 delayMs(1);48}4950//初始化51//显示模式, 固定指令为00111000=0x38, 16*2显示, 5*7点阵,8位数据接口52//显示开/关及光标设置53//指令1: 00001DCB : D:开显示/关显示(H/L); C:显示光标/不显示(H/L), B:光标闪烁/不闪烁(H/L)54//指令2: 000001NS :55//N=1, 当读/写一个字符后地址指针加1, 且光标也加1; N=0则相反56//S=1, 当写一个字符, 整屏显示左移(N=1)或右移(N=0), 但光标不移动; S=0, 整屏不移动57void init()58{59//先关闭数码管, 使两个锁存器锁存, 因开了数码管, USB电压驱动不够, 将无法使LC D正常工作60 dula = wela = 0;61 writeComm(0x38); //显示模式62 writeComm(0x0c); //开显示, 关光标63 writeComm(0x06); //写字符后地址加1, 光标加164 writeComm(0x01); //清屏65}6667void writeString(uchar * str, uchar length)68{69 uchar i;70for(i = 0; i < length; i++)71 {72 writeData(str[i]);73 }74}7576/*****************************DS18B20*********************** ********/77sbit ds = P2^2;78//初始化DS18B2079//让DS18B20一段相对长时间低电平, 然后一段相对非常短时间高电平, 即可启动80void dsInit()81{82//对于11.0592MHz时钟, unsigned int型的i, 作一个i++操作的时间大于为8us83 unsigned int i;84 ds = 0;85 i = 100; //拉低约800us, 符合协议要求的480us以上86while(i>0) i--;87 ds = 1; //产生一个上升沿, 进入等待应答状态88 i = 4;89while(i>0) i--;90}9192void dsWait()93{94 unsigned int i;95while(ds);96while(~ds); //检测到应答脉冲97 i = 4;98while(i > 0) i--;99}100101//向DS18B20读取一位数据102//读一位, 让DS18B20一小周期低电平, 然后两小周期高电平,103//之后DS18B20则会输出持续一段时间的一位数据104bit readBit()105{106 unsigned int i;107 bit b;108 ds = 0;109 i++; //延时约8us, 符合协议要求至少保持1us111 i++; i++; //延时约16us, 符合协议要求的至少延时15us以上112 b = ds;113 i = 8;114while(i>0) i--; //延时约64us, 符合读时隙不低于60us要求115return b;116}117118//读取一字节数据, 通过调用readBit()来实现119unsigned char readByte()120{121 unsigned int i;122 unsigned char j, dat;123 dat = 0;124for(i=0; i<8; i++)125 {126 j = readBit();127//最先读出的是最低位数据128 dat = (j << 7) | (dat >> 1);129 }130return dat;131}132133//向DS18B20写入一字节数据134void writeByte(unsigned char dat)135{136 unsigned int i;137 unsigned char j;139for(j = 0; j < 8; j++)140 {141 b = dat & 0x01;142 dat >>= 1;143//写"1", 将DQ拉低15us后, 在15us~60us内将DQ拉高, 即完成写1144if(b)145 {146 ds = 0;147 i++; i++; //拉低约16us, 符号要求15~60us内148 ds = 1;149 i = 8; while(i>0) i--; //延时约64us, 符合写时隙不低于60us要求150 }151else//写"0", 将DQ拉低60us~120us152 {153 ds = 0;154 i = 8; while(i>0) i--; //拉低约64us, 符号要求155 ds = 1;156 i++; i++; //整个写0时隙过程已经超过60us, 这里就不用像写1那样, 再延时64us了157 }158 }159}160161//向DS18B20发送温度转换命令162void sendChangeCmd()163{164 dsInit(); //初始化DS18B20, 无论什么命令, 首先都要发起初始化165 dsWait(); //等待DS18B20应答166 delayMs(1); //延时1ms, 因为DS18B20会拉低DQ 60~240us作为应答信号167 writeByte(0xcc); //写入跳过序列号命令字 Skip Rom168 writeByte(0x44); //写入温度转换命令字 Convert T169}170171//向DS18B20发送读取数据命令172void sendReadCmd()173{174 dsInit();175 dsWait();176 delayMs(1);177 writeByte(0xcc); //写入跳过序列号命令字 Skip Rom178 writeByte(0xbe); //写入读取数据令字 Read Scratchpad179}180181//获取当前温度值182int getTmpValue()183{184 unsigned int tmpvalue;185int value; //存放温度数值186float t;187 unsigned char low, high;188 sendReadCmd();189//连续读取两个字节数据190 low = readByte();191 high = readByte();192//将高低两个字节合成一个整形变量193 //计算机中对于负数是利用补码来表示的194 //若是负值, 读取出来的数值是用补码表示的, 可直接赋值给int型的value195 tmpvalue = high;196 tmpvalue <<= 8;197 tmpvalue |= low;198 value = tmpvalue;199200//使用DS18B20的默认分辨率12位, 精确度为0.0625度, 即读回数据的最低位代表0.0625度201 t = value * 0.0625;202//将它放大100倍, 使显示时可显示小数点后两位, 并对小数点后第三进行4舍5入203 //如t=11.0625, 进行计数后, 得到value = 1106, 即11.06 度204 //如t=-11.0625, 进行计数后, 得到value = -1106, 即-11.06 度205 value = t * 100 + (value > 0 ? 0.5 : -0.5); //大于0加0.5, 小于0减0.5206return value;207}208209void display(int v)210{211 unsigned char count;212 unsigned char datas[] = {0, 0, 0, 0, 0};213 unsigned int tmp = abs(v);214 datas[0] = tmp / 10000;215 datas[1] = tmp % 10000 / 1000;216 datas[2] = tmp % 1000 / 100;217 datas[3] = tmp % 100 / 10;218 datas[4] = tmp % 10;219 writeComm(0xc0+3);220if(v < 0)221 {222 writeString("- ", 2);223 }224else225 {226 writeString("+ ", 2);227 }228if(datas[0] != 0)229 {230 writeData('0'+datas[0]);231 }232for(count = 1; count != 5; count++)233 {234 writeData('0'+datas[count]);235if(count == 2)236 {237 writeData('.');238 }239 }240}241/*****************************DS18B20********************** *********/242243void main()244{245 uchar table[] = "Now Temperature:";246 sendChangeCmd();247 init(); 248 writeComm(0x80); 249 writeString(table, 16); 250 while (1) 251 { 252 delayMs(1000); //温度转换时间需要750ms 以上 253 writeComm(0xc0);254 display(getTmpValue());255 sendChangeCmd();256 } 257}OptionsDisableWhat is new with Snap Shots?1 23456789101112博客园首页新文章新随笔订阅管理posts - 101, comments - 110, trackbacks - 1单片机练习- DS18B20温度转换与显示最近都在学习和写单片机的程序, 今天有空又模仿DS18B20温度测量显示实验写了一个与DS18B20基于单总线通信的程序.DS18B20 数字温度传感器(参考:智能温度传感器DS18B20的原理与应用)是DALLAS 公司生产的1-Wire,即单总线器件,具有线路简单,体积小的特点。
实验1:1602LCD显示

实验1 1602型LCD显示一、实验目的:1. 了解Altera DE2-70多媒体开发板与PC(个人电脑)的正确连接;2. 掌握PC上安装的硬件设计环境Quartus II和应用程序设计环境Nios II;3. 初步了解IP核(硬件)模块的配置方法;4. 了解与此工程有关的顶层文件(.v);5. 掌握Nios II IDE的“hello world”软件工程模板;二、实验步骤:(一)初建工程:在PC上新建一个名为”demo_lcd”的工程鼠标左键双击桌面上的“Quartus II”快捷方式图标,耐心等待片刻,即可启动“Quartus II”设计页面,如图1-1所示。
图1-1在“Quartus II”设计页面内,鼠标左键单击“File -> New Project Wizard”。
弹出“New Project Wizard :introduction”。
如图1-2所示。
初次实验可以仔细阅读此页面内容,然后鼠标左键单击“next”按钮跳过此页,进入“New Project Wizard: Directory, Name, Top -level entity” 页面,如图1-3所示。
“the working directory for this project”(工程的工作目录)可以任意填写,例如:“E:/demo/demo_LCDdisplay”。
“工程的工作目录”如前“E:/demo/demo_LCDdisplay”,表示将会在E 盘上产生一个文件夹“demo”,在“demo”文件夹里产生另一个文件夹”demo_LCDdisplay”(工程文件夹,保存工程文件),此实验后续步骤中产生的各种文件会自动保存到路径“E:/demo/demo_LCDdisplay”下。
图1-2图1-3“the name of this project”(工程名字)填写为”demo_lcd”。
这里需要注意:由于“SOPC Builer”工具不能识别空格、中划线等符号,故实验所有步骤中如果需要命名,命名中不允许有空格、中划线出现,但“SOPC Builer”工具能识别下划线。
单片机1602显示程序

ORG 0000HAJMP STARTORG 0030H;液晶初始化START: MOV OUT,#01H;清屏LCALL WRMLMOV OUT,#38H;8为数据口,两行显示5*7点阵 LCALL WRMLMOV OUT,#06H;设置输入方式为光标向右移,屏幕上文字不移动LCALL WRMLMOV OUT,#0CH;设置显示方式,开显示屏LCALL WRML;第一行显示Hello!MOV OUT,#80H;设定第一行起始地址LCALL WRMLMOV R3,#80HMOV R4,#16MOV R5,#00HMOV DPTR,#TAB1WRIN1: LCALL DISPDJNZ R4,WRIN1;第二行逐字显示Nice to meet youMOV OUT,#0FH;设置显示方式,开显示屏,有光标,光标闪烁LCALL WRMLMOV OUT,#0C0H;设定第二行起始地址LCALL WRMLMOV R3,#0C0HMOV R4,#16MOV R5,#00HMOV DPTR,#TAB2WRIN2: LCALL DISPLCALL DELAYDJNZ R4,WRIN2MOV OUT,#08H;设置显示方式,关显示屏LCALL WRMLLCALL DELAYAJMP START;******************查表显示子程序******************DISP: PUSH AMOV A ,R5MOVC A,@A+DPTRMOV OUT,ALCALL WRDTINC R3INC R5POP ARET;*************判忙子程序************RDBF: MOV OUT,#0FFH;置位,准备读CLR RS;RS=0SETB RW ;R/W=1CLR ENOPSETB EJB OUT.7, RDBFRET;**************写命令子程序***************WRML: CLR RSCLR RWCLR ELCALL RDBFSETB ERET;*************写显示数据子程序*************WRDT: SETB RSCLR RW ;准备写入数据CLR E ;执行显示命令LCALL RDBF ;判断液晶模块是否忙?SETB ERET;*******************延时子程序*********** DELAY: MOV R6,#00HMOV R7,#00HDELAY1: NOPDJNZ R7,DELAY1DJNZ R6,DELAY1RETTAB1: DB 20H,20H,20H,20H,20H,48H,65H,6CH,6CH,6FH,21H ;Hello!DB 20H,20H,20H,20H,20HTAB2: DB 4EH,69H,63H,65H,20H,74H,6FH,20H,6DH,65H,65H ;Nice to meet youDB 74H,20H,79H,6FH,75HEND。
51单片机计算器1602显示程序

delay_jsq(5);
if(P2!=0xfb)
{
if(P2!=0xfb)
{
temp=P2&0xf0;
switch(temp)
{
case 0xe0:num=8;
break;
case 0xd0:num=9;
break;
case 0xb0:num=10;
break;
case 0x70:num=11;
case 0x70:num=7;
break;
}
}
while(P2!=0xfd);
if(j!=0)
{
write_lcd1602(0x01,0);
delay(1);
j=0;
}
if(num==4||num==5||num==6&&num!=7)//如果按下的是'4','5'或'6'
{
if(flag1==0)//没有按过符号键
break;
}
}
}
}
void main()
{
ini_lcd1602();
while(1)
{
keyscan_4_4();
}
}
write_lcd1602(0x06,0);
delay(1);
write_lcd1602(0x01,0);
delay(1);
num_1=0;
i=0;
j=0;
a=0; //第一个参与运算的数
b=0; //第二个参与运算的数
c=0;
flag1=0; //flag1表示是否有符号键按下,
fuhao=0; // fuhao表征按下的是哪个符号
单片机LCD1602显示字符和数字的汇编程序

单片机LCD1602显示字符和数字的汇编程序1,单片机和LCD1602的连线,和程序结果显示如下图:2,LCD第一行显示字符XIAORENGUANG第二行显示RAM中40H到46H中的数字。
程序如下:RS EQU P2.4RW EQU P2.5E EQU P2.6ORG 0000HAJMP MAINORG 0030HMAIN: MOV SP,#60HMOV 40H,#01HMOV 41H,#02HMOV 42H,#03HMOV 43H,#04HMOV 44H,#05HMOV 45H,#06HMOV 46H,#07HACALL DD1 ;DD1是LCD初始化MOV DPTR,#TABLE1ACALL DD2;DD2是LCD第一行显示TABLE1ACALL PPP ;PPP是LCD第二行显示RAM中40H到46H中的数据SJMP $DD1: MOV p0,#01H ;清屏CALL ENABLEMOV p0,#38H ;显示功能CALL ENABLEMOV p0,#0FH ;显示开关控制CALL ENABLEMOV p0,#06H ;显示光标右移加1CALL ENABLERETDD2: MOV p0,#80H;第一行的开始位置cALL ENABLECALL WRITE1;到TABLE1取码?RETENABLE: CLR RS ;送命令CLR RWCLR ECALL DELAYSETB ERETWRITE1: MOV R1,#00H ;显示table中的值A1: MOV A,R1;到table取码MOVC A,@A+DPTRcall wRITE2 ;显示到lcdINC R1CJNE A,#00H,A1 ;是否到00hRETWRITE2:MOV p0,A ;显示SETB RSCLR RWCLR ECALL DELAYSETB ERET(动态显示频率、幅度核心程序设计思想:可以利用如下程序)MOV40H,#01HMOV41H,#02HMOV42H,#03H)MOV R1,#40H;显示table中的值MOV A,R1;到table取码MOVC A,@A+DPTRMOV P0,AINC R1LJMP LOOPDELAY: PUSH ACCMOV A,R4MOV R4,#05D1: MOV R5,#0FFHDJNZ R5,$DJNZ R4,D1MOV R4,APOP ACCRETPPP: MOV p0,#0C0H;第二行的位置CALL ENABLEMOV DPTR,#TAB;显示CALL WRITE3;到TABLE2 取码RETWRITE3: MOV R1,#40H ;显示table中的值MOV R7,#07HA2: MOV A,@R1;到table取码MOVC A,@A+DPTRcall wRITE2 ;显示到lcdINC R1DJNZ R7,A2 ;是否到00hRETtable1: db"XIAORENGUANG ",00H TAB: DB 30H, 31H, 32H, 33HDB 34H, 35H, 36H, 37HDB 38H, 39HEND。
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的显示区域,来实现字符的显示。
【精选资料】1602液晶显示屏模块资料-附程序

BSET TIE,#%00000001;TC0开中断
MOVB #%10000000,TSCR1;开定时器,标志位正常清除
MOVW #125,TC0
;定时器使能,标志位正常清除
;***************液晶显示初始化************************
7脚~14脚D0~D7:数据总线;
15脚LED+:背景光源,接+5V;
16脚LED-:背景光源,接地。
1602液晶模块内部的字符发生存储器(CGROM)已经存储了不同的点阵字符图形,这些字符有,阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,其中数字与字母同ASCII码兼容。
ABC_1:FCB $44,$65,$73,$69,$67,$6e,$65,$72,$A0,$62,$79,$A0,$63,$68,$65,$6e
ABC_2:FCB $A0,$A0,$A0,$32,$30,$31,$31,$2e,$30,$37,$2e,$32,$35,$A0,$A0,$A0
;****************定时器中断子程序********************
4.开机初始化;
5.各个模块的开关:
(1)开启LCD模块;
(2)开启定时器模块;
(3)开中断;
6.主程序(空操作):
7.子程序:
(1)写入地址
(2)写入命令
(3)写入数据
(4)定时器中断
2.流程图:该程序就是一个单线条的,比较简单,在这里就不说了。
3.程序设计:
;********************SCI初始化****************************
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 液晶显示屏上是否正确显示预设的字符。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
const char web[ ]={' ','W','W','W','.','P','I','C','1','6','.','C','O','M',' ',' '};
//显示公司web地址
const char tel[ ]={'T','E','L','0','7','5','5','-','2','8','1','8','7','9','7','5'};
}
//--------------------------------------
//延时函数
void delay()
{
int i;
for(i=0;i<5000;i++);
}
lcd_enable();
PORTD=0X38; //8位2行5*7点阵
lcd_enable();
PORTD=0X0e; //显示开,光标开,闪烁
lcd_enable();
PORTD=0X06; //文字不动,光标右移
lcd_enable();
PORTD=0X80; //公司web显示地址
lcd_enable();
//显示公司电话号码
void init(); //申明I/O口初始化函数
void lcd_init(); //申明LCD初始化函数
void write_web(); //申明显示公司web地址函数
void write_tel(); //申明显示公司tel函数
void write(char x); //申明显示1字节数据函数
//写一个字节数据函数
void write(char x)
{
PORTD=x; //待显示数据送PORTD口
rs=1; //该字节数据为数据,而不是命令
rw=0; //此次操作为写,而不是读
e=0; //拉低使能信号
delay(); //保持使能信号为低一段时间
e=1; //拉高使能信号,建立LCD操作所需要的上升沿
}
//--------------------------------------
//显示公司web地址
void write_web()
{
int i;
for(i=0;i<0x10;i++) //一共16字节数据
{
write(web[i]); //查表获取数据并调用写一个字节数据函数送LCD显示
}
}
//--------------------------------------
write_web(); //调用显示公司web地址函数
PORTD=0XC0; //设置第2行显示地址
lcd_enable(); //调用LCD显示设置函数
write_); //调用显示公司tel函数
}
}
//---------------------------------------
//I/O口初始化函数
//LCD循环显示本站网址和电话
//硬件要求:LCD直接与单片机的A口和D口相连接
//所有拨码开关置OFF
#include<pic.h>
__CONFIG(0x1832);
//芯片配置字,看门狗关,(上电延时开)这个重要,掉电检测关,低压编程关,加密,4M晶体HS振荡
#define rs RB2
#define rw RB3
}
//--------------------------------------
//LCD显示设置函数
void lcd_enable()
{
rs=0; //该字节数据为命令,而不是数据
rw=0; //此次操作为写,而不是读
e=0; //拉低使能信号
delay(); //保持使能信号为低一段时间
e=1; //拉高使能信号,建立LCD操作所需要的上升沿
void init()
{
ADCON1=0X07; //设置A口为普通I/O口
TRISA=0X00; //设置A口为输出
TRISD=0X00; //设置D口为输出
}
//---------------------------------------
//LCD初始化函数
void lcd_init()
{
PORTD=0X1; //清除显示
//显示公司tel函数
void write_tel()
{
int i;
for(i=0;i<0x10;i++) //一共显示16字节数据
{
write(tel[i]); //查表获取数据并调用写一个字节数据函数送LCD显示
}
}
//--------------------------------------
void lcd_enable(); //申明LCD显示设置函数
void delay(); //申明延时函数
//---------------------------------------
//主函数
void main()
{
while(1)
{
init(); //调用I/O口初始化函数
lcd_init(); //调用LCD初始化函数