Skip to content

Instantly share code, notes, and snippets.

@clive819
Last active November 24, 2016 09:41
Show Gist options
  • Save clive819/d4827d9cfcd587cb8706fb2e88c3e770 to your computer and use it in GitHub Desktop.
Save clive819/d4827d9cfcd587cb8706fb2e88c3e770 to your computer and use it in GitHub Desktop.
port4 EQU 0E8h ;#define port4 0E8h
shift7LED EQU 0FEh ;#define shift7LED 0FEh
dispBuf EQU 40h ;#define dispBuf 40h
keyBuf1 EQU 44h ;#define keyBuf1 44h
keyBuf2 EQU 45h ;#define keyBuf2 45h
keyCode EQU 46h ;#define keyCode 46h
keyCheck EQU 47h ;#define keyCheck 47h
debCounter EQU 48h ;#define debCounter 48h
debTimes EQU 60 ;#define debTimes 60
ORG 0000h ;next instruction starts at 0000h
MOV keyCode,#0FFh ;initialize keyCode
MOV keyCheck,#0FFh ;initialize keyCheck
MOV debCounter,#0 ;initialize debCounter
MOV A, #0FFh ;A <- 0FFh
MOV P2, A ;P2 <- A
MOV P3, A ;P3 <- A
MOV keyBuf1, #0FFh ;keyBuf1 <- 0FFh
MOV keyBuf2, #0FFh ;keyBuf2 <- 0FFh
MOV dispBuf, #1 ;dispBuf <- 1
MOV dispBuf+1, #2 ;dispBuf+1 <- 2
MOV dispBuf+2, #3 ;dispBuf+2 <- 3
MOV dispBuf+3, #4 ;dispBuf+3 <- 4
MOV DPTR, #LED_TABLE ;DPTR <- &LED_TABLE
RESET: ;reset to initial condition
MOV R0, #dispBuf ;R0 <- #dispBuf (40h)
MOV A, #shift7LED ;A <- #shift7LED (0FEh)
LOOP: ;void LOOP()
MOV port4, A ;port4 <- A (#shift7LED)
ACALL COVLED ;call function COVLED
ACALL GETKEYCODE ;call function GETKEYCODE
ACALL DELAYKEYDEBOUNCE ;DELAY
INC R0 ;R0++ (#dispBuf++)
RL A ;left shift A (A << 1)
JB ACC.4, LOOP ;if ACC.4 == 1 jump to LOOP
SJMP RESET ;jump to RESET
GETKEYCODE: ;get the code of the key pressed
PUSH 0E0h ;push A intto stack
MOV A, P2 ;A <- P2 (0~7)
MOV keyBuf1, A ;keyBuf1 <- A (P2)
MOV A, p3 ;A <- P3 (8~F)
MOV keyBuf2, A ;keyBuf2 <- A (P3)
CJNE A, #0FFh, P3HASINPUT ;if A != 0FFh jump to P3HASINPUT (A != 0FFh means P3 has input)
MOV A, keyBuf1 ;A <- keyBuf1 (P2)
MOV R2, #0 ;R2 <- 0
CHECKP2: ;check if P2 has input
JNB 0E0h, GOTKEYCODE ;if ACC.0 != 1 jump to GOTKEYCODE
INC R2 ;R2++
RR A ;right shift A (A >> 1)
CJNE R2, #8, CHECKP2 ;if R2 != 8
SJMP EXITGETKEYCODE ;EXIT GETKEYCODE function
P3HASINPUT: ;void P3HASINPUT()
MOV A, keyBuf2 ;A <- keyBuf2 (P3)
MOV R2, #8 ;R2 <- 8
P3BIT: ;check which bit in P3 has changed
JNB 0E0h, GOTKEYCODE ;if ACC.0 != 1 jump to GOTKEYCODE
INC R2 ;R2++
RR A ;right shift A (A >> 1)
CJNE R2, #16, P3BIT ;if R2 != 16 jump to P3BIT
SJMP EXITGETKEYCODE ;EXIT GETKEYCODE function
GOTKEYCODE: ;we got the number of the key been pressed
MOV keyCode, R2 ;keyCode <- R2 (R2 represents the number that has been pressed)
EXITGETKEYCODE: ;leave the function
POP 0E0h ;pop A out of stack
RET ;return
DISPLAYKEYCODE: ;void DISPLAYKEYCODE() (not used in this experientment)
PUSH 0E0h ;push A into stack
MOV A, keyCode ;A <- keyCode
MOV dispBuf, A ;dispBuf <- A (keyCode)
MOV dispBuf+1, A ;dispBuf+1 <- A (keyCode)
MOV dispBuf+2, A ;dispBuf+2 <- A (keyCode)
MOV dispBuf+3, A ;dispBuf+3 <- A (keyCode)
POP 0E0h ;pop A out of stack
RET ;return
DELAY: ;void DELAY()
MOV R4, #1 ;R4 <- 1
DELAY0:MOV R5, #2 ;R5 <- 2
DELAY1:MOV R6, #100 ;R6 <- 100
DELAY2:MOV R7, #100 ;R7 <- 100
DELAY3:DJNZ R7, DELAY3 ;R7-- , if R7 != 0 jump to DELAY3
DJNZ R6, DELAY2 ;R6-- , if R6 != 0 jump to DELAY2
DJNZ R5, DELAY1 ;R5-- , if R5 != 0 jump to DELAY1
DJNZ R4, DELAY0 ;R4-- , if R4 != 0 jump to DELAY0
RET ;return
COVLED: ;get the LED bits of the number and send it to port 0
PUSH 0E0h ;push A into stack
MOV A, @R0 ;A <- *R0 (mov the context inside R0 into A)
ANL A, #0Fh ;A <- A & 0Fh
MOVC A, @A+DPTR ;A <- *(A+DPTR) (mov the context inside [A+DPTR] into A)
MOV P0, A ;P0 <- A
POP 0E0h ;pop A out of stack
RET ;return
DELAYKEYDEBOUNCE: ;void DELAYKEYDEBOUNCE()
PUSH 0E0h ;push A into stack
ACALL DELAY ;DELAY
INC debCounter ;debCounter++
MOV R5,debCounter ;R5 <- debCounter
CJNE R5,#debTimes,DELAYEXIT ;if R5 != #debTimes jump to DELAYEXIT
MOV debCounter,#0 ;debCounter <- 0
MOV A,keyCode ;A <- keyCode
CJNE A,#0FFh,HASINPUT ;if A != 0FFh jump to HASINPUT
SJMP DELAYEXIT ;jump to DELAYEXIT
HASINPUT: ;void HASINPUT()
MOV A,keyCheck ;A <- keyCheck
CJNE A,keyCode,EXIT ;if A != keyCheck jump to EXIT
CJNE A,#0Ch,IS16 ;if A != 0Ch jump to IS16
MOV A,#0 ;A <- 0
ACALL SETDIGITS ;call function SETDIGITS
SJMP RESET2 ;jump to RESET2
IS16: ;void IS16()
CJNE A,#0Fh,ISNUMBER ;if A != 0Fh jump to ISNUMBER
MOV A,#0Fh ;A <- 0Fh
ACALL SETDIGITS ;call function SETDIGITS
SJMP RESET2 ;jump to RESET2
ISNUMBER: ;void ISNUMBER()
CLR C ;clear bit C
ADD A,#246 ;A <- A + 246
JC RESET2 ;if carry occurs jump to RESET2
ACALL DISPLAYKEYPATTERN ;call function DISPLAYKEYPATTERN
RESET2: ;void RESET2()
MOV keyCode,#0FFh ;initialize keyCode
MOV keyCheck,#0FFh ;initialize keyCheck
SJMP DELAYEXIT ;jump to DELAYEXIT
SETDIGITS: ;void SETDIGITS()
PUSH 0E0h ;push A into stack
MOV dispBuf, A ;dispBuf <- A
MOV dispBuf+1, A ;dispBuf+1 <- A
MOV dispBuf+2, A ;dispBuf+2 <- A
MOV dispBuf+3, A ;dispBuf+3 <- A
POP 0E0h ;pop A out of stack
RET ;return
DISPLAYKEYPATTERN: ;void DISPLAYKEYPATTERN()
PUSH 0E0h ;push A into stack
MOV dispBuf,dispBuf+1 ;dispBuf <- dispBuf+1
MOV dispBuf+1,dispBuf+2 ;dispBuf+1 <- dispBuf+2
MOV dispBuf+2,dispBuf+3 ;dispBuf+2 <- dispBuf+3
MOV dispBuf+3,keyCode ;dispBuf+3 <- keyCode
POP 0E0h ;pop A out of stack
RET ;return
EXIT: ;void EXIT()
MOV keyCheck,keyCode ;keyCheck <- keyCode
DELAYEXIT: ;void DELAYEXIT()
POP 0E0h ;pop A out of stack
RET ;return
LED_TABLE: ;LED_TABLE chart
DB 0C0h ;0
DB 0F9h ;1
DB 0A4h ;2
DB 0B0h ;3
DB 99h ;4
DB 92h ;5
DB 82h ;6
DB 0D8h ;7
DB 80h ;8
DB 90h ;9
DB 88h ;A
DB 83h ;B
DB 0C6h ;C
DB 0A1h ;D
DB 86h ;E
DB 8Eh ;F
END
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment