64
人人人人人人 人人人人 人人人人人人人人人人人人人 人人人人人人人人人人 人人人人人人人人人人人人人人 人人人人人人人人人人人 人人人人 人 。。:、 人人人人人 人人人人人人人人人人人人人人人人人 、。。 人人人 人人人人人人

人机接口设计

  • Upload
    sani

  • View
    71

  • Download
    0

Embed Size (px)

DESCRIPTION

第六章 人机接口实例. 人机接口设计. 单片机系统需要与外部的世界通信和联系,尤其是与使用者进行交流。人机接口是其重要的交互界面。常用的人机交互装置有:显示器、键盘、打印机等。 本章我们将介绍显示器和键盘的设计。. 显示器接口设计. 单片机系统常用的显示器有: LED 显示器和 LCD 显示器。. LED Light Emitting Diode Light Emitting Diode Display Device. LCD Liquid Crystal Display. 高电平点亮. h g f …… a. a. a. f. f. - PowerPoint PPT Presentation

Citation preview

Page 1: 人机接口设计

人机接口设计 单片机系统需要与外部的世界通信和联系,尤其是与使用者进行交流。人机接口是其重要的交互界面。常用的人机交互装置有:显示器、键盘、打印机等。本章我们将介绍显示器和键盘的设计。

第六章 人机接口实例

Page 2: 人机接口设计

显示器接口设计 单片机系统常用的显示器有: LED 显示器和LCD 显示器。LEDLight Emitting Diode

Light Emitting Diode Display DeviceLCDLiquid Crystal Display

Page 3: 人机接口设计

LED 显示器 LED 数码管的结构:①共阳极与共阴极

单片机系统扩展 LED 数码管时多用共阳 LED:共阳数码管每个段笔画是用低电平 (“0”)点亮的 ,要求的驱动功率很小;而共阴数码管段笔画是用高电平(“1”)点亮的,要求的驱动功率较大。 通常每个段笔画要串一个限流电阻。

公共阳极 h g f e d c b a接高电平

h g f e d c b a

ab

cd

g

e

f

h

公共阴极

ab

cd

g

e

f

hh g f …… a

h g f …… a高电平点亮

低电平点亮 接地

Page 4: 人机接口设计

LED 数码管的译码:②硬件译码与软件译码

硬件译码特点 : 采用专用的译码 /驱动器件 ,驱动功率较大 ;增加了硬件的开销 ;软件编程简单 ;字型固定

共阴 LED

ab

cd

g

e

f

h

gfedcb a

DCBA

P1.3P1.2P1.1P1.0

CD4511

AT89C51

74LS48/CD4511 是“ BCD 码→七段共阴译码 /驱动”IC; 74LS47 是“ BCD 码→七段共阳译码 /驱动” IC

硬件译码

Page 5: 人机接口设计

软件译码特点 : 不用专用的译码 /驱动器件,驱动功率较小;不增加硬件的开销;软件编程较复杂;字型灵活。

共阳 LED

ab

cd

g

e

f

h

P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7

+5V80C52

软件译码

Page 6: 人机接口设计

LED 数码管的软件译码

八段 LED 数码管段代码编码表 ( 连线不同可有多种表 ):

公共阳极

h g f e d c b a

ab

cd

g

e

f

h

公共阴极

h g f e d c b a

ab

cd

g

e

f

hh g f …… a

h g f …… a高电平点亮

低电平点亮

接高电平

接地

字形字形 00 11 22 33 44 55 66 77 88 99 灭灭

共阳共阳 0C0C00

0F90F9 0A0A44

0B0B00

9999 9292 8282 0F80F8 8080 9090 0FF0FF

共阴共阴 3F3F 0606 5B5B 4F4F 6666 6D6D 7D7D 0707 7F7F 6F6F 0000

设: h g f e d c b a D7D6D5D4D3D2D1D0

Page 7: 人机接口设计

LED 数码管的显示方式:③静态显示与动态显示

动态显示特点 : 有闪烁,用元器件少,占 I/O 线少,必须扫描,花费 CPU 时间,编程复杂。 (有多个 LED 时尤为突出)

静态显示特点 : 无闪烁,用元器件多,占 I/O 线多,无须扫描,节省 CPU 时间,编程简单。

静态显示 : 各数码管在显示过程中持续得到送显信号,与各数码管接口的 I/O 口线是专用的。动态显示 : 各数码管在显示过程中轮流得到送显信号,与各数码管接口的 I/O 口线是共用的。

