单片机LCD1602显示AD转换值

单片机LCD1602显示AD转换值
单片机LCD1602显示AD转换值

目录

1.硬件设计任务

1.1设计题目 (2)

1.2设计背景及发展 (2)

1.3设计内容 (2)

1.3.1设计内容 (2)

1.3.2设计目的 (2)

1.4 使用说明 (2)

2.设计原理

2.1基本原理 (3)

3.设计步骤

3.1硬件设计 (3)

3.1.1 确定所用的硬件 (3)

3.1.2 熟悉所用的硬件 (3)

(1) 8051单片机

(2) 74LS138

(3) ADC0809

(4) 8255A

(5)1602LCD

3.1.3 硬件框图 (9)

3.1.4 最小系统图 (10)

(1)连线说明

(2)配套地址

3.2 软件设计 (11)

3.2.1 流程框图 (12)

3.2.2 程序清单 (16)

3.3 调试过程与结果 (21)

3.3.1 调试过程 (21)

3.3.2 调试结果 (21)

4. 设计心得

4.1 设计心得 (22)

5. 参考文献

5.1 参考文献出处 (22)

1.硬件设计任务

1.1设计题目

LCD显示设计(显示A/D转换值)

1.2设计背景

液晶显示器,简称LCD(Liquid Crystal Display)。世界上第一台液晶显示设备出现在20世纪70年代初,被称之为TN-LCD(扭曲向列)液晶显示器。尽管是单色显示,它仍被推广到了电子表、计算器等领域。80年代,STN-LCD(超扭曲向列)液晶显示器出现,同时TFT-LCD(薄膜晶体管)液晶显示器技术被研发出来,但液晶技术仍未成熟,难以普及。80年代末90年代初,日本掌握了STN-LCD及TFT-LCD 生产技术,LCD工业开始高速发展。

LCD发展过程:1888~1968年为液晶材料性能和应用研究时期。1973~1985年为TN-LCD获得广泛应用时期。1985~1993年为STN-LCD推广应用时期。

1993~2000年是TFT-LCD大发展时期,这个时期TFT-LCD的性能已可以与CRT 媲美。LCD发展大大扩展了显示器的应用范围,使个人使用移动型手持显示器成为可能,因此,2000年以后将进入LCD与CRT争夺显示器主流市场的时代。

LCD主要技术发展过程:彩色低功耗反射型LCD技术。低温多晶硅(P-Si)LCD 大生产技术。大尺寸、宽视角、高分辨彩色TFT-LCD的发展。1993年以前主要生产的是10.4英寸以下,640×480像素的产品;1993~1997年主要生产的是10英寸~13英寸,1024×768像素的产品;1997~1999年主要生产15英寸~18英寸,1024×768和以上像素的产品;1999年以后开始生产20英寸~30英寸的产品。1998年以后开始大力开发高分辨率、大屏幕液晶投影电视。2008年人们更重视液晶电视的美观和厚度,Sony品牌电视现在26寸以下的最薄可以做到22毫米了,世界最薄的哦!

1.3设计内容及目标

1.3.1设计内容

(1)编制程序,在点阵液晶显示器上显示自己的名字,并可移动;

(2)编制程序,用键A启动A/D转换,并在字符液晶显示器上显示A/D转换值。

(3)用数字键选择转换通道并显示通道号。

1.3.2设计目的

了解液晶显示图形的基本方法,从而对其他液晶屏的使用也能得心应手。

1.4 使用说明

实验一共有8个控制键,用于选择A/D转换通道口。

载入程序,LCD第一行滚动显示名字:TANG YUN TAO;

按键0~7按下后,LCD第二行显示对应的通道口转换后的数字量。

2.设计原理

2.1 基本原理

使用汇编语言进行程序编写,确保程序正确后,打开实验箱上的电源,将程序下载到实验箱上,1602LCD上首先显示滚动的名字,滚动到中间即停止下来,接着按下键盘上的A键开始启动A/D转换,当按下键盘上0到7键中任意一键则要切换对应的A/D转换通道,通过不断改变旋钮改变模拟量值的大小并不断把转换好的值与此时转换通道号送到1602LCD并显示。整个系统以单片机为主题,通过软件控制将0809、8255、1602LCD这些芯片联系在一起,实现所要求的功能。

3. 设计步骤

3.1 硬件设计

3.1.1确定所用的硬件

设计中所用到的硬件主要有8051单片机,74LS138三八译码器,ADC0809A/D 转换器,可编程并行I/O扩展接口8255A,键盘以及1602LCD。

3.1.2熟悉所用的硬件

(1)8051单片机有四十个引脚,按照引脚功能可分为电源引脚VCC与VSS;

外接晶振引脚XTAL1与XTAL2;控制和复位引脚ALE,PSEN,EA,RST;

32个I/O引脚,其中P2与P0作为地址总线,P2作为地址线的高8位,P0

作为地址线的低八位,P0还作为数据总线负责传出或传入数据,P1为用户

自定义I/O引脚,P3主要作为控制总线,包括了串行输入与输出端,外部中

断0,1触发端,定时器0,1外部脉冲计数端,允许读写信号端。图(3—1)

为8051单片机的引脚图。

8051单片机内部有4KB的程序存储器,地址范围为0000H到0FFF 当EA引脚为高电平时,程序存储空间的0000H到0FFFH在单片机内部,

1000H到FFFFH在单片机外部;8051单片机内部有128B的数据存储器,

地址范围为00H到7FH。

8051单片机内部地址范围从80H到FFH为特殊功能寄存区,单片机的输入输出端口,计数器/定时器,串行通信口,累加器以及一些控制寄存器等

都在这个地址空间。

8051单片机有5个中断源,分别为外部中断0,外部中断1,时钟中断0,时钟中断1和串行通信中断,这些中断分为两个优先级,每个中断源的优先

级都是可编程的。

8051单片机有两个16位定时/计数器,通过编程可以实现4中工作方式RAM开设了4个通用工作寄存区,共32个通用寄存器,以适应多种中断或子

程序嵌套的使用。

8051单片机有一个功能齐全的指令系统。包括加、减、乘、除等算术运算

指令,逻辑运算指令,位操作指令,数据传送指令及多种程序转移指令。

图3—1 8051单片机引脚图

