多路智能温度测控系统设计_课程设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
电子技术课程设计题目:多路智能温度测控系统设计
学院计算机与通信工程学院
专业通信工程
学号20081672
姓名
指导老师
2011年5 月
目录
摘要 ....................................................... 3 关键字 ..................................................... 3 前言 . (3)
一. Proteus 内容简介 ................ 二、设计目地 .................... 三、设计内容 ....................
四、 ............................... D S18B20简介 五、 ............................... 单片机简介 六、 ................................ 基本设计原理 七、设计步骤 .................... 八、 Proteus 设计图 11
九、 Proteus 仿真调试 ................ 十、软件设计 ....................
结语总结 (14)
参考文献 (14)
附录 1 (15)
3 4 4 4 9 9 10
11 13
摘要:
本文介绍了数字温度传感器DS18B20 测温地基本原理以及基于DS18B20 地多点温度测量系统地设计过程,包括软件设计和硬件设计两大部分.软件部分给出了软件设计思想及
软件流程图,硬件部分给出了单片机、测温电路、显示电路设计.单片机使用AT89C52 单片机,温度传感器使用美国DALLAS 公司最新推出地DS18B20 数字式温度传感器,显示模块采用LCD 显示.基于DS18B2O 地多点测温系统在实际中应用广泛,测温系统简单、测温精度高、连接方便、占用口线少、转换速度快、给硬件电路设计工作带来极大地方便并且缩短了开发周期.
关键词:DS18B20 多点温度测量单片机Proteus 仿真
、八—
前言
随着电子技术地快速发展,我们生活中地方方面面几乎都充斥着电子产品,我们也无时无刻不享受着电子技术带给我们地便利.作为电子专业地大学生,我们应当在享受电子生
活带给我们地便捷地同时,应该更多地理解与思考电子产品地设计过程,并能在已有地集成芯片和单片机等微控制器地基础上,自己动手亲身体验电子设计地过程,以便于将课本上地理论实践化,做到学以致用,更好地掌握单片机等元器件地应用,锻炼独立解决问题地能力.本课程设计题目是基于DS18B20 地多路智能温度测控系统设计,主要介绍了DS18B20 地工作过程和原理,以及基于它地系统设计.
在这个设计里,根据要求设计了两个DS18B20 与单片机之间地单端口通信,可以推广
到多个DS18B20.通过学习了解掌握了Proteus原理图设计及仿真方法,熟悉Keil开发环境.
在设计过程中参考或引用了《基于PROTEUS 地电路及单片机系统设计与仿真》,
DS18B20 数据手册等参考资料以及网络上地相关资料.在此,向这些技术资料地作者表示感谢.
由于设计者地学识水平有限,加之时间仓促,作品不够完善,不足之处在所难免,敬请老师指导和改正.
Proteus内容简介
Proteus 软件是英国Labcenter electronics 公司出版地EDA 工具软件.它不仅具有其它
EDA 工具软件地仿真功能,还能仿真单片机及外围器件.它是目前最好地仿真单片机及外围
器件地工具.Proteus 从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB 设计,真正实现了从概念到产品地完整设计.是目前世界上唯一将电路仿真软件、PCB 设计软件和虚拟模型仿真软件三合一地设计平台,其处理器模型支持8051、HC11、
PIC10/12/16/18/24/30/DSPIC33、AVR、ARM、8086、MSP430、Cortex 和DSP 系列处理器. 它是能进行模拟电路、数字电路、模数混合电路、RS232 动态仿真、I2C 调试器、SPI 调试器、键盘和LCD 、LED 系统地设计与仿真地平台.ProteuS 具备原理图设计、电路分析与仿真、PCB 设计功能,可以通过调入程序地编译结果. hex 或. cof 文件来调试单片机程序,还可
直接嵌入到Microchip 公司地单片机调试软件MPLAB IDE 中,进行程序地调试和仿真.
二、设计目地
1 、掌握单片机基本编程技术及外围电路地搭建
2、熟练掌握DS18B20 地基本操作并了解其工作原理
3、熟练掌握Proteus原理图设计及仿真
三、设计内容
1 、单片机最小系统设计
2、D S18B20 与单片机地单口通信设计
3、P roteus 原理图地绘制与仿真
4、单片机程序编写
四、DS1 20 简介
DS18B20数字温度计是DALLAS 公司生产地1-Wire,即单总线器件,具有线路简单,
体积小地特点.因此用它来组成一个测温系统,可以节约硬件资源,而且使用较为方便.
DS18B20 产品地特点
(1 )只要求一个端口即可实现通信.
(2 )在DS18B20中地每个器件上都有独一无二地序列号
(3)实际应用中不需要外部任何元器件即可实现测温•
(4)测量温度范围在—55 °C到+ 125 °之间.
(5)数字温度计地分辨率用户可以从9位到12位选择.
(6)内部有温度上、下限告警设置•
DS18B20地引脚介绍
TO-92封装地DS18B20地引脚排列见下图
序号名称弓1脚功能描述
1GM)地馆号
■
敷据输入/输出别脚.幵漏单总缓接口引蛆・当被用着在寄生电源下,也可以
向器件提供电源.
3VDD可选择H VDD引㈱’当工作子寄主电源时.此引,梵必须接地’
DS18B20地使用方法
由于DS18B20采用地是1 —Wire总线协议方式,即在一根数据线实现数据地双向传
输,而对AT89S51单片机来说,硬件上并不支持单总线协议,因此,我们必须采用软件地
方法来模拟单总线地协议时序来完成对DS18B20芯片地访问
由于DS18B20是在一根I/O线上读写数据,因此,对读写地数据位有着严格地时序要
求.DS18B20有严格地通信协议来保证各位数据传输地正确性和完整性•该协议定义了几种信号地时序:初始化时序、读时序、写时序•所有时序都是将主机作为主设备,单总线器件
作为从设备•而每一次命令和数据地传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收•数据和命令地传输都是低位在先•
DQ
(底视图)
(此图为以下时序图地图例)
UNE TYPE LEGEND
DS18B20地复位时序
DS18B20地读时序
对于DS18B20地读时序分为读 0时序和读1时序两个过程•对于DS18B20地读时隙是从 主机把单总线拉低之后,在
15us 之内释放单总线,以让
DS18B20把数据传输到单总线
上.DS18B20进行一个读时序过程,至少需要 60us 才能完成•(下图左边为读 “0”序,右边
为读“1时序)
DS18B20地写时序
对于DS18B20地写时序仍然分为写 0时序和写1时序两个过程 对于DS18B20写0时序
和写1时序地要求不同,当要写
0时序时,单总线要被拉低至少
60us ,保证DS18B20能够
在15us 到45us 之间能够正确地采样 10总线上地“0电平,当要写1时序时,单总线被拉 低之后,在15us 之内就得释放单总线•(下图左边为读 “ 0时序,右边为读 “ 1”序)
Bus master active low
■ ■ ■ ■ Both bus master and
DS18S20 active low
DS18S20 active low
________ Resistor pull-up
1-WRE
BUS
:
--- 15-SQ
I ___ L
r
Master T K "resat
pulEe" 4SD |is
mlnmuim
GND
DS1SS2a TX i
WBt9 | Master R K -----
480 ininmLini
DS1SS2QTX
Mailer Write
啊” Slot &0 2 <T (
"O " < 120 |A
DS1SS20 SAMPLES MIN
TYP MAX
单片机检测到 DS18B20地存在,即可向其发送 ROM 操作命令 指令代码
Write Scratchpad (写暂存存储器i [4EH] Read Scratchpadt 读暂存存储器)
[13EI1]
Copy Scraichpadt k 制哲存存储器)[48H] Convert 1 cmpcrawrcl S 度变换) [44111 Recall 匸PROM (重新调出)
[B8H]
Read Power supply (读电源}
[B4H]
每一片 DS18B20在其ROM 中都存有其唯一地 64位序列号,在出厂前已写入片内
ROM 中,主机在进入操作程序前必须逐一接入
18B20用读ROM ( 33H )命令将该 18B20
地序列号读出并登陆•
当主机需要对众多在线 18B20进行操作是,首先要发出匹配 ROM 命令(55H )之后 地操作就是针对该
18B20地•而所谓跳过 ROM 命令即为:之后地操作是对所有 18B20地框 图中先有跳过 ROM ,即是启动所有 18B20进行温度变换之后,通过匹配 ROM 再逐一地读 回每个18B20地温度数据•
在18B20组成地测温系统中,主机在发出跳过
ROM 命令之后,再发出统一地温度转
换启动码44H 就可以实现所有 18B20地统一转换,再经过 1s 后,就可以用很少地时间去 逐一读取•
64-bit ROM 数据结构图:
Master Write 'V Slot
1WIRE
BUS
GND
国F is 萨 較4 佃"一H<f"轴呼 f
指令
代码
Read ROM (读 ROM ) [33H] Match ROM (匹配 ROM ) [5511] Skip ROM (跳过 ROM]
[CCH]
Search RO\1(搜索 ROM ) [FOI 【] Alann scare h (告警搜索) [匚QI]
MSB
8-BIT CRC CODE
4S-B1T SERIAL NUMBER
K BIT FAMILY CODE (IOh )
LSB MSB
LSB MSB LSB
低8位为产品类型编码(DS18B20均为10h ),中间48位为每个器件唯一地序号,高
8位为CRC (循环冗余校验)码.
转换示例
*The power on reset register value is *85°C
五、单片机简介
单片机是一种集成在电路芯片,是采用超大规模集成电路技术把具有数据处理能力地
中央处理器CPU 随机存储器RAM 、只读存储器 ROM 、多种I/O 口和中断系统、定时器/计 时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、
A/D 转换器等
DS18B20中有用于存储测得地温度值地两个
号存储器存放温度值地符号,如果温度为负,则 8位RAM 存储器,编号为 0号到1号.1
1号存储器8位全为1,否则全为0.0号存
储器用于存放温度值地补码, LSB (最低位)地 “1表示0.5摄氏度•将存储器中地二进制数 求补再转化成十进制数并处以
2就得到被测温度值( -55摄氏度一125摄氏度)
LSB
MSB
温度/数据转换关系
电路)集成到一块硅片上构成地一个小而完善地计算机系统•单片微型计算机简称单片机,
是典型地嵌入式微控制器( Microco ntroller Un it),常用英文字母地缩写MCU表示单片
机,它最早是被用在工业控制领域•
六、基本设计原理
单片机在本设计中充当了重要地角色,是整个温度测控系统地核心,作为控制中心而
存在,与本设计中地另一个重要部分DS18B20进行数据通信并控制LCD液晶屏显示输
出,完成了整个多点温度地测控任务,DS18B20、AT89C52单片机、LCD液晶屏构成了整
个多点温度测控系统•本设计共采用了2片DS18B20芯片并接于P1.1 口采用AT89C52作为控制中心与DS18B20完成单口通信,读取DS18B20采集地温度信息,并经过处理交由
1602LCD显示•本设计出于只阐述说明原理考虑只使用了2片DS18B20芯片,并外接了一
个开关用于这2片芯片温度数据之间地切换•系统框图如下所示.
系统框图
七、设计步骤
1 查阅DS18B20芯片datashee t 熟悉其工作原理 2、 在Proteus 环境下绘制系统原理图 3、 在Keil 开发环境下编写程序 4、 将程序导入Proteus 下仿真 5、 根据仿真结果改写程序 6、 撰写设计报告
八、Proteus 设计图
开开关显示4ST 的温度■-闭合开关显示2ND 的温度1 -
说明:左下角为两个 DS18B20芯片,DQ 端同接于 AT89C52地P1.1 口,右上角为
1602LCD ,P3.3 口接开关,通过它地开关切换两片 DS18B20之间地温度显示
I 基壬DS 佃B20 I
多点温度测控仿真图Y
IB3I
•
• GH#
Lew
P inrrz F I.IJTSV
FU
P2 P1.+
KlIVAtD Ffl.ttAtl FOJFA1Z
R3HAJO
pg.iyut*
呵
円
仔
FClJtfAVS K1.TAA17
PZ^13 FZa*AU fZJfAif 静
nnxD
Fl.WTXp FlJfflEJ FlJfflE
■35
Ts
-
■ID riTT
1ST
■x r
e • QMV
P^BI
九、Proteus仿真调试
在Proteus中使用多个DS18B20时,必须改变器件地属性,使仿真中地每个器件序列
号各不相同•具体做法:右击DS18B20,选中Edit Properties选项,在其中改变ROM Serial Number地值(在该对话框下还可以改变Granularity地数值,即改变每次调整温度地额度)
在Proteus中,可以人为改变3个字节地器件序列号•要想得到全部8个字节,一个简单地方法就是每一次总线上只连接一个器件,利用0x33读器件序列号地命令在程序中得到完整
地器件序列号•
将测试序列号地程序烧入Proteus下AT89C51中,程序中定义通信端口为P1.1只需将DS18B20依次与单片机连接即可.并在运行中点击菜单项debug,选中watch window,按
alt+A,即出现图1所示对话框,在Name项中输入a,在Address项中输入0x08,点击
add,在Watch Window窗口中即可看到序列号低八位地值.然后依次输入0x09 —0x0f,再点击done键,即可获得所有64位序列号.所得序列号如图2所示(本设计共用了两个
DS18B20).
测试程序详见附录1
程序中包含向DS18B20发送一个字节,读取一个字节,以及DS18B20地初始化等子程序.
Memory: 18051 CPU Internal (IDATA) Merrexy - U1
Name: [a
血Add le&ory Ite>
Data Type:
ASCIIZ String
♦
Word (2 bytm対
Double Word |4 bybes) / Qu^dWord (S bytes] C IEEE Float (4 bvtes) / IEEE Double
Hitech Float (3 bytes)
Microchip Float [4 bytes)
Display Format:
” Binary
C Octal
Hexadecimal
Signed Integer
Unsigned
Address :
十、软件设计
1、软件流程图
2、关键模块说明
本程序由主函数 ma in .c 、头文件ds18b20.h 、lcd1602.h (为便于调用特将其编为.h 文
Name
Addres s
val ue a □xoe 0X2& a 3X09 0X30 a oxoa 0XC5 a oxob 0XB8 a
□xoc oxoo a axod OXQO a axoe 0x00 a
axof
OxBE
―
<
>
Name
Addres s
val ue
a 0X08 0X2& a □X OS 0X31 a axoa 0XC5 a axoL OXB& a
□xoc oxoo a axod □xoo
a □XOE 0X00 a
axof
0X89
I<I|L
丄
>
主程序流程图
DS18B20读取温度流程图
件)三部分组成
主函数main.c 中处理了由DS18B20 采集地温度信息并交由1602LCD 显示,并设置了一个开关,当打开开关显示1ST地温度,闭合开关显示2ND地温度.
ds18b20.h 是DS18B20 地驱动程序,包含了DS18B20 地初始化函数、读写一个字节地函数、匹配ROM 函数、温度读取函数.
Lcd1602.h是1602LCD地驱动程序,包含了LCD初始化等程序,使用时只需在主程序中调用GotoXY() 函数即可让LCD1602 显示字母数字等信息.
具体程序见附录2.
结语总结
在本次课程设计中,我对于芯片地学习能力有了一定了提高,对于初次接触地DS18B20 芯片能通过阅读它地数据手册了解其使用方法,并付诸于软件编程思想.在设计中碰到了一些困难,如在实现多个DS18B20 地单总线通信时,遇到了编程上地瓶颈,接着又在Proteus 仿真中遇到了不会读取DS18B20 地序列号地困难,幸而被一一克服,才得以完成本设计最终地仿真实现.第一次亲自动手编写此类较为冗长地程序,将所学地 C 语言运用到实际,才发现实践总是高于理论地,在实际应用中总会出现困难.在完成本设计后,本人感
觉工程设计能力有较大地提升,培养了系统地思维能力,总之得到了很好地锻炼.
参考文献
1、唐颖. 单片机原理与应用及C51 程序设计.北京:北京大学出版社,2008
2、周润景.张丽娜.基于Proteus 地电路及单片机系统设计与仿真.北京:北京航空航天大学出
版社,2006
附录1
DS18B20 ROM 系列号测试程序
#include<reg52.h>
sbit DQ = P1A1 o //定义通信端口
unsigned char a[8] 。
//延时程序
void delay_18B20(unsigned int i)
{
while(i--) o
}
//初始化函数Init_DS18B20(void)
{
unsigned char x=0 o
DQ = 1 o //DQ 复位
delay_18B20(4) o //稍做延时
DQ = 0 o //单片机将DQ拉低
delay_18B20(100) o //精确延时大于480us
DQ = 1o //拉高总线
delay_18B20(40) o
}
//读一个字节ReadOneChar(void)
{
unsigned char i=0o unsigned char dat = 0o for (i=8 o i>0o i--) {
DQ = 0o // 给脉冲信号
dat>>=1 o
DQ = 1 。
// 给脉冲信号if(DQ) dat|=0x80 。
delay_18B20(10) 。
}
return(dat) 。
}
//写一个字节
WriteOneChar(unsigned char dat)
{
unsigned char i=0 。
for (i=8 。
i>0 。
i--)
{
DQ = 0 。
DQ = dat&0x01 。
delay_18B20(10) 。
DQ = 1 。
dat>>=1 。
}
}
void main(void)
{ unsigned char i 。
Init_DS18B20() 。
WriteOneChar(0x33) 。
for(i=0 。
i<8。
i++)
a[i]=ReadOneChar() 。
//将Rom 序列号存入a[] 中
附录2
主程序
1、main.c
#include<reg52.h>
#include<ds18b20.h> #include<lcd1602.h> unsigned char TempBuffer[6] 。
sbit k=P3A0。
void delay(unsigned int i)
{
while(i--) 。
}
void main(void)
{
unsigned int temp。
Init_DS18B20() 。
delay(5000)。
while(1)
{ if(k==1) //打开开关显示1ST DS18B20
{temp = ReadTemperature(1) 。
if(flag_Negative_number)TempBuffer[0]='-' 。
else TempBuffer[0]='+' 。
TempBuffer[1]=temp/1000+'0' 。
// 百位数TempBuffer[2]=temp%1000/100+'0' 。
//十位数TempBuffer[3]=temp%100/10+'0' 。
//个位数TempBuffer[5]=temp%10+'0' 。
//小数位
TempBuffer[4]='.' 。
//小数点
LCD_Initial() 。
GotoXY(0,0) 。
Print(" 1st DS18B20") 。
GotoXY(0,1) 。
Print("temp:") 。
GotoXY(5,1) 。
Print(&TempBuffer[0]) 。
GotoXY(11,1) 。
Print(" cent") 。
delay(50000) 。
}
else //闭合开关显示2ND DS18B20
{
temp = ReadTemperature(2) 。
if(flag_Negative_number)TempBuffer[0]='-' 。
else TempBuffer[0]='+' 。
TempBuffer[1]=temp/1000+'0' 。
// 百位数
TempBuffer[2]=temp%1000/100+'0' 。
//十位数
TempBuffer[3]=temp%100/10+'0' 。
//个位数
TempBuffer[5]=temp%10+'0' 。
// 小数位
TempBuffer[4]='.' 。
// 小数点。
LCD_Initial() 。
GotoXY(0,0) 。
Print(" 2nd DS18B20") 。
GotoXY(0,1) 。
Print("temp:") 。
GotoXY(5,1) 。
Print(&TempBuffer[0]) 。
GotoXY(11,1) 。
Print(" cent") 。
delay(50000) 。
}
}
}
2、ds18b20.h
#ifndef __DS18B20_H__
#define __DS18B20_H__
sbit DQ = P1A1 o //定义通信端口
unsigned char flag_Negative_number = 0 。
//负数标志
unsigned char code str1[]={0x28,0x30,0xc5,0xb8,0x00,0x00,0x00,0x8e} o unsigned char code str2[]={0x28,0x31,0xc5,0xb8,0x00,0x00,0x00,0xb9} o //晶振11.0592MHz
void delay_18B20(unsigned int i)
{
while(i--) o
//初始化函数
Init_DS18B20(void)
{
unsigned char x=0 。
DQ = 1 。
//DQ 复位
delay_18B20(4) 。
// 稍做延时DQ = 0。
//单片机将DQ 拉低
delay_18B20(100) 。
// 精确延时大于480us DQ = 1 。
// 拉高总线
delay_18B20(40) 。
}
//读一个字节
ReadOneChar(void)
{
unsigned char i=0 。
unsigned char dat = 0。
for (i=8。
i>0。
i--)
{
DQ = 0 。
// 给脉冲信号dat>>=1 。
DQ = 1 。
// 给脉冲信号
if(DQ) dat|=0x80。
delay_18B20(10) 。
} return(dat) 。
}
//写一个字节
WriteOneChar(unsigned char dat)
{ unsigned char i=0 。
for (i=8 。
i>0 。
i--)
{
DQ = 0 。
DQ = dat&0x01 。
delay_18B20(10) 。
DQ = 1 。
dat>>=1 。
}
}
//匹配ROM
MatchRom(unsigned char a)
{
char j 。
WriteOneChar(0x55) 。
//发送匹配ROM 命令if(a==1)
{
for(j=0 。
j<8。
j++)
WriteOneChar(str1[j]) 。
//发送18B20 地序列号,先发送低字节} if(a==2) {
for(j=0 。
j<8。
j++)
WriteOneChar(str2[j]) 。
//发送18B20 地序列号,先发送低字节}
}
//读取温度
ReadTemperature(unsigned char z) {
unsigned char a=0。
unsigned char b=0 。
unsigned int t=0 。
Init_DS18B20() 。
WriteOneChar(0xCC) 。
Init_DS18B20() 。
if(z==1) {
MatchRom(1) 。
}
if(z==2) {//跳过读序号列号地操作//匹配ROM 1
MatchRom(2) 。
}
//匹配ROM 2
WriteOneChar(0x44) 。
//* 启动温度转换*/ delay_18B20(5) 。
Init_DS18B20() 。
WriteOneChar(0xcc) 。
//读序列号Init_DS18B20() 。
if(z==1)
{
MatchRom(1) 。
//匹配ROM 1
}
if(z==2)
{
WriteOneChar(0xBE) 。
// 读取温度寄存器等(共可读 9 个寄存器) 前两个就是温度 a=ReadOneChar()。
b=ReadOneChar()。
//启动下一次温度转换
Init_DS18B20() 。
WriteOneChar(0xCC) 。
// 跳过读序号列号地操作
WriteOneChar(0x44) 。
// 启动温度转换
t=b 。
t<<=8 。
t=t|a 。
flag_Negative_number = 0 。
if(t>0x0fff)
{
t=~t+1 。
flag_Negative_number = 0xff 。
}
t=t*0.625 。
//有效位到小数点后 2 位 return(t) 。
} #endif 3、lcd1602.h
#ifndef LCD_CHAR_1602_2005_4_9
#define LCD_CHAR_1602_2005_4_9
#include <intrins.h> //Port definitions
sbit LcdRs = P2A 0O
sbit LcdRw
=卩2人1。
sbit LcdEn
= P2A2。
sfr DBPort = 0x80。
//内部等待函数 unsigned char LCD_Wait(void) {
LcdRs=0。
LcdRw=1 。
_nop_() 。
LcdEn=1 。
_nop_() 。
//while(DBPort&0x80) 。
// 在 用 Proteus 仿 真 时 , 注 意 用 屏 蔽 此 语 句 ,
在 调 用 GotoXY() 时,会进入死循环,
// 可能在写该控制字时,该模块没有返回写 入
完备命令,即 DBPort&0x80==0x80
// 实际硬件时打开此语句
LcdEn=0 。
return DBPort 。
}
//向 LCD 写入命令或数据
#define LCD_COMMAND
0 // Command #define LCD_DATA
1 // Data
#define LCD_CLEAR_SCREEN 0x01 // 清屏 MatchRom(2) 。
}
//匹配 ROM 2 //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0. 数据端口
#define LCD_HOMING 0x02 // 光标返回原点void LCD_Write(bit style, unsigned char input)
{
LcdEn=0 。
LcdRs=style 。
LcdRw=0 。
_ nop_() 。
DBPort=input 。
_nop_() 。
//注意顺序
LcdEn=1 。
_ nop_() 。
//注意顺序
LcdEn=0 。
_ nop_() 。
LCD_Wait() 。
}
//设置显示模式
#define LCD_SHOW 0x04 // 显示开#define LCD_HIDE 0x00 // 显示关
#define LCD_CURSOR 0x02 //显示光标#define LCD_NO_CURSOR 0x00 // 无光标
#define LCD_FLASH 0x01 // 光标闪动#define LCD_NO_FLASH 0x00 // 光标不闪
void LCD_SetDisplay(unsigned char DisplayMode) { LCD_Write(LCD_COMMAND, 0x08|DisplayMode)
void LCD_SetInput(unsigned char InputMode) {
LCD_Write(LCD_COMMAND, 0x04|InputMode)
} //初始化 LCD void LCD_Initial() {
LcdEn=0 。
LCD_Write(LCD_COMMAND,0x38) 。
//8 位数据端口 ,2 行显示 ,5*7 点阵 LCD_Write(LCD_COMMAND,0x38) 。
LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR) 。
//开启显示 , 无光标 LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN) 。
// 清屏 LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE) 。
//AC 递增, 画面不动 } //******************************************************* void GotoXY(unsigned char x, unsigned char y)
{
if(y==0)
LCD_Write(LCD_COMMAND,0x80|x) 。
if(y==1)
LCD_Write(LCD_COMMAND,0x80|(x-0x40)) 。
}
void Print(unsigned char *str)
{
while(*str!='\0')
{
LCD_Write(LCD_DATA,*str) 。
str++ 。
}
}
#endif //设置输入模式
#define LCD_AC_UP
#define LCD_AC_DOWN
#define LCD_MOVE
#define LCD_NO_MOVE
0x02 0x00 // default 0x01 // 画面可平移 0x00 //default。