原创 按键程序

2008-6-9 21:07 2287 5 5 分类: MCU/ 嵌入式

;===========================================================================
;                     Calculator Demo of Mcs-51 Program
;                       Version 1.0, For 89C51
;                            By:XiaoYong Lin
;                            Time:June/09/2008
;================================= Log =====================================
;Time:June/09/2008    , Ver 1.0
;================================ Usage ====================================
;================================ Constant =================================



;================================ Hardware =================================
DisCS      Equ    2000H


;=============================== Bit Segment ===============================
KeyPress   Bit    00H         ;1:
KeyGet     Bit    01H         ;1:
;          Bit    02H         ;1:
;          Bit    03H         ;1:
;          Bit    04H         ;1:
;          Bit    05H         ;1:
;          Bit    06H         ;1:
;          Bit    07H         ;1:
;=============================== Byte Segment ==============================
;*byte define start*
KeyInP     Equ     P1;只用到P1.0...P1.3
KeyOutP    Equ      DisCS;键盘输出是和片选连接的。
KeyCode    Data     6FH


;00H..07H : Reg Group 0
;08H..1FH : System Stack
;20H..2FH : System Bit Units
;---------------------------------------------------------------------------
;30H..7FH
;80h..0FFh
;*byte define end*
;===========================================================================
           Org    0000h
           AJmp   Main
;============================= Subroutines =================================
InitKey:   Clr    KeyGet
           Ret
;---------------------------------------------------------------------------
;键盘扫描,如果A是1则有键按下,A是0则没有键按下


;将A的值给KeyOutP,
KeyScan:   Clr    A
           Mov    Dptr,#KeyOutP
           Movx   @Dptr,A


;将KeyInP的值给A,之后取反,再“与”上0F,保持低4位不变。
           Mov    A,KeyInp
           Cpl    A
           Anl    A,0Fh
           Ret


;--------------------------------------------------------------------------
ReadKey:   Acall  KeyScan      ;看是否有键按下。
           Jnz    ReadKey0     ;有键按下(可能不止一个),刚转移到ReadKey0
           Clr    KeyPress     ;没有键按下,则顺序执行即退出。


ReadKeyQ:  Ret


ReadKey0:  Jb     KeyPress,ReadKeyQ         ;KeyPressQ等于1,则有键按下,
           Setb   KeyPress                  ;



           Mov    R1,#11111110B             ;让片选选择第一列有键按下。
           Mov    R2,#0
;让片选选择第一列有键按下,B为每一行的首地址。
ReadKeyLP: Mov    Dptr,#KeyOutP
           Mov    A,R1
           Movx   @Dptr,A


;用B来判断是哪一行被按下,再用ACC的位来判断是
           Mov    A,KeyInP
           Mov    B,#0                  ;B=0说明是第0行被按下
           Jnb    Acc.0,ReadKeyOK       ;第0行的第1列按下。
           Mov    B,#6                  ;B=6说明是第1行被按下
           Jnb    Acc.1,ReadKeyOK       ;第1行的第1列按下。
           Mov    B,#12                 ;B=12说明是第2行被按下
           Jnb    Acc.2,ReadKeyOK       ;第2行的第1列按下。
           Mov    B,#18                 ;B=18说明是第3行被按下
           Jnb    Acc.3,ReadKeyOK       ;第3行的第1列按下。


;循环对6个列进行扫描,看是哪一列有键被按下。
           Mov    A,R1
           Rl     A
           Mov    R1,A
           Inc    R2
           Cjne   R2,#6 ,ReadKeyLp       ;ReadKeyLp循环6次,扫描看是哪一行被按下。
           Sjmp   ReadKeyQ              ;


;按键的位置是由B,R2决定的。
ReadKeyOK: Mov    A,B
           Add    A,R2
           Mov    Dptr,#KeyTab
           Movc   A,@A+Dptr
           Mov    KeyCode,A
           Setb   KeyGet
;--------------------------------------------------------------------------
;         KeyCode 0  1  2  3  4  5
KeyTab:    DB     10,0,11,12,13,14


;         KeyCode 6  7  8  9 10 11
           DB     15,1, 2, 3,16,17


;         KeyCode 12 13 14 15 16 17
           DB     18, 4, 5, 6,19,20


;         KeyCode 18 19 20 21 22 23
           DB     21, 7, 8, 9,22,23
;================================= Main ====================================
Main:      ACall  InitKey


MainLoop:  ACall  ReadKey
           AJmp   MainLoop
;===========================================================================
           end

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
5
关闭 站长推荐上一条 /1 下一条