• 带led驱动单片机 > 人机接口设计
  • 人机接口设计

    免费下载 下载该文档 文档格式:PPT   更新时间:2009-03-02   下载次数:0   点击次数:2
    文档基本属性
    文档语言:
    文档格式:ppt
    文档作者:MC SYSTEM
    关键词:
    主题:
    备注:
    点击这里显示更多文档属性
    人机接口设计
    单片机系统需要与外部的世界通信和联系,尤其是与使用者进行交流.人机接口是其重要的交互界面.常用的人机交互装置有:显示器,键盘,打印机等.本章我们将介绍显示器和键盘的设计.
    第六章 人机接口实例
    显示器接口设计
    单片机系统常用的显示器有:LED显示器和LCD显示器.
    LED Light Emitting Diode
    Light Emitting Diode Display Device
    LCD Liquid Crystal Display
    LED显示器
    LED数码管的结构:①共阳极与共阴极
    单片机系统扩展LED数码管时多用共阳LED:
    共阳数码管每个段笔画是用低电平("0")点亮的,要求的驱动功率很小;而共阴数码管段笔画是用高电平("1")点亮的,要求的驱动功率较大.
    通常每个段笔画要串一个限流电阻.
    公共阳极
    h g f e d c b a
    接高电平
    h g f e d c b a
    a
    b
    c
    d
    g
    e
    f
    h
    公共阴极
    a
    b
    c
    d
    g
    e
    f
    h
    h g f …… a
    h g f …… a
    高电平点亮
    低电平点亮
    接地
    LED数码管的译码:②硬件译码与软件译码
    硬件译码特点:采用专用的译码/驱动器件,驱动功率较大;增加了硬件的开销;软件编程简单;字型固定
    共阴LED
    a
    b
    c
    d
    g
    e
    f
    h
    gfedcb a
    DCBA
    P1.3P1.2P1.1P1.0
    CD4511
    AT89C51
    74LS48/CD4511是"BCD码→七段共阴译码/驱动"IC; 74LS47是"BCD码→七段共阳译码/驱动"IC
    硬件译码
    软件译码特点:
    不用专用的译码/驱动器件,驱动功率较小;不增加硬件的开销;软件编程较复杂;字型灵活.
    共阳LED
    a
    b
    c
    d
    g
    e
    f
    h
    P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7
    +5V
    80C52
    软件译码
    LED数码管的软件译码
    八段LED数码管段代码编码表(连线不同可有多种表):
    公共阳极
    h g f e d c b a
    a
    b
    c
    d
    g
    e
    f
    h
    公共阴极
    h g f e d c b a
    a
    b
    c
    d
    g
    e
    f
    h
    h g f …… a
    h g f …… a
    高电平点亮
    低电平点亮
    接高电平
    接地
    00
    0FF

    6F
    7F
    07
    7D
    6D
    66
    4F
    5B
    06
    3F
    共阴
    90
    80
    0F8
    82
    92
    99
    0B0
    0A4
    0F9
    0C0
    共阳
    9
    8
    7
    6
    5
    4
    3
    2
    1
    0
    字形
    设:h g f e d c b a D7D6D5D4D3D2D1D0
    LED数码管的显示方式:③静态显示与动态显示
    动态显示特点:
    有闪烁,用元器件少,占I/O线少,必须扫描,花费CPU时间,编程复杂.(有多个LED时尤为突出)
    静态显示特点:
    无闪烁,用元器件多,占I/O线多,无须扫描,节省CPU时间,编程简单.
    静态显示:
    各数码管在显示过程中持续得到送显信号,与各数码管接口的I/O口线是专用的.
    动态显示:
    各数码管在显示过程中轮流得到送显信号,与各数码管接口的I/O口线是共用的.
    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
    要求:此处为共阳数码管,P0口送段代码,P1口送位选信号.
    实现动态显示.
    条件:待显数据存放在数组seg[0] ~seg[5]
    数字0~9的段代码已放在:BUF[0] ~ BUF[9]中.
    # include
    ……
    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;
    }
    }
    LCD接口设计
    LCD是一种与LED不同的被动式的显示设备,液晶本身并不发光,它是利用液晶在电压的作用下能够改变光线通过的方向的特性而达到显示白底黑字或黑底白字的目的.
    液晶:实质上是一种物质态,有人称之为第四态
    1888年奥地利植物学家F.REINITZER发现液晶
    当时德国物理学家将其命名为Flissende krystalle
    英文翻译为Liquid crystal,中文翻译为液晶用它制成的显示器件称为LCD(Liquid crystal Display)
    1961年,美国RCA公司普林斯顿实验室的年轻电子学者F. Heimeier把电子学的知识用于研究化学.在研究外部电场对晶体内部电场的影响时,他使用了液晶.他将两片透明导电玻璃之间夹上掺有颜料的液晶,当在液晶层的两面施加以几伏的电压时,液晶层就由红色变成透明态.根据这一现象,进而研制出一系列数字,字符显示器件.
    LCD的特点:
    工作电流比LED小几个数量级;
    尺寸小,厚度约为LED的1/3;
    工作温度范围较窄;
    响应速度低.
    应用实例
    常见的LCD显示器有:笔画式和点阵式两种
    笔画式
    笔画式LCD的字型由硬件直接形成,每种字型对应相应的字码.驱动编程简单.字型固定.
    点阵式
    点阵式LCD的显示由一个一个的点像素构成.字型由软件控制各个像素的亮和灭来实现.驱动编程较为复杂.字型灵活.
    在小规模点阵液晶显示模块上使用液晶显示驱动控制器组成液晶显示驱动控制系统是非常有益的.这使得液晶显示模块的硬件电路简单化,从而使模块的成本降低.HD61203U,HD61202U就是这类液晶显示驱动控制器套件.下面我们以香港精电公司产品MGLS12864为例,详细叙述内置HD61202U图形液晶显示模块的应用.
    HD61202U是带显示存储器的图形液晶显示列驱动控制器.它的特点是内置64×64位的显示存储器,显示屏上各像素点的显示状态与显示存储器的各位数据一一对应,显示存储器的数据直接作为图形显示的驱动信号.显示数据为"1",相应的像素点显示;显示数据为"0",相应的像素点就不显示.同时HD61202U配备了一套显示存储器的管理电路和与计算机接口电路,允许计算机直接访问显示存储器,也就是说HD61202U可以直接与计算机的总线连接.但是HD61202U不能独立工作,因为它本身不能生成显示时序,所以HD612O2U需要与相应的带振荡器和显示时序发动器的行驱动器HD61203U配套才能形成一个完整的液晶驱动和控制系统.
    HD61202U的主要特性为:
    ·拥有64×64位(512字节)的显示存储器,其数据直
    接作为显示驱动信号.
    ·8位并行数据接口,适配M6800系列时序.
    ·64路列驱动输出.
    ·简单的操作指令 显示开关设置,显示起始行设置,
    地址指针设置和数据读/写等指令.
    ·低功耗,在显示期间功耗最大为2mW.
    ·宽电压工作 Vcc=2.7V~5.5V
    Vee=OV~-10V
    精电MGLS12864模块的电路特性
    数据总线
    三态
    DB0-DB7
    9-16
    使能信号
    输入
    E
    8
    读/写选择信号
    输入
    R/W
    7
    寄存器选择信号
    输入
    D/I
    6
    液晶显示驱动电源
    -
    V0
    5
    逻辑电源正
    -
    Vcc
    4
    电源地
    -
    GND
    3
    片选B
    输入
    CSB
    2
    片选A
    输入
    CSA
    1
    功能
    状态
    符号
    序号
    模块的接口定义如下表所示
    HD61202U的操作时序图
    E
    R/W
    /CS1 /CS2
    D/I
    D0-D7
    write
    D0-D7
    read
    内置HD61202U图形液晶显示模块的软件特性
    了解内置HD61202U图形液晶显示模块的电路特性后,要使用内置HD612O2U图形液晶显示模块还需要熟悉其软件特性,即HD61202U的指令功能,才能很好地应用内置HD61202U图形液晶显示模块.指令一览表如下表所示.
    R/W
    D/I
    数 据
    1 1
    读显示数据
    数 据
    1 0
    写显示数据
    BUSY 0 ON/OFF REST 0 0 0 0
    0 1
    读取状态字
    0 1 C5 C4 C3 C2 C1 C0
    0 0
    列地址设置
    1 0 1 1 1 P2 P1 P0
    0 0
    页面地址设置
    1 1 L5 L4 L3 L2 L1 L0
    0 0
    显示起始行设置
    0 0 1 1 1 1 1 D
    0 0
    显示开头设置
    控制代码
    D7 D6 D5 D4 D3 D2 D1 D0
    控制信号
    指令名称
    HD61202U指令表
    HD61202操作流程图
    ●读状态字(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为止.
    ●显示开关设置(Display on/off)
    格式 0 O 1 1 1 1 1 D
    该指令设置显示开/关触发器的状态,由此控制显示数据锁存器的工作方式,从而控制显示屏上的显示状态.D位为显示开/关的控制位.当D=1为开显示设置,显示数据锁存器正常工作,显示屏上呈现所需的显示效果.此时在状态字中 ON/OFF=0.当 D=0为关显示设置,显示数据锁存器被置零,显示屏呈不显示状态,但显示存储器并没有被破坏,在状态字中 ON/OFF=1.
    ●显示起始行设置(Display Start Line)
    格式 1 1 L5 L4 L3 L2 L1 L0
    该指令设置了显示起始行寄存器的内容.HD612O2U有64行显示的管理能力,该指令中 L5~LO为显示起始行的地址,取值在O~3FH(1~64行)范围内,它规定了显示屏上最顶一行所对应的显示存储器的行地址.如果定时间隔地,等间距地修改(如加一或减一)显示起始行寄存器的内容,则显示屏将呈现显示内容向上或向下平滑滚动的显示效果.
    ●页面地址设置[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地址计数器不必每次都设置一次.页面地址的设置和列地址的设置将显示存储器单元唯一地确定下来,为后来的显示数据的读/写作了地址的选通.
    ●写显示数据(Write Display Data)
    格式 数 据
    该操作将8位数据写入先前已确定的显示存储器的单元内.操作完成后列地址计数器自动加一.
    ●读显示数据(Read Display Data)
    格式 数 据
    该操作将HD61202U接口部的输出寄存器内容读出,然后列地址计数器自动加一._
    内置HD612O2U图形液晶显示模块的接口技术
    一,直接访问方式
    直接访问方式就是将液晶显示模块的接口作为存储器或 I/O设备直接挂在计算机总线上,计算机以访问存储器或I/O设备的方式操作液晶显示模块的工作.直接访问方式的接口实用电路如下图所示.在图中,计算机8031通过高位地址A11控制CSB;A10控制CSA;以选通液晶显示屏上各区的控制器 HD61202U;同时 8031用地址A9作为R/W信号控制数据总线的数据流向;用地址A8作为D/I信号控制寄存器的选择;E信号由8031的读信号RD和写信号WR合成产生.从而实现计算机对内置HD61202U图形液晶显示模块的电路连接.电位器用于显示对比度的调节.
    二,间接控制方式
    间接控制方式是计算机通过自身的或系统中的并行接口与液晶显示模块连接,如 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等信号.电位器用于显示对比度的调节.
    驱动子程序如下:
    ;----------------------------------
    ;端口定义
    ;----------------------------------_
    CSA EQU P3.0 ;片选CSA _
    CSB EQU P3.1 ;片选CSB _
    D/I EQU P3.2 ;寄存器选择信号 _
    R/W EQU P3.3 ;读/写选择信号 _
    E EQU P3.4 ;使能信号 _
    1.左区驱动子程序
    (1)写指令代码子程序(左)
    PRLO; CLR CSA ;片选设置为"00"
    CLR CSB
    CLR D/I ;D/I=0
    SETB R/W ;R/W=1
    PRL01: 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
    (2)写数据代码子程序(左)
    PRL1; CLR CSA ;片选设置为"00"
    CLR CSB
    CLR D/I ;D/I=0
    SETB R/W ;R/W=1
    PRL11: 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
    (3)读数据代码子程序(左)
    PRL2; CLR CSA ;片选设置为"00"
    CLR CSB
    CLR D/I ;D/I=0
    SETB R/W ;R/W=1
    PRL21: 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
    2.右区驱动子程序
    (1)写指令代码子程序(右)
    PRLO; SETB CSA ;片选设置为"10"
    CLR CSB
    CLR D/I ;D/I=0
    SETB R/W ;R/W=1
    PRL01: 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
    (2)写数据代码子程序(右)
    PRL1; SETB CSA ;片选设置为"10"
    CLR CSB
    CLR D/I ;D/I=0
    SETB R/W ;R/W=1
    PRL11: 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
    (3)读数据代码子程序(右)
    PRL2; SETB CSA ;片选设置为"10"
    CLR CSB
    CLR D/I ;D/I=0
    SETB R/W ;R/W=1
    PRL21: 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
    内置HD61202U图形液晶显示模块的应用软件
    初始化子程序:
    INT:MOV COM,#0C0H;设置显示起始行为第一行
    LCALL PRL0
    LCALL PRM0
    LCALL PRR0
    MOV COM,#3FH;开显示设置
    LCALL PRL0
    LCALL PRM0
    LCALL PRRO
    RET
    清显示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
    COLUMN EQU 30H ;列地址寄存器
    PAGE EQU 31H ;页地址寄存器D2,D1,DO:页地址
    ;D7:字符体 D7=0为6 × 8点阵
    ;D7=1为8 × 8点阵
    CODE EQU 32H ;字符代码寄存器
    COUNT EQU 33H ;计数器
    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 ;取页地址值
    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为右屏显示区域
    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_4
    CW_31: CJNE A,#20H,CW_32 ;"10"为右区
    LCALL PRRO
    LJMP CW_4
    CW_32: LCALL PRLO ;"00"为左区
    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_5
    CC_41: CJNE A,#20H,CW_42 ;"10"为右区
    LCALL PRR1
    LJMP CW_5
    CW_42: LCALL PRL1 ;"00"为左区
    CW_5: INC CODE ;间址加一
    INC COLUMN ;列地址加一
    MOV A,COLUMN;判列地址是否超出区域范围
    CJNE A,#40H,CW_6
    CW_6: JC CW_9 ;未超出则继续
    MOV COLUMN,#00H
    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_9
    CW_61:SETB ACC.5 ;在中区则转右区
    CLR ACC.4
    M0V PAGE,A
    MOV COM,#4OH ;设置右区列地址为"0"
    LCALL PRR0
    CW_9: DJNZ COUNT,CW_4 ;循环
    RET
    ;――――――――――――――――――――――――――
    CTAB:(西文字符字库表,略)
    键盘接口设计
    键盘是人机交互中的重要的输入设备,价格低廉,结构简单,使用方便,在单片机系统中得到广泛的应用.
    单片机与计算机在键盘规模/键符设置等方面差别很大.本节将介绍单片机系统中常用的键盘.
    键盘分类
    按键值编码方式分
    (硬件)编码键盘与非(硬件)编码键盘.
    按键组连接方式分
    独立连接键盘与矩阵连接键盘.
    编码键盘: 采用专用的编码/译码器件,被按下的键由该器件译码输出相应的键码/键值.
    特点:增加了硬件开销,编码因选用器件而异,编码固定,但编程简单.适用于规模大的键盘.
    非编码键盘: 单片机系统多采用此类键盘
    采用软件编码/译码的方式,通过扫描,对每个被按下的键判别输出相应的键码/键值.
    特点:不增加硬件开销,编码灵活,适用于小规模的键盘,特别是单片机系统.但编程较复杂,占CPU时间,还须软件"消颤".
    按键值编码方式:编码键盘与非编码键盘
    按键组连接方式:独立连接键盘与矩阵连接键盘
    独立连接键盘: 每键相互独立,各自与一条I/O线相连,CPU可直接读取该I/O线的高/低电平状态.
    特点:占I/O口线多,但判键速度快,多用于设置控制键,功能键.适用于键数少的场合.
    矩阵连接键盘: 键按矩阵排列,各键处于矩阵行/列的结点处,CPU通过对连在行(列)的I/O线送已知电平的信号,然后读取列(行)线的状态信息.逐线扫描,得出键码.
    特点:键多时占用I/O口线少,但判键速度慢,多用于设置数字键.适用于键数多的场合.
    特点:此子程序需不断(或定时)调用,否则可能漏判.4个键的优先级由指令顺序决定.
    P1.0P1.1P1.2P1.3
    87C52
    独立连接式键盘例1
    # include
    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( );
    }
    }
    特点:
    1.此子程序采用中断
    查询不会漏判,省时.
    2.键的优先级由指令
    顺序决定.
    3.为防止一次按键多
    次中断,在功能子程
    序里应安排"关/开中
    断指令"并"延时".
    P1.0P1.1P1.2P1.3
    INT0
    &
    (上拉)
    87C52
    独立连接式键盘例2
    # include
    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( );
    }
    }
    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.7
    P1.6
    P1.5
    P1.4
    P1.3
    P1.2
    P1.1
    P1.0
    P2.6
    P2.5
    P2.4
    矩阵式键盘工作原理:
    先由行线送出数据,送全"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

    330×14
    +5V
    1D
    2D
    3D
    4D
    5D
    6D
    7D
    8D
    1Q
    2Q
    3Q
    4Q
    5Q
    6Q
    7Q
    8Q
    AD0
    AD1
    AD2
    AD3
    AD4
    AD5
    AD6
    AD7
    C
    OC
    CS1
    WR

    KBIT6
    KBIT5
    KBIT4
    KBIT3
    KBIT2
    KBIT1
    Y0
    Y1
    Y2
    Y3
    Y4
    Y5
    Y6
    Y7
    A
    B
    C
    CS0
    CS1
    CS2
    CS3
    CS4
    CS5
    CS6
    CS7








    E1
    E2
    E3


    74HC138
    +5V
    A13
    A14
    A15
    Y0
    Y1
    Y2
    Y3
    Y4
    Y5
    Y6
    Y7
    A
    B
    C
    CS0
    CS1
    CS2
    CS3
    CS4
    CS5
    CS6
    CS7








    E1
    E2
    E3


    74HC138
    +5V
    A13
    A14
    A15

    330×8
    +5V
    1D
    2D
    3D
    4D
    5D
    6D
    7D
    8D
    1Q
    2Q
    3Q
    4Q
    5Q
    6Q
    7Q
    8Q
    AD0
    AD1
    AD2
    AD3
    AD4
    AD5
    AD6
    AD7
    C
    OC
    CS1
    WR

    KBIT7
    KEY_REC
    KL7
    KL6
    KL5
    KL4
    KL3
    KL2
    KL1
    KL0
    # include
    # include
    # include
    # 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位数据)出现在数据总线上.
    为什么向地址0X2000赋值 还有其它的地址可以用吗
    DP-51S实验系统存储器配置
    采用单片机:P87C52X2
    片内
    32K
    FLASH
    ROM
    P87C52X2
    片外
    32K
    FLASH
    ROM
    IS62C256
    EA 接高电平
    OE
    WE
    CE
    WR
    PSEN
    RD
    A15
    A14~A0
    D7~D0
    DP-51S实验系统存储器配置
    采用单片机:P87C52X2
    片内
    32K
    FLASH
    ROM
    P87C52X2
    片外
    32K
    FLASH
    ROM
    IS62C256
    EA 接高电平
    OE
    WE
    CE
    WR
    PSEN
    RD
    A15
    A14~A0
    D7~D0
    0x0000~0x7FFF
    0x8000~0xFFFF
    Y0
    Y1
    Y2
    Y3
    Y4
    Y5
    Y6
    Y7
    A
    B
    C
    CS0
    CS1
    CS2
    CS3
    CS4
    CS5
    CS6
    CS7








    E1
    E2
    E3


    74HC138
    +5V
    A13
    A14
    A15
    外部 I / O 接口可以使用的地址:
    0X0000~0X7FFF
  • 下载地址 (推荐使用迅雷下载地址,速度快,支持断点续传)
  • 免费下载 PPT格式下载
  • 您可能感兴趣的
  • 51单片机led点阵  单片机控制led  单片机led原理图  单片机led显示  单片机led与按键  led电源单片机调光  单片机led显示程序  单片机led广告牌  单片机led