(2)74LS138主要是用作片选信号,其A,B,C,E1,E2,E3六个引脚可与单片机P0.3,P0.4,P0.5,P0.6,P0.7,P2.7相连,E1,E2,E3为它的使能信号,通过对A,B,C不同的赋值使其选中那八根线中一根线,A,B,C有000到111不同的八种组合,也正好对应了那八根线。图(3—2)为74LS138引脚图。

图(3—2)74LS138引脚图

图3—2 74LS138引脚图

(3)ADC0809A/D是8路8位逐次逼近式A/D,每一个通道转换时间需要66到73个时钟脉冲,约100US。ADC0809是由多路模拟开关,通道地址锁存与译码器,8位A/D转换器以及三态输出数据锁存器等组成。图(3—3)(3—4)为ADC0809的引脚图和逻辑框图。

ADC0809转换过程一般为先将任意一数写入需要转换的通道的地址启动该通道开始转换,当转换完成后EOC引脚会有一个信号传给单片机,如果EOC 此时连接的是单片机控制口P3.2即外部中断0的触发口,则程序中会自动跳入外部中断0的中断程序,中断程序主要便是将所转换好的A/D值传给单片机,这样完成了一次A/D转换。

图3—3 ADC0809引脚图

图3—4 ADC0809逻辑框图

(4)8255A是INTEL公司的一种通用的可编程并行接口电路,在单片机应用系统中被广泛用于可编程外部I/O扩展接口。它主要由四个逻辑结构组成,包括数据总线驱动器,3个并行I/O口A,B,C,读写控制逻辑,A组B组控制块。图(3 —5)为8255A引脚图。

8255A在扫描键盘时必须先要往控制口写入控制方式字确定A,B,C是输入方式还是输出方式。C口地两位作为输出扫描线,B口作为输入口,A口随意,当没有键按下时,B口所输入的值为0FFH,当有键按下时B口就不等于0FFH,通过这种方式确定有无键按下,在通过计算B口值哪位为0确定是哪个键按下。图(3—6)为8255A与键盘连接图。

图3—5 8255A引脚图

图3—6 8255A与键盘连接图

(5)1062LCD主要用来显示一些简单的字符,如字母与数字,当显示复杂的字符如汉字效果则不那么好。1602LCD引脚主要有RW,RS,E以及8位数据口,图(3—7)为1602LCD的引脚图。

图(3—8)(3—9)为LCD1602的四个时序图:当要读取LCD的状态时RW=1,RS=0,E=1;当要读取LCD的数据时RW=1,RS=1,E=1;当要向LCD中写入指令时RW=0,RS=0,E=1,随后E跳变为0;当要向LCD中写入数据时RW=0,RS=1,E=1,随后E跳变为0。1602LCD液晶本身自带字符发生器,所以要写入一个字符只需知道它在字符发生器中的编号,一般都为该字符的ASCII码,图(3—10)为1602LCD字符对照表。此外1602LCD还有8个用户自定义字符区域,从00H到07H,00H对应范围是40H到47H,01H对应的是48H到55H,以此类推,07H对应的是78H到7FH,用户可往这些区域里写入字模,要用时直接调用00H到07H便可。

图3—7 1602LCD引脚图

图3—8 1602LCD读数据与读状态时序

图3—9 1602LCD写数据与写指令时序

图3—10 1602LCD 字符对照表

3.1.3 硬件框图

图3—11 系统框图

说明:当程序载入进行仿真时,LCD 显示器第一行就会滚动出现名字;名字移

动到中间后停止;当检测有键按下时,就会将所按下键的键值通过8255A 的数 据线传给单片机,然后由单片机启动相应A/D 转换通道,通过0809的作用,将 此通道通过的模拟量转化成数字量,A/D 转换完成后将转换后的数字量通过数 据总线送回单片机,然后再由单片机将数字量送到LCD 并显示。

显示器

并口

键盘

8051单片机

A/D 转换 模拟量

3.1.4 最小系统图

图3—12 硬件原理图

(1)连线说明

数据总线 :由P0口直接提供8位数据总线,与LCD1602、8255A和0809的D0—D7 相连,进行单片机与外设之间的数据传递。

地址总线:P0口经8位地址锁存器后形成低8位地址总线A0—A7,高8位地址

P2口直接提供。A3、A4、A5、A6、A7接38译码器形成片选

信号,A15接E1。A0、A1同时接1602LCD的RS、RW,8255的A0、A1

进行LCD 读写控制和8255控制端口的选择。通过38译码器的Y0、Y1、

Y2分别接0809、8255和1062LCD的片选端。

控制总线:P3.2接0809的EOC端口。P3.6(写选通)、P3.7(读选通)分别同时接0809的ALE、OE端和1602LCD的读、写端。

(2)配套地址

表a ADC0809转换通道地址

A/D通道IN0 IN1 IN2 IN3 IN4 IN5 IN6 IN7

地址范围

最小地址8000H 8001H 8002H 8003H 8004H 8005H 8006H 8007H

最大地址FF00H FF01H FF02H FF03H FF04H FF05H FF06H FF07H

表b 8255A各口地址

8255A并口A口B口C口控制口

地址范围

最小地址8008H 8009H 800AH 800BH

最大地址FF0CH FF0DH FF0EH FF0FH

表c l602LCD操作地址

LCD操作读状态写数据写指令

地址范围

最小地址8012H 8011H 8010H

最大地址FF16H FF15H FF14H

3.2 软件设计

3.2.1流程框图

开始

使用定时器0与1

MOV TMOD,#11H

初始化定时器0与1,

各自定时50ms

外部中断0中断设为

电平跳变方式

SETB IT0

给R2变量赋值#79H

开总中断,允许定时器

1中断,开启定时器1 N

TR1是否为0

Y

给R3变量赋值#0

允许定时器0中断,开

启定时器0

向8255A控制口地址

写入#82H

向8255AC口地址写

入#02H

读取8255AB口地址的

值并赋值与A

Y

A是否为#0FFH

N

延迟消抖

读取8255AB口地址的

值并赋值与A

Y

A是否为#0FFH

N

给R3变量赋值#0

RRC A

R3加1

N

C是否为0

Y

图3—13 主程序图

