;===========================================================================
; 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
文章评论(0条评论)
登录后参与讨论