Page 8: 人机接口设计

LED 数码管动态显示举例 工作原理:从 P0口送段代码 ,P1 口送位选信号。段码虽同时到达 6个 LED ,但一次仅一个 LED 被选中。利用“视觉暂留”,每送一个字符并选中相应位线,延时一会儿 ,再送 /选下一个……循环扫描即可。

P1.5 P1.4P1.3P1.2P1.2P1.0

P0.7 P0.6 P0.5 P0.4 P0.3 P0.2 P0.1 P0.0

P89C52 共阳 数码管

位选线

段代码

+5V

Page 9: 人机接口设计

要求:此处为共阳数码管, P0口送段代码, P1口送位选信号。 实现动态显示。条件:待显数据存放在数组 seg[0] ~ seg[5]

数字 0~ 9的段代码已放在 :BUF[0] ~ BUF[9] 中。# include <reg52.h>……void display( )unsigned char code BUF[10]={0xc0,0xf9,0xa4,0xb0,ox99,0x92,0x82,0x80,0x90,0x88,0x83}; unsigned char seg[ 6 ]; void display( ){

unsigned char i , j, temp;temp =0x01;for( i=0; i<6; i++){

P1 = temp;P0 = BUF[ seg[ i ] ];for( j=0; j<50; j++)_nop_( );temp=temp*2;

} }

Page 10: 人机接口设计

LCD 接口设计

LCD 是一种与 LED 不同的被动式的显示设备,液晶本身并不发光,它是利用液晶在电压的作用下能够改变光线通过的方向的特性而达到显示白底黑字或黑底白字的目的。

Page 11: 人机接口设计

液晶:实质上是一种物质态,有人称之为第四态1888 年奥地利植物学家 F.REINITZER 发现液晶当时德国物理学家将其命名为 Flissende krystalle英文翻译为 Liquid crystal, 中文翻译为液晶用它制成的

显示器件称为 LCD(Liquid crystal Display)1961 年,美国 RCA 公司普林斯顿实验室的年轻电子学

者 F. Heimeier 把电子学的知识用于研究化学。在研究外部电场对晶体内部电场的影响时,他使用了液晶。他将两片透明导电玻璃之间夹上掺有颜料的液晶,当在液晶层的两面施加以几伏的电压时,液晶层就由红色变成透明态。根据这一现象,进而研制出一系列数字、字符显示器件。

Page 12: 人机接口设计

LCD 的特点:工作电流比 LED 小几个数量级;尺寸小,厚度约为 LED 的 1/3 ;工作温度范围较窄;响应速度低。

Page 13: 人机接口设计

应用实例

Page 14: 人机接口设计

常见的 LCD 显示器有:笔画式和点阵式两种

笔画式 笔画式 LCD 的字型由硬件直接形成,每种字型对应相应的字码。驱动编程简单。字型固定。

点阵式 点阵式 LCD 的显示由一个一个的点像素构成。字型由软件控制各个像素的亮和灭来实现。驱动编程较为复杂。字型灵活。

Page 15: 人机接口设计

在小规模点阵液晶显示模块上使用液晶显示驱动控制器组成液晶显示驱动控制系统是非常有益的。这使得液晶显示模块的硬件电路简单化,从而使模块的成本降低。 HD61203U, HD61202U就是这类液晶显示驱动控制器套件。下面我们以香港精电公司产品MGLS12864为例,详细叙述内置 HD61202U图形液晶显示模块的应用。

Page 16: 人机接口设计
Page 17: 人机接口设计

HD61202U 是带显示存储器的图形液晶显示列驱动控制器。它的特点是内置 64×64 位的显示存储器,显示屏上各像素点的显示状态与显示存储器的各位数据一一对应,显示存储器的数据直接作为图形显示的驱动信号。显示数据为“ 1”,相应的像素点显示;显示数据为“ 0“,相应的像素点就不显示。同时 HD61202U配备了一套显示存储器的管理电路和与计算机接口电路,允许计算机直接访问显示存储器,也就是说 HD61202U可以直接与计算机的总线连接。但是 HD61202U 不能独立工作,因为它本身不能生成显示时序,所以 HD612O2U需要与相应的带振荡器和显示时序发动器的行驱动器 HD61203U配套才能形成一个完整的液晶驱动和控制系统。

Page 18: 人机接口设计

HD61202U的主要特性为: ·拥有 64×64位( 512字节)的显示存储器,其数据直 接作为显示驱动信号。 ·8 位并行数据接口,适配M6800系列时序。 ·64 路列驱动输出。 ·简单的操作指令 显示开关设置,显示起始行设置, 地址指针设置和数据读/写等指令。 ·低功耗,在显示期间功耗最大为2mW。 ·宽电压工作 Vcc=2.7V~ 5.5V Vee=OV~ -10V

Page 19: 人机接口设计

精电 MGLS12864模块的电路特性

序号序号 符号符号 状态状态 功能功能11 CSACSA 输入输入 片选片选 AA22 CSBCSB 输入输入 片选片选 BB33 GNDGND -- 电源地电源地44 VccVcc -- 逻辑电源正逻辑电源正55 V0V0 -- 液晶显示驱动电源液晶显示驱动电源66 D/ID/I 输入输入 寄存器选择信号寄存器选择信号77 R/WR/W 输入输入 读/写选择信号读/写选择信号88 EE 输入输入 使能信号使能信号9-169-16 DB0-DB0-

DB7DB7三态三态 数据总线数据总线

模块的接口定义如下表所示

Page 20: 人机接口设计

HD61202U 的操作时序图 E

R/W/CS1 /CS2

D/I

D0-D7write

D0-D7read

Page 21: 人机接口设计

内置 HD61202U图形液晶显示模块的软件特性

了解内置 HD61202U 图形液晶显示模块的电路特性后,要使用内置 HD612O2U 图形液晶显示模块还需要熟悉其软件特性,即 HD61202U的指令功能,才能很好地应用内置 HD61202U 图形液晶显示模块。指令一览表如下表所示。

Page 22: 人机接口设计

指令名称指令名称 控制信号控制信号 控制代码控制代码D7 D6 D5 D4 D3 D2 D1 D0D7 D6 D5 D4 D3 D2 D1 D0 D/I D/I

R/R/WW

显示开头设置显示开头设置 0 00 0 0 0 1 1 1 1 1 D0 0 1 1 1 1 1 D

显示起始行设置显示起始行设置 0 00 0 1 1 L5 L4 L3 L2 L1 L01 1 L5 L4 L3 L2 L1 L0

页面地址设置页面地址设置 0 00 0 1 0 1 1 1 P2 P1 P01 0 1 1 1 P2 P1 P0

列地址设置列地址设置 0 00 0 0 1 C5 C4 C3 C2 C1 C00 1 C5 C4 C3 C2 C1 C0

读取状态字读取状态字 0 10 1 BUSY 0 ON/OFF REST 0 0 0 0BUSY 0 ON/OFF REST 0 0 0 0

写显示数据写显示数据 1 01 0 数 据数 据读显示数据读显示数据 1 11 1 数 据数 据

HD61202U指令表

Page 23: 人机接口设计

HD61202操作流程图

Page 24: 人机接口设计

●读状态字(Status Read)格式 BUSY O ON/OFF RESET 0 0 0 0 状态字是计算机了解 HD61202U当前状态,或是 HD612O2U向计算机提供其内部状态的唯一的信息渠道。状态字为一个字节,其中仅有 3位有效位,它们是:BUSY 表示当前 HD61202U接口控制电路运行状态。 BUSY=1表示 HD61202U 正在处理计算机发来的指令或数据。此时接口电路被封锁,不能接受除读状态字以外的任何操作。 BUSY = 0表示 HD61202U接口控制电路已处于“准备好”状态,等待计算机的访问。ON/OFF 表示当前的显示状态。 ON/OFF=l表示关显示状态,ON/OFF=0表示开显示状态。RESET 表示当前 HD61202U的工作状态,即反映 RST端的电平状态。当 RST 为低电平状态时, HD61202U处于复位工作状态, RESET=1 。当 RST 为高电平状态时, HD61202U为正常工作状态, RESET=0。 在指令设置和数据读写时要注意状态字中的 BUSY标志。只有在 BUSY=0 时,计算机对 HD61202U 的操作才能有效。因此计算机在每次对 HD61202U操作之前,都要读出状态字判断 BUSY 是否为“ 0”。若不为“ 0”,则计算机需要等待,直至 BUSY=0 为止。

Page 25: 人机接口设计

●显示开关设置( Display on/off)

格式 0 O 1 1 1 1 1 D

该指令设置显示开/关触发器的状态,由此控制显示数据锁存器的工作方式,从而控制显示屏上的显示状态。 D位为显示开/关的控制位。当 D=1 为开显示设置,显示数据锁存器正常工作,显示屏上呈现所需的显示效果。此时在状态字中 ON/ OFF=0。当 D=0为关显示设置,显示数据锁存器被置零,显示屏呈不显示状态,但显示存储器并没有被破坏,在状态字中 ON/OFF= 1 。