说明:主程序主要首先等待完成LCD第一行滚动显示,然后就是键盘扫描,当有键按下,R3会记录有关信息,从而控制通道选择。

图3—14 定时器1的中端程序

说明:定时器1的中断入口地址为001BH ,该中断程序就是为了实现在LCD 上滚动显示自己的名字 。

将R4的值赋给A 查表

往LCD 中写入A

R3值减1 R4值加1

R3是否为#79H

初始化定时器1

Y

选择LCD 的R3地址

LCD 清屏

R2是否为8EH

Y

N

R2加1

Y R4是否为#12

是否满0.5S

关闭定时器1 CLR TR1

返回

N

N

N

Y

中断入口

R2的值赋给R3 R4变量赋值#0

DPTR 赋TABLE 的地址

中断入口

N

是个满200MS

Y

R3是否为0

Y

N

将A/D转换通道0的地址赋给

DPTR

R3减1

DPTR加R3

启动A/D转换

N

IE0是否为1

Y

清除IE0

CLR IE0

读取A/D转换值

在LCD第二行顺序显示IN与通

道号以及冒号与A/D转换值

初始化定时器0

返回

图3—15 定时器0的中断程序

说明:定时器0的中断入口地址为000BH,该中断程序每200MS扫描R3的值,启动相应的A/D转换通道,将值在LCD上显示。

3.2.2 程序清单

ORG 0000H

AJMP MAIN

ORG 000BH /定时器0的中断程序入口地址

LJMP ITOP1

ORG 001BH /定时器1的中断程序入口地址

AJMP ITOP2

MAIN: MOV TMOD,#11H /定时器0,1都选择方式1即16位计数方式MOV TH0,#3CH /定时器0选择定时50ms

MOV TL0,#0B0H

MOV TH1,#3CH /定时器1选择定时50ms

MOV TL1,#0B0H

SETB IT0 /设置外部中断0的中断方式为电平跳变方式

MOV R0,#4

MOV R1,#40H /从这里到sjmp loop1是对1602LCD写入‘:’字模

MOV R2,#00H

LOOP1:CJNE R1,#48H,LOOP2

SJMP LOOP3

LOOP2:MOV A,R1

LCALL LCDSELECT

MOV A,R2

MOV DPTR,#TABLE1

MOVC A,@A+DPTR

LCALL LCDWRITE

INC R1

INC R2

SJMP LOOP1

LOOP3:MOV A,#38H /对LCD初始化操作,LCD使用之前必须先进行初始化LCALL LCDSELECT

MOV A,#0CH

LCALL LCDSELECT

MOV A,#06H

LCALL LCDSELECT

MOV A,#01H

LCALL LCDSELECT

MOV R1,#10 /延长定时时间为0.5s

MOV R2,#79H

SETB EA /开总中断

SETB ET1 /允许定时器1中断

SETB TR1 /开启定时器1

LOOP21:MOV C,TR1 /判断定时器1是否还开启

JC LOOP21

MOV R3,#00H

MOV DPTR,#0F00BH /8255控制口地址

MOV A,#82H

MOVX @DPTR,A /选择C口为输出口,B口为输入口

SETB ET0 /允许定时器0中断

SETB TR0 /开启定时器0

LOOP4:MOV DPTR,#0F00AH /8255C口的地址

MOV A,#02H

MOVX @DPTR,A /使8255C口的最低位为0

MOV DPTR,#0F009H /8255B口的地址

MOVX A,@DPTR /读取8255B口的值

CJNE A,#0FFH,LOOP5 /B口值不等于0FFH时转移

SJMP LOOP4 /继续扫描

LOOP5:LCALL DELAY /延迟消斗

MOV DPTR,#0F009H

MOVX A,@DPTR /再次读取B口值

CJNE A,#0FFH,LOOP6 /若还是不等则表明确实有键按下

SJMP LOOP4 /若不等则返回继续扫描

LOOP6:MOV R3,#00H /R3初始值为0

LCALL KEY

SJMP LOOP4

KEY: /KEY函数是判断读取值第几位为0从而判断是哪个键按下RRC A

INC R3 /存储在R3中

JNC LOOP7

SJMP KEY

LOOP7: RET /返回扫描程序

DELAY:MOV R5,#39H /延迟子程序

LOOP8:MOV R6,#00H

LOOP9:DJNZ R6,LOOP9

DJNZ R5,LOOP8

RET

LCDBUSY: /1602LCD忙信号判断

PUSH ACC

MOV DPTR,#0F012H /读1602LCD地址

LOOP10: MOVX A,@DPTR

ANL A,#80H

CJNE A,#80H,LOOP11 /若读取值的最高位为1则表示LCD忙,等待直到

最高位为0则跳转

SJMP LOOP10

LOOP11: LCALL DELAY /延迟一会

POP ACC

RET /子程序返回

LCDSELECT:

LCALL LCDBUSY /判断LCD是否忙,不忙继续执行

MOV DPTR,#0F010H /选择LCD所要写入数值的地址的地址

MOVX @DPTR,A /选择地址

RET /子程序返回

LCDWRITE:

LCALL LCDBUSY /判断LCD是否忙,不忙继续执行

MOV DPTR,#0F011H /往LCD中写入数值的地址

MOVX @DPTR,A /所要写入的数值

RET

ITOP1:

PUSH ACC /将A以及地址压入堆栈

PUSH DPH

PUSH DPL

DJNZ R0,LOOP17 /等到200ms后执行

MOV R0,#4 /初始化R0

CJNE R3,#00H,LOOP12 /R3如为0则表示没有键按下,返回

SJMP LOOP17

LOOP12: MOV A,R3

DEC A /将A值减一方与键值对应

MOV DPTR,#0F000H /将ADC0809通道0的地址给DPTR,

ADD A,DPL /加上A的偏移量即是所要启动转换的通到地址

MOV DPL,A

MOVX @DPTR,A /启动相应通道的A/D转换

LOOP13: MOV C,IE0 /判断外部中断0的中断标志是否为1,不为1则

等待,表明还没有转换好

JNC LOOP13

CLR IE0 /清除外部中断标志位

MOVX A,@DPTR /读取A/D转换值

MOV R4,A /将转换好的值存于R4中

MOV A,#0C0H /LCD的第二行开始地址

LCALL LCDSELECT /选中这个开始地址

