您的位置:首页单片机义隆单片机
内容搜索:
阅读内容
背景:#EDF0F5 #FAFBE6 #FFF2E2 #FDE6E0 #F3FFE1 #DAFAF3 #EAEAEF 默认  

EM78系列单片机--HD7279读出当前的按键代码

[日期:2008-07-01 ] [来源:东哥单片机学习网 www.picavr.com 整理 作者:佚名] [字体: (投递新闻)
读键盘数据指令
 
D7
D6
D5
D4
D3
D2
D1
D0
 
D7
D6
D5
D4
D3
D2
D1
D0
0
0
0
1
0
1
0
1
 
d7
d6
d5
d4
d3
d2
d1
d0
该指令从HD7279读出当前的按键代码。与其它指令不同,此命令的前一个字节00010101B为微控制器传送到HD7279的指令,而后一个字节d0- d7则为HD7279返回的按键代码,其范围是0-3FH(无键按下时为0xFF),各键键盘代码的定义,请参阅图2。
此指令的前半段,HD7279的DATA引脚处于高阻输入状态,以接受来自微处理器的指令;在指令的后半段,DATA引脚从输入状态转为输出状态,输出键盘代码的值。故微处理器连接到DATA引脚的I/O口应有一从输出态到输入态的转换过程,详情请参阅本文‘串行接口’一节的内容。
当HD7279检测到有效的按键时,KEY引脚从高电平变为低电平,并一直保持到按键结束。在此期间,如果HD7279接收到‘读键盘数据指令’,则输出当前按键的键盘代码;如果在收到‘读键盘指令’时没有有效按键,HD7279将输出FFH (11111111B)。
串行接口
HD7279采用串行方式与微处理器通讯, 串行数据从DATA引脚送入芯片,并由CLK端同步。当片选信号变为低电平后,DATA引脚上的数据在CLK引脚的上升沿被写入HD7279的缓冲寄存器。
HD7279的指令结构有三种类型:1、不带数据的纯指令,指令的宽度为8个BIT,即微处理器需发送8个CLK脉冲。2、带有数据的指令,宽度为16个BIT,即微处理器需发送16个CLK脉冲。3、读取键盘数据指令,宽度为16个BIT,前8个为微处理器发送到HD7279的指令,后8个BIT为HD7279返回的键盘代码。执行此指令时,HD7279的DATA端在第9个CLK脉冲的上升沿变为输出状态,并与第16个脉冲的下降沿恢复为输入状态,等待接收下一个指令。
串行接口的时序如下图:
1、纯指令
2、带数据指令
                8位指令(高位在前)                 8位数据(高位在前)
 
3、读键盘指令
                     读键盘指令(8位,高位在前)     HD7279输出的键盘代码(8位,高位在前)
 
2、EM78P156 接口程序
    硬件连接如图,EM78P156所用时钟频率4MHz, 选4个时钟周期为一个指令周期,
;转移指令用2个指令周期。程序使用ASM456编译程序编译通过。程序中延时时间
;以HD7279A外接R=1.5K, C=15pF为准,如使用不同的CPU时钟频率或R/C参数,
;请注意调整延时时间。
图 5.14 EM78P156与HD7279A 的硬件连接
 

;**********************************
; 寄存器定义
;**********************************
STATUS        ==   0X03
P5       ==   5
C        ==   0
 
BIT_COUNT ==   0X10
DATA_OUT ==   0X11
DATA_IN       ==   0X12
TEN      ==   0X13
TIMER         ==   0X14
TIMER1        ==   0X15
 
;**********************************
; I/O口定义
;**********************************
CS       ==   0    ;CS连接于EM78P156的P50
CLK      ==   1    ;CLK连接于EM78P156的P51
DAT      ==   2    ;DAT连接于EM78P156的P52
KEY      ==   3    ;KEY连接于EM78P156的P53

 
        ORG 0x00
        JMP START
       
        ORG 0X10
;*******************************************
; 延时子程序
;*******************************************
LONG_DELAY: MOV A,@16       ;设定延时时间为约50uS
        MOV TIMER,A
DELAY_LOOP: DJZ TIMER
        JMP DELAY_LOOP
        RET
SHORT_DELAY:    MOV A,@3        ;设定延时时间为约9uS
        MOV TIMER,A
SHORT_LP:   DJZ TIMER
        JMP SHORT_LP
        RET
;*******************************************
; 发送1个字节到HD7279,高位在前
;*******************************************
SEND:       MOV DATA_OUT,A  ;待发送数据存入DATA_OUT
        MOV A,@8
        MOV BIT_COUNT,A ;设定位记数器=8
        BC  P5,CS       ;设CS为低电平
        CALL    LONG_DELAY  ;长延时
SEND_LOOP:  BC  STATUS,C
        RLC DATA_OUT    ;输出1位
        BC  P5,DAT
        JBC STATUS,C
        BS  P5,DAT
        BS  P5,CLK      ;设CLK为高电平
        CALL    SHORT_DELAY ;短延时
        BC  P5,CLK      ;设CLK为低电平
        CALL    SHORT_DELAY
        DJZ BIT_COUNT   ;检查是否8位均发送完毕
        JMP SEND_LOOP   ;未发送完,发送下一位
        BC  P5,DAT
        RET         ;发送完毕,返回
;*******************************************
; 从HD7279接收一个字节,高位在前
;*******************************************
RECEIVE:    MOV A,@8
        MOV BIT_COUNT,A ;设定位记数器=8
        MOV A,@0B11111100   ;设P5.2(DATA)口为输入状态
        IOW P5
        CALL    LONG_DELAY  ;长延时
RECEIVE_LOOP:   BS  P5,CLK      ;置CLK为高电平
        CALL    SHORT_DELAY ;短延时
        BS  STATUS,C
        JBS P5,DAT
        BC  STATUS,C
        RLC DATA_IN     ;读取一位数据
        BC  P5,CLK      ;置CLK为低电平
        CALL    SHORT_DELAY
        DJZ BIT_COUNT   ;是否已接收8位数据
        JMP RECEIVE_LOOP
        MOV A,@0B11111000   ;重新设P52(DATA)口为输出态
        IOW P5
        RET
;*******************************************       
; 初始化
;*******************************************
START:      MOV A,@0B11111000   ;I/O口初始化
        IOW P5
        MOV A,@0B11111001
        MOV P5,A
        MOV A,@0X19     ;延时约25MS
        MOV TIMER,A
START_DELAY:    MOV A,@0XFF
        MOV TIMER1,A
START_DELAY1:   DJZ TIMER1
        JMP START_DELAY1
        DJZ TIMER
        JMP START_DELAY
        MOV A,@0B10100100   ;发复位(清除)指令
        CALL    SEND
        BS  P5,CS       ;恢复CS为高电平
;*******************************************
; 主程序
;*******************************************
MAIN:       JBC P5,KEY      ;检测是否有键按下
        JMP MAIN
        MOV A,@0B00010101   ;有键按下,发送读键盘指令
        CALL    SEND        ;发送读键盘指令
        CALL    RECEIVE     ;从HD7279A读键盘代码
        BS  P5,CS       ;设CS为高电平
;*******************************************
; 16进制——BCD码转换
;*******************************************
        CLR TEN
GET_DEC     MOV A,@10
        SUB A,DATA_IN
        JBS STATUS,C
        JMP OVER
        MOV DATA_IN,A
        INC TEN
        JMP GET_DEC
;*******************************************
;发送按键的BCD码到HD7279A
;*******************************************
;发2次左移指令,使当前显示内容左移,留出空
;位供显示新数据
OVER        MOV A,@0B10100001   ;左移指令
        CALL    SEND                ;发送指令到HD7279A
        MOV A,@0B10100001   ;左移指令
        CALL    SEND                ;发送指令到HD7279A
        MOV A,@0B10000001   ;下载数据且译码指令(第2位)
        CALL    SEND                ;发送指令到HD7279A
        MOV A,TEN
        CALL    SEND                ;发送十位数字到HD7279A
        MOV A,@0B10000000   ;下载数据且译码指令(第1位)
        CALL    SEND                ;发送指令到HD7279A
        MOV A,DATA_IN
        CALL    SEND                ;发送个位数字到HD7279A
        BS  P5,CS
WAIT        JBS P5,KEY          ;等待按键放开
        JMP WAIT
        JMP MAIN
 
;EOP
阅读:
录入:JETTA

推荐 】 【 打印
本文评论
      全部评论
发表评论


点评: 字数
姓名:
赞助商广告