Page 26: 人机接口设计

●显示起始行设置( Display Start Line)

格式 1 1 L5 L4 L3 L2 L1 L0

该指令设置了显示起始行寄存器的内容。 HD612O2U有 64 行显示的管理能力,该指令中 L5~ LO为显示起始行的地址,取值在 O~ 3FH( 1 ~ 64 行)范围内,它规定了显示屏上最顶一行所对应的显示存储器的行地址。如果定时间隔地,等间距地修改(如加一或减一)显示起始行寄存器的内容,则显示屏将呈现显示内容向上或向下平滑滚动的显示效果。

Page 27: 人机接口设计

●页面地址设置 [Set Page(X address) ]格式 1 O 1 1 1 P2 P1 P0 该指令设置了页面地址— X地址寄存器的内容。 HD61202U将显示存储器分成 8页,指令代码中 P2~ PO就是要确定当前所要选择的页面地址,取值范围为 0~ 7H ,代表第 l ~ 8页。该指令规定了以后的读/写操作将在哪一个页面上进行。●列地址设置(Set Y address)格式 0 1 C5 C4 C3 C2 C1 C0 该指令设置了 Y 地址计数器的内容, C5 ~ CO= O ~ 3FH( 1 ~ 64)代表某一页面上的某一单元地址,随后的一次读或写数据将在这个单元上进行。 Y 地址计数器具有自动加一功能,在每一次读/写数据后它将自动加一,所以在连续进行读/写数据时, Y 地址计数器不必每次都设置一次。页面地址的设置和列地址的设置将显示存储器单元唯一地确定下来,为后来的显示数据的读/写作了地址的选通。

Page 28: 人机接口设计

●写显示数据(Write Display Data)

格式 数 据

该操作将 8 位数据写入先前已确定的显示存储器的单元内。操作完成后列地址计数器自动加一。

●读显示数据( Read Display Data)

格式 数 据

该操作将 HD61202U接口部的输出寄存器内容读出,然后列地址计数器自动加一。

Page 29: 人机接口设计

内置 HD612O2U图形液晶显示模块的接口技术 一、直接访问方式

直接访问方式就是将液晶显示模块的接口作为存储器或 I/O设备直接挂在计算机总线上,计算机以访问存储器或 I/O设备的方式操作液晶显示模块的工作。直接访问方式的接口实用电路如下图所示。在图中,计算机 8031通过高位地址 A11控制 CSB; A10 控制 CSA ;以选通液晶显示屏上各区的控制器 HD61202U ;同时 8031 用地址A9 作为 R/ W信号控制数据总线的数据流向;用地址 A8作为 D/ I信号控制寄存器的选择; E信号由 8031 的读信号 RD 和写信号 WR合成产生。从而实现计算机对内置 HD61202U图形液晶显示模块的电路连接。电位器用于显示对比度的调节。

Page 30: 人机接口设计
Page 31: 人机接口设计

二、间接控制方式

间接控制方式是计算机通过自身的或系统中的并行接口与液晶显示模块连接,如 8031 的 P1 和 P3 口, 8255 或Z80- PIO等并行接口芯片以及像 74LS373类的锁存器等。计算机通过对这些接口的操作,以达到对液晶显示模块的控制。这种方式的特点是电路简单,控制时序由软件实现,可以实现高速计算机与液晶显示模块的接口。实用电路图如下图所示。在图中电路中以 8031 的 P1 口作为数据口, P3.O控制 CSA , P3.l控制 CSB , P3.2控制 D/ I , P3.3控制 R/W 和 P3.4控制 E等信号。电位器用于显示对比度的调节。

Page 32: 人机接口设计
Page 33: 人机接口设计

驱动子程序如下:

;----------------------------------

;端口定义

;----------------------------------

CSA EQU P3.0 ;片选 CSA

CSB EQU P3.1 ;片选 CSB

D/I EQU P3.2 ;寄存器选择信号

R/ W EQU P3.3 ;读/写选择信号

E EQU P3.4 ;使能信号

Page 34: 人机接口设计

1.左区驱动子程序( 1)写指令代码子程序(左)PRLO; CLR CSA ;片选设置为“ 00”