MOV A,#73 /字母I的ascii码

LCALL LCDWRITE /往LCD第二行首地址写入字母I

MOV A,#78 /字母N的ascii码

LCALL LCDWRITE /往LCD第二行下一个地址写入字母N

MOV A,R3 /R3减一即为A/D转换通道号

DEC A

ADD A,#48 /得到该数在机器中的ascii码

LCALL LCDWRITE /往LCD第二行下一个地址写入对应A/D转换

通道号

MOV A,#00H /00H即开始往LCD中写入的用户自定义字模:

LCALL LCDWRITE /往LCD第二行下一个地址写入符号‘:‘

MOV A,R4 /将存储在R4中A/D转换值赋给A

ANL A,#0F0H /取得这个A/D转换值的高四位

SW AP A /将A中高四位与低四位交换位置

CLR C

SUBB A,#10 /判断此时A中的数值是否大于10,因为0到9

与a到f转换成ascii码所需的偏移量不一样JC LOOP14 /C为1时说明A中的数值比a小即数值在0到9之间

MOV A,R4 /没有跳转表明A中的数值在a到f之间,由于A中数

值已经变化所以要重新从R4中获得A/D转换值ANL A,#0F0H

SW AP A /重新得到A/D转换值的高四位并与低四位交换位置

ADD A,#55 /A中的值是在a到f之间,转换成相应的ascii码需

要加上偏移量55

LCALL LCDWRITE /选中LCD第二行下一个地址写A/D转换值的高四位

SJMP LOOP15 /准备写入A/D转换值的低四位

LOOP14: CLR C /清零C,此时表明A中的数值是0到9之间的MOV A,R4 /A中值被破坏,重新获得A/D转换值

ANL A,#0F0H

SW AP A /重新得到A/D转换值的高四位并与低四位交换位置

ADD A,#48 /由于A中的值是在0到9之间,所以转换成相应的

ascii码需要加上偏移量48

LCALL LCDWRITE /选中LCD第二行下一个地址写入A/D转换值的高

四位

LOOP15: MOV A,R4 /以下是写入A/D转换值的低四位,同理ANL A,#0FH

SUBB A,#10

JC LOOP16

MOV A,R4

ANL A,#0FH

ADD A,#55

LCALL LCDWRITE

SJMP LOOP17

LOOP16: CLR C

MOV A,R4

ANL A,#0FH

ADD A,#48

LCALL LCDWRITE

LOOP17: POP DPL

POP DPH

POP ACC /出堆栈

MOV TH0,#3CH /重新装入计数初值

MOV TL0,#0B0H

RETI

ITOP2: /此段代码即是实现名字在LCD上滚动的效果DJNZ R1,LOOP19 /是否到1s时间

MOV R1,#10 /给R1重新赋初值

INC R2

MOV R4,#00H

CJNE R2,#8CH,LOOP18

CLR ET1 /关定时器1中断

CLR TR1 /关闭定时器1

SJMP LOOP20

LOOP18: MOV A,#01H /清屏

LCALL LCDSELECT

MOV R3,R2

LOOP23:MOV A,R3

LCALL LCDSELECT

MOV A,R4

MOV DPTR,#TABLE2

MOVC A,@A+DPTR

LCALL LCDWRITE

DEC R3

INC R4

CJNE R3,#79H,LOOP22

SJMP LOOP19

LOOP22:CJNE R4,#8,LOOP23

SJMP LOOP19

LOOP19:MOV TL1,#0B0H

MOV TH1,#3CH

LOOP20:RETI

TABLE1:DB 00H,00H,10H,10H,00H,10H,10H,00H /即是符号‘:’的字模TABLE2:DB 4FH,41H,54H,20H,4EH,55H,59H,20H,47H,4EH,41H,54H/OA T NUY GNA T的ascii码(中间有空格)

END

LCD1602汇编显示程序

;1602显示ABC LCD_RS EQU P2.5 LCD_RW EQU P2.6 LCD_EN EQU P2.7 LCD_DATA EQU P3 ;----------------- ORG0000H JMP START ORG0030H ;----------------- LCD: CALL LCD_INIT MOV A, #80H CALL LCD_WCMD MOV A, #'A' CALL LCD_WDATA MOV A, #'B' CALL LCD_WDATA MOV A, #'C' CALL LCD_WDATA AJMP$ ;---------------- DELAY5MS: MOV R6, #10 DL1:DJNZ R7, $ DJNZ R6, DL1 RET ;---------------- LCD_INIT: CALL DELAY5MS MOV A, #38H CALL LCD_WCMD CALL DELAY5MS

CALL DELAY5MS MOV A, #06H CALL LCD_WCMD MOV A, #01H CALL LCD_WCMD MOV A, #0CH CALL LCD_WCMD RET ;===================================== LCD_WCMD: CALL CHECKBUSY CLR LCD_RS JMP W_LCD ;---------------- LCD_WDATA: CALL CHECKBUSY SETB LCD_RS W_LCD: CLR LCD_RW MOV LCD_DATA, A SETB LCD_EN NOP CLR LCD_EN RET ;---------------- CHECKBUSY: PUSH ACC MOV LCD_DATA, #255 CLR LCD_RS SETB LCD_RW BUSYLOOP: SETB LCD_EN NOP MOV A, LCD_DATA CLR LCD_EN JB ACC.7, BUSYLOOP POP ACC RET

lcd1602按键显示程序

#include<> #include<> //包含_nop_()函数定义的头文件 typedef unsigned int uint ; typedef unsigned char uchar ; sbit RS=P2^0; //寄存器选择位,将RS位定义为引脚 sbit RW=P2^1; //读写选择位,将RW位定义为引脚 sbit E=P2^2; //使能信号位,将E位定义为引脚 sbit BF=P0^7; //忙碌标志位,,将BF位定义为引脚 " uchar keyscan(); void delay1ms(); void delay(unsigned char n); unsigned char BusyTest(void); void WriteInstruction (unsigned char dictate); void WriteAddress(unsigned char x); … void WriteData(unsigned char y); void LcdInitiate(void); void delay1ms() { unsigned char i,j; for(i=0;i<10;i++) for(j=0;j<33;j++); } ! void delay(unsigned char n) { unsigned char i; for(i=0;i

