Last active
November 24, 2016 09:41
-
-
Save clive819/d4827d9cfcd587cb8706fb2e88c3e770 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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