CLR CSB CLRD/ I ; D/ I=0 SETB R/W ; R/W=1PRL01 : MOV P1 ,#OFFH ; P1 口置“ 1” SETB E ; E=1 MOV A , P1 ;读状态字 CLR E ; E=0 JB ACC. 7, PRL01 ;判“忙”标志为“ 0”否,否再读 CLR R/W ; R/W=0 MOV P1 , COM ;写指令代码 SETB E ; E=1 CLR E ; E=0 RET

Page 35: 人机接口设计

( 2)写数据代码子程序(左)PRL1 ; CLR CSA ;片选设置为“ 00” CLRCSB CLRD/ I ; D/ I=0 SETB R/W ; R/W=1PRL11 : MOV P1 ,#OFFH ; P1 口置“ 1” SETB E ; E=1 MOV A , P1 ;读状态字 CLR E ; E=0 JB ACC. 7, PRL11 ;判“忙”标志为“ 0”否,否再读 CLR R/W ; R/W=0 MOV P1 , DAT ;写指令代码 SETB E ; E=1 CLR E ; E=0 RET

Page 36: 人机接口设计

( 3)读数据代码子程序(左)PRL2; CLR CSA ;片选设置为“ 00” CLRCSB CLRD/ I ; D/ I=0 SETB R/W ; R/W=1PRL21 : MOV P1 ,#OFFH ; P1 口置“ 1” SETB E ; E=1 MOV A , P1 ;读状态字 CLR E ; E=0 JB ACC. 7, PRL21 ;判“忙”标志为“ 0”否,否再读 SETB D/I ; D/ I=1

MOV P1 ,#OFFH ; P1 口置“ 1” SETB E ; E=1 MOV DAT , P1 ;读显示数据 CLR E ; E=0 RET

Page 37: 人机接口设计

2.右区驱动子程序( 1)写指令代码子程序(右)PRLO; SETB CSA ;片选设置为“ 10” CLR CSB CLRD/ I ; D/ I=0 SETB R/W ; R/W=1PRL01 : MOV P1 ,#OFFH ; P1 口置“ 1” SETB E ; E=1 MOV A , P1 ;读状态字 CLR E ; E=0 JB ACC. 7, PRL01 ;判“忙”标志为“ 0”否,否再读 CLR R/W ; R/W=0 MOV P1 , COM ;写指令代码 SETB E ; E=1 CLR E ; E=0 RET

Page 38: 人机接口设计

( 2)写数据代码子程序(右)PRL1 ; SETB CSA ;片选设置为“ 10” CLR CSB CLRD/ I ; D/ I=0 SETB R/W ; R/W=1PRL11 : MOV P1 ,#OFFH ; P1 口置“ 1” SETB E ; E=1 MOV A , P1 ;读状态字 CLR E ; E=0 JB ACC. 7, PRL11 ;判“忙”标志为“ 0”否,否再读 CLR R/W ; R/W=0 MOV P1 , DAT ;写显示数据 SETB E ; E=1 CLR E ; E=0 RET

Page 39: 人机接口设计

( 3)读数据代码子程序(右)PRL2; SETB CSA ;片选设置为“ 10” CLR CSB CLRD/ I ; D/ I=0 SETB R/W ; R/W=1PRL21 : MOV P1 ,#OFFH ; P1 口置“ 1” SETB E ; E=1 MOV A , P1 ;读状态字 CLR E ; E=0 JB ACC. 7, PRL21 ;判“忙”标志为“ 0”否,否再读 SETB D/I ; D/ I=1

MOV P1 ,#OFFH ; P1 口置“ 1” SETB E ; E=1 MOV DAT , P1 ;读显示数据 CLR E ; E=0 RET

Page 40: 人机接口设计

内置 HD61202U图形液晶显示模块的应用软件

初始化子程序:

INT :MOV COM,# 0C0H ;设置显示起始行为第一行

LCALL PRL0

LCALL PRM0

LCALL PRR0

MOV COM,# 3FH ;开显示设置

LCALL PRL0

LCALL PRM0

LCALL PRRO

RET

Page 41: 人机接口设计

清显示 RAM区(清屏)子程序CLEAR : MOV R4, # 00H ;页面地址暂存器设置CLEAR1 :MOV A , R4 ORL A , #OB8H ;“或”页面地址设置代码 MOV COM, A ;页面地址设置 LCALL PRLO LCALL PRM0 LCALL PRR0 MOV COM, # 40H ;列地址设置为“ 0” LCALL PRLO LCALL PRM0 LCALL PRRO MOV R3, # 40H ;一页清 64个字节CLEAR2:MOV DAT , # 00H ;显示数据为“ 0” LCALL PRL1 LCALL PRM1 LCALL PRR1 DJNZ R3, CLEAR2 ;页内字节清零循环 INC R4 ;页地址暂存器加一 CJNE R4, # 08H , CLEAR1 ; RAM区清零循环 RET

Page 42: 人机接口设计

COLUMN EQU 30H ;列地址寄存器

PAGE EQU 31H ;页地址寄存器 D2, D1 , DO:页地址

; D7:字符体 D7= 0为 6 × 8 点阵

; D7= 1 为 8 × 8 点阵

CODE EQU 32H ;字符代码寄存器

COUNT EQU 33H ;计数器

Page 43: 人机接口设计

CW_ PR :MOV DPTR ,# CTAB ;确定字符字模块首地址 MOV A , CODE ;取代码 MOV B,# 08H ;字模块宽度为 8 个字节 MUL AB ;代码×8 ADD A , DPL ;字符字模块首地址 MOV DPL , A ;=字模库首地址十代码× 8 MOV A , B ADDC A , DPH MOV DPH , A MOV CODE ,# 00H;借用为间址寄存器 MOV A , PAGE ;读页地址寄存器 JB ACC. 7, CW_ 1 ;判字符体 MOV COUNT ,# 06H ; 6 × 8 点阵 LJMP CW_ 2 CW _ 1 : MOV COUNT,# 08H ; 8 × 8点阵 CW _ 2 : ANL A,# 07H ;取页地址值

Page 44: 人机接口设计

ORL A,# OB8H “ ”; 或 页地址指令代码 MOV COM, A ;写页地址指针 LCALL PRL0 LCALL PRM0 LCALL PRR0 MOV A, COLUMN ;读列地址寄存器 CLR C SUBB A,# 40H ;列地址一 64 JC CW_ 3 ;< 0为左屏显示区域 MOV COLUMN, A SUBB A,# 40H ;列地址一 64 JC CW_ 21 ;< 0为中屏显示区域 MOV COLUMN , A ;≥O为右屏显示区域

Page 45: 人机接口设计

MOV A, PAGE SETB ACC. 5 ;设置区域标志位, MOV PAGE, A “; 00” “为左, 01” “为中, 10“为右 LJMP CW_ 3 CW_ 21:MOV A, PAGE SETB ACC. 4 ;设置区域标志位 MOV PAGE, A CW_ 3:MOV COM, COLUMN;设置列地址位 ORL COM,# 40H “ ”; 或 列地址指令标志让 MOV A, PAGE ;判区域标志以确定设置哪个控制器 ANL A,# 30H CJNE A,# 10H, CW_ 31 “; 01“为中区 LCALL PRM0 LJMP CW_ 4CW_ 31 : CJNE A,# 20H, CW_ 32 “; 10”为右区 LCALL PRRO LJMP CW_ 4CW_ 32 : LCALL PRLO “; 00“为左区

Page 46: 人机接口设计

CW_ 4: MOV A, CODE ;取间址寄存器值 MOVC A,@ A+ DPTR ;取字符字模数据 MOV DAT, A ;写数据 MOV A, PAGE ;判区域标志 ANL A,# 30H CJNE A,# 10H, CW_ 41 “; 01”为中区 LCALL PRM1 LJMP CW_ 5CC _ 41 : CJNE A ,# 20H , CW _ 42 ;“ 10”为右区 LCALL PRR1 LJMP CW_ 5CW_ 42 : LCALL PRL1 “; 00“为左区CW_ 5 : INC CODE ;间址加一 INC COLUMN ;列地址加一 MOV A, COLUMN;判列地址是否超出区域范围 CJNE A,# 40H, CW_ 6CW_ 6 : JC CW_ 9 ;未超出则继续 MOV COLUMN,# 00H

Page 47: 人机接口设计

MOV A, PAGE ;超出则判在何区域 JB ACC. 5, CW_ 9 ;在右区域则退出 JB ACC. 4, CW_ 61 ;判在左区或中区 SETB ACC. 4 ;在左区则转中区 MOV PAGE, A MOV COM,# 40H “;设置中区列地址为 0“ LCALL PRM0 LJMP CW_ 9CW_ 61:SETB ACC. 5 ;在中区则转右区 CLR ACC. 4 M0V PAGE, A MOV COM,# 4OH “;设置右区列地址为 0“ LCALL PRR0CW_ 9: DJNZ COUNT, CW_ 4 ;循环

