|
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