lcd1602显示程序

lcd1602显示程序 液晶显示简介①液晶显示原理 液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。液晶显示器具有厚度薄、适用于大规模集成电路直接驱动、易于实现全彩色显示的特点,目前已经被广泛应用在便携式电脑、数字摄像机、PDA移动通信工具等众多领域。 ②液晶显示器的分类 液晶显示的分类方法有很多种,通常可按其显示方式分为段式、字符式、点阵式等。除了黑白显示外,液晶显示器还有多灰度有彩色显示等。如果根据驱动方式来分,可以分为静态驱动(StaTIc)、单纯矩阵驱动(Simple Matrix)和主动矩阵驱动(AcTIve Matrix)三种。 ③液晶显示器各种图形的显示原理: 线段的显示 点阵图形式液晶由MN个显示单元组成,假设LCD显示屏有64行,每行有128列,每8列对应1字节的8位,即每行由16字节,共168=128个点组成,屏上6416个显示单元与显示RAM区1024字节相对应,每一字节的内容和显示屏上相应位置的亮暗对应。例如屏的第一行的亮暗由RAM区的000H00FH的16字节的内容决定,当(000H)=FFH时,则屏幕的左上角显示一条短亮线,长度为8个点;当(3FFH)=FFH时,则屏幕的右下角显示一条短亮线;当(000H)=FFH,(001H)=00H,(002H)=00H,(00EH)=00H,(00FH)=00H时,则在屏幕的顶部显示一条由8段亮线和8条暗线组成的虚线。这就是LCD显示的基本原理。 字符的显示 用LCD显示一个字符时比较复杂,因为一个字符由68或88点阵组成,既要找到和显示屏幕上某几个位置对应的显示RAM区的8字节,还要使每字节的不同位为1,其它的为0,为1的点亮,为0的不亮。这样一来就组成某个字符。但由于内带字符发生器的控制器来说,显示字符就比较简单了,可以让控制器工作在文本方式,根据在LCD上开始显

已经采用过-LCD1602显示字符和(RAM)数字的汇编程序

单片机LCD1602显示字符和数字的汇编程序(无聊原创) 1,单片机和LCD1602的连线,和程序结果显示如下图: 2,LCD第一行显示字符XIAORENGUANG第二行显示RAM中40H到46H中的数字。程序如下: ORG 0000H AJMP MAIN RS EQU P2.4 RW EQU P2.5 E EQU P2.6 MAIN: MOV SP,#60H MOV 40H,#01H MOV 41H,#02H MOV 42H,#03H MOV 43H,#04H MOV 44H,#05H MOV 45H,#06H MOV 46H,#07H ACALL DD1 ;DD1是LCD初始化

MOV DPTR,#TABLE1 ACALL DD2;DD2是LCD第一行显示TABLE1 ACALL PPP ;PPP是LCD第二行显示RAM中40H到46H中的数据 SJMP $ DD1: MOV p0,#01H ;清屏 CALL ENABLE MOV p0,#38H ;显示功能 CALL ENABLE MOV p0,#0FH ;显示开关控制 CALL ENABLE MOV p0,#06H ;+1 CALL ENABLE RET DD2: MOV p0,#80H;第一行的开始位置 cALL ENABLE CALL WRITE1;到TABLE1取码? RET DD3: MOV p0,#0C0H;第二行的位置 CALL ENABLE CALL WRITE1;到TABLE2 取码 RET ENABLE: CLR RS ;送命令 CLR RW CLR E CALL DELAY SETB E RET WRITE1: MOV R1,#00H ;显示table中的值 A1: MOV A,R1;到table取码 MOVC A,@A+DPTR call wRITE2 ;显示到lcd INC R1 CJNE A,#00H,A1 ;是否到00h RET WRITE2:MOV p0,A ;显示 SETB RS CLR RW CLR E CALL DELAY SETB E RET

lcd1602液晶封装函数

//端口定义 #define DBPort P0 //LCD数据端口 sbit LcdRs = P2^0; sbit LcdRw = P2^1; sbit LcdEn = P2^2; sbit Lcdbf = P0^7; //LCD忙标志Busy Flag void delay(unsigned int t) //延时 { while(t--); } void LCD_Wait(void) //读忙状态 { LcdRs=0; LcdRw=1; LcdEn=1;delay(10);LcdEn=0; //下降沿 while(Lcdbf) { LcdEn=0;LcdEn=1; //仿真才需要此语句,实际硬件中不需要} } void LCD_Write(bit style, unsigned char input) //写数据1/命令0 { LcdRs=style; LcdRw=0; DBPort=input; LcdEn=1;delay(10);LcdEn=0; LCD_Wait(); } void LCD_Initial(void) //初始化LCD { LCD_Write(0,0x38); //8位数据端口,2行显示,5*7点阵 delay(300); LCD_Write(0,0x0c); //显示模式 LCD_Write(0,0x01); //清屏 LCD_Write(0,0x06); //输入模式 } void GotoXY(unsigned char x, unsigned char y) //移动光标到指定位置{ if(y==0) LCD_Write(0,0x80|x);

1602液晶显示计算器电路图及程序

#include #include #include #include unsigned char code Error[]={"error"}; unsigned char code Systemerror[]={"system error"}; unsigned char code Lcd[]={"lcd calculate"}; char str[16]; sbit RS=P2^0; sbit RW=P2^1; sbit E=P2^2; sbit BF=P0^7; /*********************** 函数功能:延时1ms ***********************/ void delay1ms() { unsigned char i,j; for (i=0;i<10;i++) for (j=0;j<33;j++) ; } /************************ 函数功能:延时n毫秒 入口参数:n ************************/ void delaynms(unsigned char n) { unsigned char i; for (i=0;i

51单片机控制1602LCD显示程序

LCD显示电路 #include 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 #include //包含_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

/***************************************************** 函数功能:判断液晶模块的忙碌状态 返回值: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; //将忙碌标志电平赋给result E=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发生正跳变,所以应先置"0" _nop_(); _nop_(); //空操作两个机器周期,给硬件反应时间 Lcd_Data=dictate; //将数据送入P0口,即写入指令或地址 _nop_(); _nop_(); _nop_(); _nop_(); //空操作四个机器周期,给硬件反应时间 E=1; //E置高电平 _nop_(); _nop_(); _nop_(); _nop_(); //空操作四个机器周期,给硬件反应时间 E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令} /***************************************************** 函数功能:指定字符显示的实际地址 入口参数:x

LCD1602显示屏地驱动设置及例程

LCD1602显示屏的驱动设置及例程 一般来说,LCD1602有16条引脚,据说还有14条引脚的,与16脚的相比缺少了背光电源A(15脚)和地线K(16脚)。我手里这块LCD1602的型号是HJ1602A,是绘晶科 技公司的产品,它有16条引脚。如图1所示: 图1 再来一张它的背面的,如图2所示: 引脚号符号引脚说明引脚号符号引脚说明 1 VSS 电源地9 D 2 数据端口 2 VDD 电源正极10 D 3 数据端口 3 VO 偏压信号11 D 4 数据端口 4 RS 命令/数据12 D 5 数据端口 5 RW 读/写13 D 6 数据端口 6 E 使能14 D 7 数据端口 7 D0 数据端口15 A 背光正极

图3

图4 二.基本操作 LCD1602的基本操作分为四种: 1. 读状态:输入RS=0,RW=1,E=高脉冲。输出:D0—D7为状态字。 2. 读数据:输入RS=1,RW=1,E=高脉冲。输出:D0—D7为数据。 3. 写命令:输入RS=0,RW=0,E=高脉冲。输出:无。 4. 写数据:输入RS=1,RW=0,E=高脉冲。输出:无。 读操作时序图(如图5): 图5 写操作时序图(如图6):

图6 时序时间参数(如图7): 图7 三.DDRAM、CGROM和CGRAM DDRAM(Display Data RAM)就是显示数据RAM,用来寄存待显示的字符代码。共80个字节,其地址和屏幕的对应关系如下(如图8): 图8 DDRAM相当于计算机的显存,我们为了在屏幕上显示字符,就把字符代码送入显存,这样该字符就可以显示在屏幕上了。同样LCD1602共有80个字节的显存,即DDRAM。但L CD1602的显示屏幕只有16×2大小,因此,并不是所有写入DDRAM的字符代码都能在屏幕上显示出来,只有写在上图所示范围内的字符才可以显示出来,写在范围外的字符不

LM1602液晶显示程序

#include #define uchar unsigned char #define uint unsigned int unsigned char code tab1[16]=" Now time is: "; unsigned char tab2[16]=" 00:00:00 "; uchar second = 30; uchar minite = 11; uchar hour = 15; sbit RS = P2^5; sbit RW = P2^6; sbit E = P2^7; void delay() { int i,j; for(i=0; i<=100; i++) for(j=0; j<=20; j++); } void Write_Command(uchar command) { P0 = command; RS = 0; RW = 0; E = 1; delay(); E = 0; } void Write_Data(uchar Data) { P0 = Data; RS = 1; RW = 0; E = 1; delay(); E = 0; } void LCD_Init(void)//初始化 { Write_Command(0x01); Write_Command(0x38);

Write_Command(0x0c); Write_Command(0x06); } void LCD_Printfc(uchar hang,uchar lie,uchar sign) { uchar a; if(hang == 1) a = 0x80; if(hang == 2) a = 0xc0; a = a + lie; Write_Command(a); Write_Data(sign); } void LCD_Display(uchar *tab1) { uchar i; Write_Command(0x80); for(i=0; i<16; i++) { Write_Data(tab1[i]); delay(); } /* Write_Command(0xc0); for(i=0; i<16; i++) { Write_Data(tab2[i]); delay(); }*/ } void time_view(void) { if(second == 60) { minite ++; second = 0; } if(minite == 60) { hour++; minite = 0; } if(hour == 24)

LCD1602-51单片机汇编程序

1602汇编程序,51单片机汇编程序,仅需修改引脚定义即可。晶振大小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 ALL_FLAG.7 ;1602读忙标志位 LCD_DAT EQU 30H ;1602数据命令字 DELAYED EQU 31H ;延时字 /***************************************** 1602读命令函数,高位存至LCD_LAG中 *****************************************/ LCD_R_DATA: MOV LCD_DATA,#0FFH LCD_BUSY: CLR LCD_RS SETB L CD_RW NOP SETB L CD_EN NOP MOV Acc,LCD_DATA MOV C,Acc.7 MOV LCD_FLAG,C CLR LCD_EN NOP JB LCD_FLAG,LCD_BUSY RET /***************************************** 1602写数据函数,数据存在LCD_DAT *****************************************/ LCD_W_DATA: LCALL LCD_R_DATA SETB L CD_RS CLR LCD_RW NOP MOV LCD_DATA,LCD_DAT

单片机LCD1602 C语言程序

#include unsigned char code tab1[16]=" Now time is: "; unsigned char tab2[16]=" 00:00:00 "; unsigned char second = 0,minite=0,hour=0; /*设置管脚*/ sbit RS = P1^0; //sbit RS = P3^5 ; sbit RW = P1^1; sbit E = P1^2; sbit Beep = P3^4; /*LCD1602控制指令*/ // #define a b ==> a=b #define LCD_Set 0x38 // 0011 1000 显示初始化,16*2显示,5*7点阵,8位数据接口; #define LCD_Clear 0x01 // 0000 0001 清屏LCD ; #define LCD_Display1 0x0f // 0000 1111 显示功能设置:开显示,显示光标,光标闪烁; #define LCD_Display2 0x0c // 0000 1100 显示功能设置:开显示,不显示光标,光标不闪烁; #define LCD_Mode 0x06 // 0000 0110 设置光标状态默认0x06,为读一个字符光标加1 ; #define LCD_1_Left 0x80 //设置初始化数据指针,指向左半屏第一行首位; #define LCD_2_Left (0x80+0x40) //设置初始化数据指针,指向左半屏第二行首位; /*液晶1602 毫秒延时*/ void delay_ms(unsigned int ms) { unsigned int i,j; for(i=0;i

LCD1602液晶显示实验实验报告及程序

实验三 LCD1602液晶显示实验 姓名专业学号成绩 实验目的 掌握Keil C51软件与proteus软件联合仿真调试的方法; 掌握LCD1602液晶模块显示西文的原理及使用方法; 掌握用8位数据模式驱动LCM1602液晶的C语言编程方法; 掌握用LCM1602液晶模块显示数字的C语言编程方法。 实验仪器与设备 1.微机一台C51集成开发环境仿真软件 实验内容 用Proteus设计一LCD1602液晶显示接口电路。要求利用P0口接LCD1602液晶的数据端,~做LCD1602液晶的控制信号输入端。~口扩展3个功能键K1~K3。参考电路见后面。 编写程序,实现字符的静态和动态显示。显示字符为 第一行:“1.姓名全拼”,第二行:“2.专业全拼+学号”。 编写程序,利用功能键实现字符的垂直滚动和水平滚动等效果显示。显示字符为: “1.姓名全拼 2.专业全拼+学号EXP8 DISPLAY ” 主程序静态显示“My information!” 实验原理 液晶显示的原理:采用的LCD显示屏都是由不同部分组成的分层结构,位于最后面的一层是由荧光物质组成的可以发射光线的背光层,背光层发出的光线在穿过第一层偏振过滤层之后进入包含成千上万水晶液滴的液晶层,液晶层中的水晶液滴都被包含在细小的单元格结构中,一个或多个单元格构成屏幕上的一个像素。当LCD中的电极产生电场时,液晶分子就会产生扭曲,从而将穿越其中的光线进行有规则的折射,然后经过第二层过滤层的过滤在屏幕上显示出来。 LCD1602采用标准的14引脚(无背光)或16引脚(带背光)接口,各引脚接口说明如表:

编号符号引脚说明编号符号引脚说明 1VSS电源地9D2数据 2VDD电源正极10D3数据 3VL液晶显示偏压11D4数据 4RS数据/命令选择12D5数据 5R/W读/写选择13D6数据 6E使能信号14D7数据 7D0数据15BLA背光源正极 8D1数据16BLK背光源负极1602液晶模块内部的控制器共有11条控制指令,如表所示: 芯片时序表: 4.1602LCD的一般初始化(复位)过程

LCD1602字符测试显示程序与仿真

#include "reg51.h" #include "intrins.h" #define uchar unsigned char #define uint unsigned int uchar 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)

LCD1602的电路图和程序

MS 基于1602字符型液晶显示器的显示系统 姓名:杨越 班级:电子11-1 学号:110400104

一、实习目的 (1)了解飞思卡尔单片机的基本原理,掌握其基本的工作流程。 (2)了解LCD1602的基本原理及用法。 (3)能够熟练使用CodeWarrior软件编写C语言程序,使用BDM仿真器下载 程序。 (4)能够熟练焊接电路板。 二、实验设备与器件 CodeWarrior软件,BDM仿真器,万用电路板,飞思卡尔单片机,LCD1602液晶显示器, 三、实验内容 内容:利用飞思卡尔单片机制作基于1602字符液晶显示器的显示系统 要求:用四个按键控制,按下第一个按键显示1,按下第二个按键显示2,以此类推。 (1)LCD1602液晶显示器的原理:1602共16个管脚,但是编程用到的主要管脚不过三个,分别为:RS(数据命令选择端),R/W(读写选择端),E(使能信号); 以后编程便主要围绕这三个管脚展开进行初始化,写命令,写数据。 以下具体阐述这三个管脚: RS为寄存器选择,高电平选择数据寄存器,低电平选择指令寄存器。 R/W为读写选择,高电平进行读操作,低电平进行写操作。 E端为使能端,后面和时序联系在一起。 除此外,D0~D7分别为8位双向数据线。 操作时序:

注:关于E=H脉冲——开始时初始化E为0,然后置E为1,再清0. 读取状态字时,注意D7位,D7=1,禁止读写操作;D7=0,允许读写操作; 所以对控制器每次进行读写操作前,必须进行读写检测。(即后面的读忙子程序) 指令集: LCD_1602 初始化指令小结: 0x38 设置16*2显示,5*7点阵,8位数据接口 0x01 清屏 0x0F 开显示,显示光标,光标闪烁 0x08 只开显示 0x0e 开显示,显示光标,光标不闪烁 0x0c 开显示,不显示光标 0x06 地址加1,当写入数据的时候光标右移 0x02 地址计数器AC=0;(此时地址为0x80)光标归原点,但是DDRAM中断内容不变 0x18 光标和显示一起向左移动 (2)飞思卡尔单片机的功能及特点:MC9S12XS128是 16 位单片机,由 16 位中央处理单元(CPU12X)、128KB 程序、Flash(P-lash)、8KB RAM、8KB 数据Flash(D-lash)组成片内存储器。主要功能模块包括:内部存储器,内部 PLL 锁相环模块,2 个异步串口通讯 SCI ,1个串行外设接口 SPI MSCAN 模块,1 个8 通道输入/输出比较定时器模块 TIM ,周期中断定时器模块 PIT ,16 通道 A/D 转换模块 ADC ,1 个 8 通道脉冲宽度调制模块 PWM ,输入/输出数字 I/O 口。

【51单片机】温度传感器DS18B20程序-LCD1602显示

仿真截图: //仿真文件网盘地址: //程序: #include #include #define uchar unsigned char #define uint unsigned int sbit P00 = P0^0; sbit P01 = P0^1; sbit P02 = P0^2; sbit P03 = P0^3; sbit P04 = P0^4; sbit P05 = P0^5; sbit P06 = P0^6; sbit P07 = P0^7; sbit P10 = P1^0; sbit P11 = P1^1; sbit P12 = P1^2; sbit P13 = P1^3; sbit P14 = P1^4;

sbit P15 = P1^5; sbit P16 = P1^6; sbit P17 = P1^7; sbit P20 = P2^0; sbit P21 = P2^1; sbit P22 = P2^2; sbit P23 = P2^3; sbit P24 = P2^4; sbit P25 = P2^5; sbit P26 = P2^6; sbit P27 = P2^7; sbit P30 = P3^0; sbit P31 = P3^1; sbit P32 = P3^2; sbit P33 = P3^3; sbit P34 = P3^4; sbit P35 = P3^5; sbit P36 = P3^6; sbit P37 = P3^7; //****** DS18B20 ****** #define DQ P17 /*************精确延时函数*****************/ void delay10us(void) //误差0us { unsigned char a,b; for(b=1;b>0;b--) for(a=2;a>0;a--); } void delay20us(void) //误差0us { unsigned char a,b; for(b=1;b>0;b--) for(a=7;a>0;a--); } void delay30us() //误差0us { unsigned char a,b; for(b=3;b>0;b--) for(a=3;a>0;a--); }

DHT11温湿度传感器51单片机在LCD1602显示程序

//51单片机控制温湿度传感器DHT11LCD1602 YL-9最小系统。 # include # include typedef unsigned char BYTE; typedef unsigned int WORD; #define uint unsigned int #define uchar unsigned char sbit io=P1^0;//dht11data端接单片机的P1^0口// sbit rw=P2^1;//一下三行是设置lcd1602的使能端// sbit rs=P2^0; sbit ep=P2^2; typedef bit BOOL;//此声明一个布尔型变量即真或假// uchar data_byte; uchar RH,RL,TH,TL;

//***************延时函数************************************* void delay(uchar ms) //延时模块// { uchar i; while(ms--) for(i=0;i<100;i++); } void delay1()//一个for循环大概需要81us 12MHz8us

{ uchar i; for(i=0;i<1;i++); } //*************************************************************** //lcd模块// BOOL lcd_bz()//测试lcd'1'.'0' { BOOL result; rs=0; // 读忙信号 rw=1;

基于51单片机的1602液晶显示温度和时间的C程序

//液晶显示温度 #include "AT89X52.H" #define Ddata P0 sbit RS=P2^7; //命令数据控制端 sbit RW=P2^6; //读写选择端 sbit LCDE=P2^5; //液晶使能端 sbit DQ=P2^0; //ds18b20与单片机连接口 #define uchar unsigned char #define uint unsigned int unsigned 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

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=0 RW=0 **********// { LCDE=0; //使能端 RS=0; //********RS寄存器选择输入端,当RS=0;当进行写模块操作,指向指令寄存器。 RW=0; //********当RS=1,无论是读操作还是写操作,都是指向数据寄存器。LCDE=1; Ddata=comm; RS=0; RW=0; LCDE=0;

51单片机 1602显示程序 C语言

/****************************************************************************** ** * 描述: LCD1602 滚动显示* * 显示方式:* * 1、从左到右逐字显示,闪动二次,清屏。* * 2、再从右到左逐字显示,闪动二次,清屏。* * 3、周期性地重复上述显示方式。* ******************************************************************************* */ #include #include 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[] = {" https://www.360docs.net/doc/a810004400.html, "}; 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;

LCD1602显示全部字库字符

LCD1602显示全部字库字符、看门狗定时器测试 LCD1602液晶内含有192个字符字库,这个程序是分6屏进行显示,整个显示过程长约7秒,看门狗定时器设置时间为8.38秒,刚好显示完全部字符,修改看门狗就可以看到在显示中途重启,比较直观 LCD_E BIT P3.4 ;LCD片选 LCD_RS BIT P3.5 ;指令、数据位 LCD_RW BIT P3.6 ;读、写位 PORT EQU P0 ;端口定义 WDT_COUNT EQU 0E1H ;看门狗 START: LCALL LCD_INIT LCALL WDT_INIT MOV A,#01H ;清屏 LCALL WR_CMD DISP_LOOP: MOV R0,#06H ;循环计数器 MOV R1,#80H ;LCD地址计数器 MOV R2,#00H ;字符表指针计数器 MOV DPTR,#TAB WR_DAT_LOOP: MOV A,R1 ;地址命令 LCALL WR_CMD INC R1 ;地址加一 MOV A,R2 ;表指针 MOVC A,@A+DPTR LCALL WR_DA T LCALL DELAY100MS INC R2 ;表指针加一 CJNE R1,#90H,BIJIAO ;字符是否到16 MOV R1,#0C0H ;到16,换地址 BIJIAO: CJNE R1,#0D0H,WR_DAT_LOOP ;字符数是否到32 MOV R1,#80H ;地址回归 LCALL DELAY1S MOV A,#1B ;清屏 LCALL WR_CMD DJNZ R0,WR_DA T_LOOP MOV WDT_COUNT,#00110111B LJMP DISP_LOOP LCD_INIT: MOV A,#111000B ;8位总线 LCALL WR_CMD MOV A,#10B ;数据指针清零

LCD1602原理及显示程序

在日常生活中,我们对液晶显示器并不陌生。液晶显示模块已作为很多电子产品的通过器件,如在计算器、万用表、电子表及很多家用电子产品中都可以看到,显示的主要是数字、专用符号和图形。在单片机的人机交流界面中,一般的输出方式有以下几种:发光管、LED 数码管、液晶显示器。发光管和LED数码管比较常用,软硬件都比较简单,在前面章节已经介绍过,在此不作介绍,本章重点介绍字符型液晶显示器的应用。 在单片机系统中应用晶液显示器作为输出器件有以下几个优点:显示质量高 由于液晶显示器每一个点在收到信号后就一直保持那种色彩和亮度,恒定发光,而不像阴极射线管显示器(CRT)那样需要不断刷新新亮点。因此,液晶显示器画质高且不会闪烁。 数字式接口 液晶显示器都是数字式的,和单片机系统的接口更加简单可靠,操作更加方便。 体积小、重量轻 液晶显示器通过显示屏上的电极控制液晶分子状态来达到显示的目的,在重量上比相同显示面积的传统显示器要轻得多。

功耗低 相对而言,液晶显示器的功耗主要消耗在其内部的电极和驱动IC上,因而耗电量比其它显示器要少得多。 10.8.1 液晶显示简介 ①液晶显示原理 液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。液晶显示器具有厚度薄、适用于大规模集成电路直接驱动、易于实现全彩色显示的特点,目前已经被广泛应用在便携式电脑、数字摄像机、PDA移动通信工具等众多领域。 ②液晶显示器的分类 液晶显示的分类方法有很多种,通常可按其显示方式分为段式、字符式、点阵式等。除了黑白显示外,液晶显示器还有多灰度有彩色显示等。如果根据驱动方式来分,可以分为静态驱动(Static)、单纯矩阵驱动(Simple Matrix)和主动矩阵驱动(Active Matrix)三种。 ③液晶显示器各种图形的显示原理: 线段的显示

相关文档
最新文档