RET――――――――――――――――――――――――――;

CTAB :(西文字符字库表,略)

Page 48: 人机接口设计

键盘接口设计

键盘是人机交互中的重要的输入设备,价格低廉,结构简单,使用方便,在单片机系统中得到广泛的应用。

单片机与计算机在键盘规模 /键符设置等方面差别很大。本节将介绍单片机系统中常用的键盘。

Page 49: 人机接口设计

键盘分类

按键值编码方式分

( 硬件 )编码键盘与非 ( 硬件 )编码键盘。

按键组连接方式分

独立连接键盘与矩阵连接键盘。

Page 50: 人机接口设计

编码键盘 : 采用专用的编码 /译码器件 ,被按下的键由该器件译码输出相应的键码 /键值。特点:增加了硬件开销,编码因选用器件而异,编码固定,但编程简单。适用于规模大的键盘。

非编码键盘 : 单片机系统多采用此类键盘 采用软件编码 /译码的方式 ,通过扫描,对每个被按下的键判别输出相应的键码 /键值。特点:不增加硬件开销,编码灵活,适用于小规模的键盘,特别是单片机系统。但编程较复杂 ,占 CPU 时间,还须软件“消颤”。

按键值编码方式 : 编码键盘与非编码键盘

Page 51: 人机接口设计

按键组连接方式 : 独立连接键盘与矩阵连接键盘独立连接键盘 : 每键相互独立,各自与一条 I/O 线相连, CPU 可直接读取该 I/O 线的高 /低电平状态。特点:占 I/O 口线多,但判键速度快,多用于设置控制键、功能键。适用于键数少的场合。

矩阵连接键盘 : 键按矩阵排列 , 各键处于矩阵行 /列的结点处 ,CPU 通过对连在行 (列 ) 的 I/O 线送已知电平的信号 ,然后读取列 ( 行 )线的状态信息。逐线扫描 ,得出键码。特点:键多时占用 I/O 口线少 ,但判键速度慢 , 多用于设置数字键。适用于键数多的场合。

Page 52: 人机接口设计

特点:此子程序需不断 (或定时 )调用,否则可能漏判。 4个键的优先级由指令顺序决定。

P1.0P1.1P1.2P1.387C52

独立连接式键盘例 1

Page 53: 人机接口设计

# include <reg52.h>sbit KEY1=P1^0;sbit KEY2=P1^1;sbit KEY3=P1^2;sbit KEY4=P1^3;void KEY1FUNC( );// 键 1 功能函数void KEY2FUNC( );// 键 2 功能函数void KEY3FUNC( );// 键 3 功能函数void KEY4FUNC( );// 键 4 功能函数unsigned char getkey( ){

if( KEY1==0 ) return 1;if( KEY2==0 ) return 2;if( KEY3==0 ) return 3;if( KEY4==0 ) return 4;return 0;

}

main( )

{

unsigned char keyNo=0xff;

while( 1 )

{

keyNo = getkey( );

if ( keyNo = 1) KEY1FUNC( );

if ( keyNo = 2) KEY2FUNC( );

if ( keyNo = 3) KEY3FUNC( );

if ( keyNo = 4) KEY4FUNC( );

}

}

Page 54: 人机接口设计

特点:1.此子程序采用中断查询不会漏判 , 省时。2.键的优先级由指令顺序决定。3.为防止一次按键多次中断,在功能子程序里应安排“关 / 开中断指令”并“延时”。

P1.0P1.1P1.2P1.3INT0

&

( 上拉 )

87C52

独立连接式键盘独立连接式键盘例例22

Page 55: 人机接口设计

# include <reg52.h>sbit KEY1=P1^0;sbit KEY2=P1^1;sbit KEY3=P1^2;sbit KEY4=P1^3;unsigned keyNo=0xff;void KEY1FUNC( );// 键 1 功能函数void KEY2FUNC( );// 键 2 功能函数void KEY3FUNC( );// 键 3 功能函数void KEY4FUNC( );// 键 4 功能函数void getkey( ) interrupt 0{

EA=0;if( KEY1==0 ) keyNo=1;if( KEY2==0 ) keyNo=2; if( KEY3==0 ) keyNo=3;if( KEY4==0 ) keyNo=4;EA=1;

}

main( )

{

EX0 = 1;

EA = 1;

while( 1 )

{

if ( keyNo = 1) KEY1FUNC( );

if ( keyNo = 2) KEY2FUNC( );

if ( keyNo = 3) KEY3FUNC( );

if ( keyNo = 4) KEY4FUNC( );

}

}

