單片機源程序如下:
;THIS IS FOR 37key KEYBOARD WITH 3 SCAN CODE 06/05/2020 USING STC8F
;THIS VERSION CHANGE CRYSTAL FROM 18M TO 11M, CHANGE AUXR.S2MODE TO ZERO 3/9/2018 output as midi
;30H NO USE
;31H NO USE
;32H FOR ROW COUNT LOOP
;33H FOR STORE SCAN DATA(MAY CONAIN FEW 0 THAT MEAN CONTACT)
;34H FOR LOOP
;35H FOR ADD TO ROW FORM 1-8 OR 9-16
;36H
;37H FOR CODESCAN LOOP
;38H
;39H
;3AH FOR KEYNUMBER
;3BH FOR VELOCITY
;3CH
;3DH
;3EH FOR SCAN CODE
;3FH
;40H
;41H FOR TEST
;42H
;MOV T2L, #0D8H //SET BYTE (65536-18432000/4/115200)
;MOV T2H, #0FFH
;MOV AUXR, #14H //T2 IS 1T, AND RUN T2
SCANNER:
LCALL DELAY3
;LCALL OUTBUFFER
;MOV P4, #0FFH
MOV DPH, #2
MOV DPL, #0
SCANP2: ;SHIFT P2 AND READ P1
MOV 35H, #0 ;THIS WILL ADD TO ROW TO MAKE 0-7
MOV 32H, #8 ;8 BITS TO SHIFT
MOV 50H, #11111111B ;THIS BYTE FOR SHIFT AND OUTPUT TO P2
MOV P2, #11111111B ;CLEAR P7 AFTER EVERY BIT SCAN
LCALL DELAY1
CLR C ;PUSH A ZERO INTO 50H AT FIRST ROTATE
SCANP2A:
MOV A, 50H
RRC A ;FIRST ROTATE WILL BE A ZERO IN, AFTER THAT WILL BE ONE IN, AND ZERO BIT SHIFT TO RIGHT
MOV 50H, A ;SAVE BACK TO 50H
;MOV P4, A ;SHOW BY LED
MOV P2, A ;P2 ONE ROW LOW
LCALL DELAY0
MOV A, P1 ;READ FROM P0
;LCALL SENTONEBYTE1
MOVX @DPTR, A
INC DPL
MOV A, P1 ;READ FROM P0
;LCALL SENTONEBYTE1
MOVX @DPTR, A
INC DPL
MOV A, P1 ;READ FROM P0
;LCALL SENTONEBYTE1
MOVX @DPTR, A
INC DPL
SETB C ;BEFORE LOOP SET C FOR SHIFT ONE TO 50H
MOV P2, #11111111B ;CLEAR P2 AFTER EVERY BIT SCAN
;MOV A, 50H
;MOV P2, A
LCALL DELAY1
DJNZ 32H, SCANP2A ;8 TIME LOOP
SCANP0: ; SHIFT P0 AND READ P1 ;ONLY P0.4567
MOV 35H, #8 ;THIS WILL ADD TO ROW TO MAKE 0-7
MOV 32H, #8 ;8 BITS TO SHIFT
MOV 50H, #11111111B ;THIS BYTE FOR SHIFT AND OUTPUT TO P7
MOV P0, #11111111B ;CLEAR P0 AFTER EVERY BIT SCAN
LCALL DELAY1
CLR C ;PUSH A ZERO INTO 50H AT FIRST ROTATE
SCANP7A:
MOV A, 50H
RRC A
MOV 50H, A ;SAVE BACK
;MOV P4, A
MOV P0, A ;P7 ONE ROW LOW
LCALL DELAY0
MOV A, P1 ;READ FROM P0
;LCALL SENTONEBYTE1
MOVX @DPTR, A
INC DPL
MOV A, P1 ;READ FROM P0
;LCALL SENTONEBYTE1
MOVX @DPTR, A
INC DPL
MOV A, P1 ;READ FROM P0
;LCALL SENTONEBYTE1
MOVX @DPTR, A
INC DPL
SETB C
MOV P0, #11111111B ;CLEAR P0 AFTER EVERY BIT SCAN
LCALL DELAY1 ;
DJNZ 32H, SCANP7A
MOV P0, #11111111B ;END OF SCAN P0
LCALL CODESCANA ;P2
LCALL CODESCANB ;P0
;LCALL SHOWSTORE
LCALL SCANNERFAKE
JNB 71H, SCANNEREXIT2 ;CHECK TIMER INT FLAG
CLR 71H
;MOV A, #77H
;LCALL SENTONEBYTE1
LCALL TIMERLOOP
SCANNEREXIT2:
JMP SCANNER
SCANNERFAKE:
SCANFAKEP2: ;SHIFT P2 AND READ P0
MOV R1, #70H
MOV 35H, #0 ;THIS WILL ADD TO ROW TO MAKE 0-7
MOV 32H, #8 ;8 BITS TO SHIFT
MOV 50H, #11111111B ;THIS BYTE FOR SHIFT AND OUTPUT TO P2
CLR C ;PUSH A ZERO INTO 50H AT FIRST ROTATE
SCANFAKEP2A:
MOV A, 50H
RRC A ;FIRST ROTATE WILL BE A ZERO IN, AFTER THAT WILL BE ONE IN, AND ZERO BIT SHIFT TO RIGHT
MOV 50H, A ;SAVE BACK TO 50H
MOV A, @R1 ;READ FROM P0
INC R1
CPL A
LCALL STOREDATA
SETB C ;BEFORE LOOP SET C FOR SHIFT ONE TO 50H
DJNZ 32H, SCANFAKEP2A ;8 TIME LOOP
SCANFAKEP7: ; SHIFT P7 AND READ P0 ;ONLY P7.4567
MOV 35H, #8 ;THIS WILL ADD TO ROW TO MAKE 0-7
MOV 32H, #8 ;8 BITS TO SHIFT
MOV 50H, #11111111B ;THIS BYTE FOR SHIFT AND OUTPUT TO P2
CLR C ;PUSH A ZERO INTO 50H AT FIRST ROTATE
SCANPFAKE7A:
MOV A, 50H
RRC A
MOV 50H, A ;SAVE BACK
MOV A, @R1 ;READ FROM P0
INC R1
CPL A
LCALL STOREDATA
SETB C
DJNZ 32H, SCANPFAKE7A
RET
CODESCANA:
MOV R1, #70H
MOV DPH, #2
MOV DPL, #0
CODESCANA1:
MOVX A, @DPTR
MOV 5AH, A
INC DPL
MOVX A, @DPTR
MOV 5BH, A
INC DPL
MOVX A, @DPTR
MOV 5CH, A
INC DPL
LCALL VERIFY
MOV A, DPL
CJNE A, #24, CODESCANA1
RET
CODESCANB: ;P0
CODESCANB1:
MOVX A, @DPTR
MOV 5AH, A
INC DPL
MOVX A, @DPTR
MOV 5BH, A
INC DPL
MOVX A, @DPTR
MOV 5CH, A
INC DPL
LCALL VERIFY ;THREE CODE COMPARE
MOV A, DPL
CJNE A, #48, CODESCANB1
RET
;VERIFY:
MOV 41H, #0
MOV A, 5AH
XRL A, 5BH
JZ VERIFY1
MOV A, 41H
ADD A, #1
MOV 41H, A
VERIFY1:
MOV A, 5AH
XRL A, 5CH
JZ VERIFY2
MOV A, 41H
ADD A, #2
MOV 41H, A
VERIFY2:
MOV A, 5BH
XRL A, 5CH
JZ VERIFY3
MOV A, 41H
ADD A, #4
MOV 41H, A
VERIFY3:
MOV A, 41H
LCALL SENTONEBYTE1
MOV A, 41H
JNZ VERIFY3
RET
VERIFY:
CJNE A, 5BH, CODE1 ;3,2
LCALL STORECODE
JMP CODEEXIT
CODE1: ;3,1
CJNE A, 5AH, CODE2
LCALL STORECODE
JMP CODEEXIT
CODE2: ;1,2
MOV A, 5AH
CJNE A, 5BH, CODE3 ;1,2
LCALL STORECODE
JMP CODEEXIT
CODE3:
MOV A, #55H ;ERROR CODE
MOV P4, #01010101B
MOV A, 5AH
LCALL SENTONEBYTE1
MOV A, 5BH
LCALL SENTONEBYTE1
MOV A, 5CH
LCALL SENTONEBYTE1
CODE4:
JMP CODE4
LCALL STORECODE
CODEEXIT:
RET
STORECODE: ;STORE 16 VERIFIED SCANDATA OF P2,P7 FOR USE USING 70-7F MEMORY
MOV @R1, A
INC R1
RET
SHOWSTORE:
MOV R1, #70H
STORESHOW1:
MOV A, @R1
LCALL SENTONEBYTE1
INC R1
MOV A, R1
CJNE A, #80H, STORESHOW1
RET
;STOREDATA:
CJNE A, #0FFH, STORE1
JMP STOREEXIT
STORE1:
LCALL SENTONEBYTE1
STOREEXIT:
RET
STOREDATA: ;32H CONTAIN ROW UMBER THAT CAUSE LOW
PUSH PSW
MOV 34H, #8 ;8 BIT TO SHIFT
MOV 33H, A ;ACC CONTAIN 8BITS WITH FEW HIGH(CAUSE BY KEYPRESS)
STOREDATA1: ;WILL LOOP 8 TIMES CHECKING EVERY BIT, CONTROL BY 34H
MOV A, 33H
LCALL COUNTPOSITION ;CODE BY SCANNER 4C 54 COUNT BY
MOV 3EH, A ;SAVE SCAN CODE
LCALL KEYMAP ;RETURN KEYNUMBER A AFTER LOOKUP THE MAP THAT REPRESENT KEYNUMBER(0-60), IF FIRST KEY THEN 0(UPPER),80(LOWER)
MOV 3AH, A ;SAVE KEYNUMBER TO 3AH, 0-127 IS UPPER KEY, 128-255 IS LOWER KEY
MOV A, 33H
RLC A ;CHECK EACH BIT OF 33H SEE 0 OR 1 AND DECIDE WHERE TO GO
MOV 33H, A ;SAVE BACK FOR NEXT ROTATE
JNC DOKEY1 ;CONTACT POINT NOT CONTACT GO NOTEOFF SUBROTINE
;MOV A, 3AH
;LCALL SENTONEBYTE1 ;SHOW KEYNUMBER
;MOV A, 3EH
;LCALL SENTONEBYTE1 ;SHOW SCANCODE
LCALL NOTEON ;NOTE ON SUBROUTINE
JMP STOREDATANEXT
DOKEY1:
LCALL NOTEOFF ;NOTEOFF SUBROUTINE
STOREDATANEXT:
DJNZ 34H, STOREDATA1 ;8 LOOP NEEDED
DOKEYEXIT:
POP PSW
RET
COUNTPOSITION:
PUSH PSW
MOV A, 32H ;ROW POSITION 1-8 P2,P7
ADD A, 35H ;IF P2 THEN ADD 0(REMAIN 1-8), IF P7 THEN ADD 8(BECOME 9-16)
MOV B, #8 ;8 CONTACT POINT FOR EACH ROW
MUL AB ;NUMBER 8,16,24,32,40.......128
CLR C
SUBB A, #8 ;MAKE A 0,8,16,24,32,40,48,56,64,72,80,88,96,104,112,120
ADD A, 34H ;34H CONTAIN 1-8 COLUME NUMBER(EACH BIT OF 33H) FORM 1 TO 128
;DEC A ;MAKE AS 0-127 SYSTEM
POP PSW
RET
NOTEON: ;KEY CONTACT DETECTED
CLR P3.3
MOV A, 3AH
RLC A ;CHECK UPPER OR LOWER
JC NOTEON1 ;LOWER KEY SO DO OUTPUT
;----------UPPER
MOV DPH, #0
MOV DPL, 3AH
MOVX A, @DPTR ;READ OLD DATA
JNZ NOTEONEXIT ;ALREADY CONTACTED, DO NOTHNG SO EXIT
;;---DELAY TIME CHECK
;MOV DPH, #1
;MOV DPL, 3AH
;MOVX A, @DPTR ;READ LOCATION #2 OLD DATA
;JNZ NOTEONEXIT ;NOT REACH 0 SO MUST WAIT SO EXIT
MOV DPH, #0
MOV DPL, 3AH
MOV A, #1
MOVX @DPTR, A ;CONTACT JUST START, PUT 1 FOR COUNT UP BY TIMER EVERY 1MS
NOP
NOP
JMP NOTEONEXIT
;----------LOWER
NOTEON1:
MOV A, 3AH
ANL A, #01111111B ;MASKING BIT7
MOV DPH, #0
MOV DPL, A
MOVX A, @DPTR ;READ VELOCITY
MOV 3BH, A ;SAVE VELOCITY
JZ NOTEONEXIT ;UPPER KEY NOT YET CONTACTED, DO NOTHING GO EXIT
DEC A
JZ NOTEONEXIT ;UPPER KEY JUST CONTACTED @1, DO NOTHING GO EXIT
MOVX A, @DPTR ;READ VELOCITY
MOV 3BH, A ;SAVE VELOCITY
INC A ;INC 1 TO SEE, IF FFH THEN WILL BE ZERO
JZ NOTEONEXIT ;IF FFH THEN WILL ZERO MEAN NOTE ALREADY OUTPUT, NEED WAIT FOR NOTEOFF SENT, DO NOTHING GO EXIT
INC A
JZ NOTEONEXIT ;IF FEH THEN WILL ZERO MEAN NOTE ALREADY OUTPUT, NEED WAIT FOR UPPERKEY RELEASE, DO NOTHING GO EXIT
MOV A, #10010000B ;MIDI NOTEON CHANNEL1
LCALL SENTONEBYTE1
;LCALL PUTBUFFER ;SENT STATUS
MOV A, 3AH
ANL A, #01111111B ;MASKING BIT7
LCALL SENTONEBYTE1
;LCALL PUTBUFFER ;SENT KEY NUMBER
MOV A, 3BH
CLR C
SUBB A, #175 ;LIMIT
JC NOTEON1A
MOV 3BH, #175
NOTEON1A:
MOV A, 3BH
CPL A ;PROCESS VELOCITY, CPL AND DIV BY 2
MOV B, #2
DIV AB
ADD A, #5 ;MOVE UP VELOCITY FROM 78 TO 7D
LCALL SENTONEBYTE1
;LCALL PUTBUFFER ;SENT VELOCITY
MOV A, 3AH
ANL A, #01111111B ;MASKING BIT7
NOP
NOP
MOV DPH, #0
MOV DPL, A
MOV A, #0FEH
MOVX @DPTR, A ;MARK AS FEH WAIT FOR RELEASE FOR SENT NOTEOFF
LCALL DELAY0
NOTEONEXIT:
RET
NOTEOFF: ;KEY NOT-CONTACT DETECTED
SETB P3.3
MOV A, 3AH
RLC A ;CHECK UPPER OR LOWER
JNC NOTEOFF1 ;UPPER KEY SO DO NOTEOFF
;=====LOWER KEY
MOV A, 3AH
ANL A, #01111111B ;MASKING
NOP ;LOWER KEY RELEASE, PUT FF
NOP
MOV DPH, #0
MOV DPL, A
MOVX A, @DPTR ;READ OLD DATA
INC A
JZ NOTEOFFEXIT ;IF FF THEN ZERO DO NOTING SO EXIT
INC A
JNZ NOTEOFFEXIT ;IF NOT FEH THEN WILL BE NOT ZERO MEAN NOTEON NOT YET SENT, DO NOTHING SO EXIT
MOV A, #0FFH
MOVX @DPTR, A ;MARK THAT KEY LOCATION #FF THAT ALLOW NOTEOFF SENT IF UPPER KEY ALSO RELEASE
LCALL DELAY0
JMP NOTEOFFEXIT
;UPPER KEY
NOTEOFF1:
NOP ;UPPER KEY RELEASE, CHECK 0FFH FOR SENT NOTEOFF
NOP
MOV DPH, #0
MOV DPL, 3AH
MOVX A, @DPTR ;READ OLD DATA
INC A
JNZ VELOCITYRESET ;IF NOT FFH THEN WILL BE NOT ZERO MEAN NOTEON NOT YET SENT OR N0T YET RELAESE, DO NOTHING SO EXIT
SENTNOTEOFF:
MOV A, #10000000B ;MIDI NOTEOFF CHANNEL1
LCALL SENTONEBYTE1
;LCALL PUTBUFFER ;SENT NOTEOFF STATUS BYTE
MOV A, 3AH
LCALL SENTONEBYTE1
;LCALL PUTBUFFER ;SENT KEYNUMBER
MOV A, #0
LCALL SENTONEBYTE1
;LCALL PUTBUFFER ;SENT ZERO VELOCITY
MOV DPH, #0
MOV DPL, 3AH
MOV A, #0
MOVX @DPTR, A ;MARK THAT KEY LOCATION 0 TO RECEIVED NEW CONTACT PRESS
MOV DPH, #1 ;PUT A VALUE TO KEY LOCATION DPL#1 FOR CONTROL REPEAT (DELAY)
MOV DPL, 3AH
MOV A, #05H ;THIS IS THE VALUE!! ;30H
MOVX @DPTR, A ;SENT VALUE TO KEY LOCATION DPL#1 NOW
NOP
JMP NOTEOFFEXIT
VELOCITYRESET: ;DUE TO ON/OFF NOISE
MOV DPH, #0
MOV DPL, 3AH
MOV A, #0
MOVX @DPTR, A ;MARK THAT KEY LOCATION 0 TO RECEIVED NEW CONTACT PRESS
NOTEOFFEXIT:
RET
TIMER_1: ;USE FOR MICRO CLOCK 1MS 184, 30 ,100US=248 250
SETB 71H
PUSH ACC
PUSH PSW
PUSH DPH
PUSH DPL
MOV DPH, #0
MOV DPL, #0
LCALL TIMERLOOP
POP DPL
POP DPH
POP PSW
POP ACC
MOV TH1, #255; 251; #200;#248 254
MOV TL1, #5;#250
RETI
TIMERLOOP:
MOVX A, @DPTR
JZ TIMER_1NEXT ;ZERO MEAN NOT UPPER KEY NOT YET PRESS, SO NO ADD
CJNE A, #0FFH, TIMERLOOP1A ;NOT FF THEN CHECK FE
JMP TIMER_1NEXT ;IS FF MEAN LOWER KEY HAD RELEASE BUT UPPER NO YET RELEASE,SO EXIT
TIMERLOOP1A:
CJNE A, #0FEH, TIMERLOOP1 ;NOT FE THEN CHECK FD
JMP TIMER_1NEXT ;FE MEAN LOWER KEY HAS CONTACT AND NOTEON SEND, BUT LOWER NOT YET RELEASE, SO EXIT
TIMERLOOP1: ;HERE CHECK NOT YET MAX THEN ADD
CJNE A, #0FDH, TIMER_1A ;NOT YET MAX, SO ADD
JMP TIMER_1NEXT ;MAX, NO ADD
TIMER_1A:
INC A ;INCREASE
MOVX @DPTR, A ;PUT BACK
TIMER_1NEXT:
INC DPL
MOV A, DPL
CJNE A, #75, TIMERLOOP ;LOOP UP UNTIL EVERY KEY
TIMER_1EXIT:
RET
UART2: ;THIS NEVER ACTIVE IN THIS PROGRAM
;/*----------------------------
;UART2 INTERRUPT SERVICE ROUTINE
;----------------------------*/
PUSH ACC
PUSH PSW
MOV A, S2CON ;READ UART2 CONTROL REGISTER
ANL A, #00000001B ;ANL, IF S2RI=0 THEN 0
JZ UART2CHECKTI
MOV A, S2BUF
ANL S2CON, #11111110B ;CLEAR S2RI BIT
JMP UART2EXIT
UART2CHECKTI:
ANL S2CON, #11111101B ;CLEAR S2TI BIT
CLR 41H
UART2EXIT:
POP PSW
POP ACC
RETI
EXT_INT0: ;IF P3.2 H2L COME HERE SET TIMER, ONLY FIRST H2L WILL ACT
RETI
TIMER_0: ;CHECK INPUT MIDI SIGNAL AT P3.2
RETI
EXT_INT1: ;USE FOR INFRA RED
RETI
;INITIAL_UART2: ;USE FOR SENT MIDI DATA
;MOV S2CON, #01010000B ;SET AS BAUD VERIABLE, NO ODD/EVEN CHECK
;MOV IE2, #01H ;ENABLE UART2 INTERRUPT
;RET
;-----INTERUPT
;UART1:
;RETI
ADC:
RETI
PCA:
RETI
LVD:
RETI
SPI:
RETI
INT2:
RETI
INT3:
RETI
TIMER_2:
RETI
INT4:
RETI
UART3:
RETI
UART4:
RETI
TIMER_3:
RETI
TIMER_4:
RETI
COMPARER:
RETI
PWM:
RETI
PWM_ERR:
RETI
CLEANRAM:
MOV DPH,#0
MOV DPL, #0
CLEANRAM1:
MOV A, #0
MOVX @DPTR, A
INC DPL
MOV A, DPL
JNZ CLEANRAM1
INC DPH
MOV A, DPH
CJNE A, #4, CLEANRAM1
RET
SETRAM:
MOV DPH,#0
MOV DPL, #0
SETRAM1:
MOV A, #0FFH
MOVX @DPTR, A
INC DPL
MOV A, DPL
JNZ SETRAM1
SHOWSCAN:
MOV DPH, #2
MOV DPL, #0
SHOWSCAN1:
;MOVX A, @DPTR
;LCALL SENTONEBYTE1
MOV A, DPL
LCALL SENTONEBYTE1
INC DPL
MOV A, DPL
CJNE A, #48, SHOWSCAN1
RET
KEYMAP:
PUSH DPL
PUSH DPH
MOV DPH, #10H
MOV DPL, #00H
MOVC A,@A+DPTR
ADD A, #35
POP DPH
POP DPL
RET
INITIAL_UART1:
MOV SCON, #01010000B ;SET AS BAUD VERIABLE, NO ODD/EVEN CHECK
SETB PS ;SERIAL PORT PRORITY HIGH
SETB ES ;ENABLE UART1 INTERRUPT
RET
SENTONEBYTE1: ;SENT OUT DATA IN R4
PUSH ACC
PUSH PSW
CHECKBUSY1:
JB 40H, CHECKBUSY1
SETB 40H ;MARK BUSY BIT
MOV SBUF, A
POP PSW
POP ACC
RET
UART1:
;/*----------------------------
;UART1 INTERRUPT SERVICE ROUTINE
;----------------------------*/
PUSH ACC
PUSH PSW
JNB RI, UART1CHECKTI
CLR RI
MOV A, SBUF ;READ THE CHARACTER FROM THE SERIAL PORT
MOVX @R1, A
;LCALL NEXTBUFFER1
JMP UART1EXIT
UART1CHECKTI:
CLR TI
CLR 40H ;CLEAR BUSY BIT
UART1EXIT:
POP PSW
POP ACC
RETI
;SENTONEBYTE1: ;SENT OUT DATA IN A
;CHECKBUSY2:
;JB 41H, CHECKBUSY2
;SETB 41H
;MOV S2BUF, A
;RET
ORG 1000H ;KEY MAPPING CONVERT SCANNER NUMBER TO KEYBOARD PHYSICAL POSITION (MUSIC KEY 1-61)
;UPPER-KEY+128=LOWER-KEY
;OPTAIN UPPER CONTACT POINT'S SCAN CODE MANUALLY AND PUT KEYNUMBER AT SCANCODE VALUE POSITION
;OPTAIN LOWER CONTACT POINT'S SCAN CODE MANUALLY AND PUT KEYNUMBER+128 AT SCANCODE VALUE POSITION
;EXAMPLE: IF KEY#38H, UPPER KEY SCANCODE IS 28H,PUT 28H POSITION AS 38H, LOWER KEY SCANCODE IS 30H,
;PUT 30H POSITION AS 8+38H=B8H
DB 00H,9AH,9BH,9CH,9DH,9EH,9FH,0A0H,0A1H,0A2H,0A3H,0A4H,0A5H,00H,00H,00H ;0 16 0F
DB 00H,22H,23H,24H,25H,00H,00H,00H,00H,1AH,1BH,1CH,1DH,1EH,1FH,20H ;0 16 1F
DB 21H,8AH,8BH,8CH,8DH,8EH,8FH,90H,91H,92H,93H,94H,95H,96H,97H,98H ;0 16 2F
DB 99H,12H,13H,14H,15H,16H,17H,18H,19H,0AH,0BH,0CH,0DH,0EH,0FH,10H ;0 16 3F
DB 11H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H ;0 16 4F
DB 00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H ;0 16 5F
DB 00H,00H,00H,00H,00H,00H,00H,00H,81H,82H,83H,84H,85H,86H,87H,88H ;0 16 6F
DB 89H,02H,03H,04H,05H,06H,07H,08H,09H,00H,00H,00H,00H,00H,00H,00H ;0 16 7F
DB 01H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H ;0 16 8F
DB 00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H ;0 16 9F
DB 00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H ;0 16 AF
DB 00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H ;0 16 BF
DB 00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H ;0 16 CF
DB 00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H ;0 16 DF
DB 00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H ;0 16 EF
DB 00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H ;0 16 FF