Page 56: 人机接口设计

RST

GND

8051

VCC

XTAL1

XTAL2

EA复位电路

振荡电路

+ 5V

+5v

列线0列

7列

0行

3行

0 4 8 12 16 20 24 28

1 5 9 13 17 21 25 29 2 6 10 14 18 22 26 30

3 7 11 15 19 23 26 31行线

P2.7

P1.7P1.6P1.5P1.4P1.3P1.2P1.1P1.0

P2.6

P2.5

P2.4

Page 57: 人机接口设计

矩阵式键盘工作原理: 先由行线送出数据 ,送全“ 0” 然后读进列线,判有无键按下。如果确定有键按下,行线再次送出数据,每次送出数据中只有一位“ 0”,判断按键的位置并算出键值,顺序扫描。

0 行 1行 2 行 3 行 4 行 5 行 6行 7行

行线

列 线

0列

3列

0 4 8 12 16 20 24 28

1 5 9 13 17 21 25 29 2 6 10 14 18 22 26 30

3 7 11 15 19 23 26 31

1列2列

+ 5V

Page 58: 人机接口设计

○330×14

+5V

1D2D3D4D5D6D7D8D

1Q2Q3Q4Q5Q6Q7Q8Q

AD0AD1AD2AD3AD4AD5AD6AD7

COC CS

1WR

KBIT6KBIT5KBIT4KBIT3KBIT2KBIT1

Y0Y1Y2Y3Y4Y5Y6Y7

ABC

CS0CS1CS2CS3CS4CS5CS6CS7

○E1E2E3

74HC138

+ 5V

A13A14A15

Page 59: 人机接口设计

Y0Y1Y2Y3Y4Y5Y6Y7

ABC

CS0CS1CS2CS3CS4CS5CS6CS7

○E1E2E3

74HC138

+ 5V

A13A14A15

○330×8

+5V

1D2D3D4D5D6D7D8D

1Q2Q3Q4Q5Q6Q7Q8Q

AD0AD1AD2AD3AD4AD5AD6AD7

COC CS

1WR

KBIT7

KEY_REC

KL7 KL6 KL5 KL4 KL3 KL2 KL1 KL0

Page 60: 人机接口设计

# include <reg52.h>

# include <intrins.h>

# include < absacc.h>

# defined uc unsigned char

# defined DISPORT XBYTE[ 0x2000 ]

sbit KEY_REC = P1.7 ;

……

char getkey ( ) {

uc i, temp ;char key ;P1 = 0xff ;DISPORT = 0 ;key = 0xff ;temp = 0xfe ;if ( KEY_REC != 0 ){ return key;}else{ for( i=0;i<8;i++) {

key = i;DISPORT = temp;if ( KEY_REC==0)return key;temp=temp*2+1;

} key=0xff; return key;}

}

DISPORT = 0 ; 语句的作用# defined DISPORT XBYTE[ 0x2000 ]

宏定义表明 DISPORT 是一个地址为0X2000 的外部存储器单元。对其赋值既是 CPU 向外写的过程。

因此,它有 3 个作用是: 1. 产生一个 WR 有效信号。 2. 同时,由于它的地址为 0X2000 。 A15A14A13 为 001 ,这使得 74LS138 译码器的 CS1输出有效信号。 3. 所赋的值( 8 位数据)出现在数据总线上。

Page 61: 人机接口设计

为什么向地址 0X2000 赋值?还有其它的地址可以用吗?

Page 62: 人机接口设计

DP - 51S 实验系统存储器配置

采用单片机: P87C52X2

片内

32K

FLASH

ROM

P87C52X2

片外

32K

FLASH

ROM

IS62C256EA 接高电平

OEWECE

WR

PSEN

RD

A15

A14~A0

D7~D0

Page 63: 人机接口设计

DP - 51S 实验系统存储器配置

采用单片机: P87C52X2

片内

32K

FLASH

ROM

P87C52X2

片外

32K

FLASH

ROM

IS62C256EA 接高电平

OEWECE

WR

PSEN

RD

A15

A14~A0

D7~D0

0x0000~0x7FFF 0x8000~0xFFFF

Page 64: 人机接口设计

Y0Y1Y2Y3Y4Y5Y6Y7

ABC

CS0CS1CS2CS3CS4CS5CS6CS7

○E1E2E3

74HC138

+ 5V

A13A14A15

外部 I / O 接口可以使用的地址:

0X0000 ~ 0X7FFF