📄 transmitter.a51
字号:
MOV C, ACC.5 ; BIT MOVE OPERATOINS
MOV LCD_DB5, C
MOV C, ACC.6
MOV LCD_DB6, C
MOV C, ACC.7
MOV LCD_DB7, C
SETB LCD_E ; PULSE THE ENABLE LINE
CLR LCD_E
MOV C, ACC.0 ; SIMILARLY, LOAD LOW NIBBLE
MOV LCD_DB4, C
MOV C, ACC.1
MOV LCD_DB5, C
MOV C, ACC.2
MOV LCD_DB6, C
MOV C, ACC.3
MOV LCD_DB7, C
CLR LCD_E
SETB LCD_E ; PULSE THE ENABLE LINE
CLR LCD_E
CALL MADELAY
POP ACC
RET
; **********************************************************
; SUB TO WRITE A DATA WORD TO THE LCD
; DATA MUST BE PLACED IN R4 BY CALLING PROGRAM
; **********************************************************
WRLCDDATA:
CLR LCD_E
SETB LCD_RS ; SELECT SEND DATA
PUSH ACC ; SAVE ACCUMULATOR
MOV A, R4 ; PUT DATA BYTE IN ACC
MOV C, ACC.4 ; LOAD HIGH NIBBLE ON DATA BUS
MOV LCD_DB4, C ; ONE BIT AT A TIME USING...
MOV C, ACC.5 ; BIT MOVE OPERATOINS
MOV LCD_DB5, C
MOV C, ACC.6
MOV LCD_DB6, C
MOV C, ACC.7
MOV LCD_DB7, C
SETB LCD_E ; PULSE THE ENABLE LINE
CLR LCD_E
MOV C, ACC.0 ; SIMILARLY, LOAD LOW NIBBLE
MOV LCD_DB4, C
MOV C, ACC.1
MOV LCD_DB5, C
MOV C, ACC.2
MOV LCD_DB6, C
MOV C, ACC.3
MOV LCD_DB7, C
CLR LCD_E
SETB LCD_E ; PULSE THE ENABLE LINE
CLR LCD_E
NOP
NOP
POP ACC
RET
; **********************************************************
; SUB TAKES THE STRING IMMEDIATELY FOLLOWING THE CALL AND
; DISPLAYS ON THE LCD. STRING MUST BE TERMINATED WITH A
; NULL (0).
; **********************************************************
LCD_MSG:
CLR A ; Clear Index
MOVC A,@A+DPTR ; Get byte pointed by Dptr
INC DPTR ; Point to the next byte
JZ LCD_Msg9 ; Return if found the zero (end of stringz)
CJNE A,#01H,Lcd_Msg1 ; Check if is a Clear Command
MOV R4,A
CALL WRLCDCOM4 ;If yes, write it as command to LCD
JMP LCD_MSG ;Go get next byte from stringz
Lcd_Msg1: CJNE A,#0FFH,FLL ;Check for displaying full character
MOV R4,A
CALL WRLCDDATA
JMP LCD_MSG
FLL: CJNE A,#080h,$+3 ; Data or Address? If => 80h then is address.
JC Lcd_Msg_Data ; Carry will be set if A < 80h (Data)
MOV R4,A
CALL WRLCDCOM4 ; Carry not set if A=>80, it is address
JMP Lcd_Msg ; Go get next byte from stringz
Lcd_Msg_Data: ;
MOV R4,A
CALL WRLCDDATA ; It was data, write it to Lcd
JMP Lcd_Msg ; Go get next byte from stringz
Lcd_Msg9:
RET ; Return to Caller
; **********************************************************
; 1 MILLISECOND DELAY ROUTINE
; **********************************************************
MDELAY:
PUSH ACC
MOV A,#0A6H
MD_OLP:
INC A
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
JNZ MD_OLP
NOP
POP ACC
RET
MADELAY:
PUSH ACC
MOV A,#036H
MAD_OLP:
INC A
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
JNZ MAD_OLP
NOP
POP ACC
RET
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DELAYS: ;One second delay routine
MOV R6, #00H ;put 0 in register R6 (R6 = 0)
MOV R5, #04H ;put 5 in register R5 (R5 = 4)
LOOPB:
INC R6 ;increase R6 by one (R6 = R6 +1)
ACALL DELAYMS ;call the routine above. It will run and return to here.
MOV A, R6 ;move value in R6 to A
JNZ LOOPB ;if A is not 0, go to LOOPB
DEC R5 ;decrease R5 by one. (R5 = R5 -1)
MOV A, R5 ;move value in R5 to A
JNZ LOOPB ;if A is not 0 then go to LOOPB.
RET
;**************************************************************************
DELAYMS: ;millisecond delay routine
; ;
MOV R7,#00H ;put value of 0 in register R7
LOOPA:
INC R7 ;increase R7 by one (R7 = R7 +1)
MOV A,R7 ;move value in R7 to Accumlator (also known as A)
CJNE A,#0FFH,LOOPA ;compare A to FF hex (256). If not equal go to LOOPA
RET ;return to the point that this routine was called from
;**************************************************************************
;---------------------
; Keyboard Routines:
;---------------------
;*************************************
; WaitKB: Wait for keypress
;*************************************
WaitKB:
call Check_Keyb
jnc WaitKB
ret
;*************************************
; InitKeyb: c=1 if ACK OK
;*************************************
CheckACK:
mov a, KB_STATS
mov c, acc.4
clr acc.4
mov KB_STATS, a
ret
;*************************************
; InitKeyb:
;*************************************
InitKeyb:
mov KB_TEMP, #0
mov KB_OK, #0
mov r1, #0FFH
call Write_Keyb
call Check_Keyb
call CheckACK
jnc InitKeyb
mov r1, #0F4H ; Enable
call Write_Keyb
call Check_Keyb
call CheckACK
jnc KeybErr
mov r1, #0F3H ; Set Typematic
call Write_Keyb
call Check_Keyb
call CheckACK
jnc KeybErr
mov r1, #00H ; Typematic = 250 ms / 30 cps
call Write_Keyb
call Check_Keyb
call CheckACK
jnc KeybErr
mov KB_OK, #1
mov KB_STATS, #2 ; Num Lock ON
;*************************************
; Keyb_Leds: Set KB_STATS as leds
;*************************************
Keyb_Leds:
mov r1, #0EDH ; Set Leds
call Write_Keyb
call Check_Keyb
call CheckACK
jnc KeybErr
mov r1, KB_STATS
call Write_Keyb
call Check_Keyb
call CheckACK
KeybErr:
ret
;*************************************
; Zero2One: Wait for 0 to 1 on kb
; clock line, read the kb data line
; and shift right the bit to acc.7
;*************************************
Zero2One:
jnb KEYB_CLOCK, $
jb KEYB_CLOCK, $
mov c, KEYB_DATA
rrc a
ret
;*************************************
; Check_Keyb: Check to see if any key
; are pressed or release, returns
; ASCII codes on KB_DATA, or 1 for
; special keys, 2 for same special
; with shift. Return also the scan
; code on KB_SCAN.
;*************************************
Check_Keyb:
setb KEYB_DATA
setb KEYB_CLOCK ; CLOCK & DATA high = Idle Pos
mov r3, #50
CheckAgain:
jnb KEYB_CLOCK, KeyHit
djnz r3, CheckAgain ; check r0 times
sjmp KeyEnd
KeyHit:
jnb KEYB_DATA, KeyHit2 ; Start bit must be 0
KeyEnd:
clr KEYB_CLOCK ; disable keyb
clr c ; c=0 = no keypress
ret
KeyHit2:
mov r3, #8 ; 8 bits
clr a
KeyHit3:
call Zero2One
djnz r3, KeyHit3
mov r1, a
clr a
call Zero2One ; Parity bit
call Zero2One ; Stop bit
; acc.7 = stop, acc.6 = parity
clr KEYB_CLOCK
mov a, KB_TEMP
jz NoIgnore
dec KB_TEMP ; Igonre pause scans
sjmp ChkKbEndNC
NoIgnore:
mov KB_SCAN, r1
cjne r1, #0FAH, NoKbACK
orl KB_STATS, #ACK
sjmp ChkKbEndNC
NoKbACK:
cjne r1, #KB_PAUSE, NoKbPause
mov KB_TEMP, #7 ; Ignore next 7 scans
mov a, KB_OK
cpl acc.6
mov KB_OK, a
sjmp ChkKbEndNC
NoKbPause:
cjne r1, #KB_EXT, NoKbExt
orl KB_OK, #EXTENDED
sjmp ChkKbEndNC
NoKbExt:
cjne r1, #KB_REL, NoRelease
orl KB_STATS, #RELEASE
sjmp ChkKbEndNC
NoRelease:
; Test Num lock, if pressed toggle led
cjne r1, #KB_NUML, NoNumLock
mov a, KB_STATS
jnb acc.7, ChkKbEndNC
cpl acc.1
clr acc.7
mov KB_STATS, a
call Keyb_Leds
sjmp ChkKbEndNC
NoNumLock:
; Test Caps lock, if pressed toggle led
cjne r1, #KB_CAPS, NoCapsLock
mov a, KB_STATS
jnb acc.7, ChkKbEndNC
cpl acc.2
clr acc.7
mov KB_STATS, a
call Keyb_Leds
sjmp ChkKbEndNC
NoCapsLock:
; Test Scroll lock, if pressed toggle led
cjne r1, #KB_SCROLL, NoScrollLock
mov a, KB_STATS
jnb acc.7, ChkKbEndNC
cpl acc.0
clr acc.7
mov KB_STATS, a
call Keyb_Leds
ChkKbEndNC:
clr c
ret
NoScrollLock:
; Test L & R shifts, set bit if pressed, clear on release
cjne r1, #KB_LSHIFT, NoShift1
ShiftOK:
mov a, KB_STATS
jbc acc.7, ShiftRel
setb acc.3 ; not releasing, so Set SHIFT bit
sjmp ShiftEnd
ShiftRel:
clr acc.3 ; releasing, so Clear SHIFT bit
ShiftEnd:
mov KB_STATS, a
sjmp ChkKbEndNC
NoShift1:
cjne r1, #KB_RSHIFT, NoShift
sjmp ShiftOK
NoShift:
cjne r1, #KB_CTRL, NoCtrl
mov a, KB_STATS
jbc acc.7, CtrlRel
setb acc.5 ; not releasing, so Set CTRL bit
sjmp CtrlEnd
CtrlRel:
clr acc.5 ; releasing, so Clear SHIFT bit
CtrlEnd:
mov KB_STATS, a
sjmp ChkKbEndNC
NoCtrl:
cjne r1, #KB_ALT, NoAlt
mov a, KB_STATS
jbc acc.7, AltRel
setb acc.6 ; not releasing, so Set ALT bit
sjmp AltEnd
AltRel:
clr acc.6 ; releasing, so Clear ALT bit
AltEnd:
mov KB_STATS, a
sjmp ChkKbEndNC
NoAlt:
mov a, KB_STATS ; Releasing key test
jnb acc.7, NoRel2
clr acc.7 ; if releasing > clear
mov KB_STATS, a ; rel bit on KB_STATS
clr c ; and do nothing
ret
NoRel2:
mov a, KB_OK ; Extended key test
jnb acc.7, KbChars
clr acc.7 ; if Extended > clear
mov KB_OK, a ; EXT bit on KB_OK
clr c ; and do nothing
ret
KbChars:mov dptr, #KbScanCodes
mov a, KB_STATS
jnb acc.2, TestShift
jb acc.3, KbChkOK
mov a, r1
movc a, @a+dptr
mov r3, a
subb a, #97
jc KbChkOK
mov a, r3
subb a, #123
jnc KbChkOK
mov dptr, #KbScanCodes2 ; if (a to z) & Caps > table 2
sjmp KbChkOK
TestShift:
jnb acc.3, KbChkOK
mov dptr, #KbScanCodes2 ; with shift table 2
KbChkOK:
mov a, r1
movc a, @a+dptr
mov KB_DATA, a
setb c
ret
;*************************************
; Zero2One2: Wait for high to low in
; kb clock line
;*************************************
Zero2One2:
jnb KEYB_CLOCK, $
jb KEYB_CLOCK, $
ret
;*************************************
; Write_Keyb: Send r1 to the kb
;*************************************
Write_Keyb:
mov r3, #8 ; 8 bits to receive
clr KEYB_CLOCK ; break the Keyboard
mov r7, #00H ; some delay (safety reasons)
_WKwait:djnz r7, _WKwait
clr KEYB_DATA ; request to send
setb KEYB_CLOCK ; enable the Keyboard
acall Zero2One2 ; Start Bit
mov a, r1 ; Data Bits
TxData:
rrc a
mov KEYB_DATA, c
call Zero2One2
djnz r3, TxData
mov a, r1 ; calculate parity bit
mov c, psw.0 ; this is Even parity
cpl c ; and Keyboard needs Odd parity
mov KEYB_DATA, c ; send parity bit
call Zero2One2
setb KEYB_DATA ; send stop bit
call Zero2One2
call Zero2One2
mov c, KEYB_DATA ; get ACK bit
clr KEYB_CLOCK ; stop the keyboard
ret
; last 262 addr of code mem with scan codes tables
org 1E00H
KbScanCodes:
; Keyboard Scancodes
; ?, F9, ?, F5, F4, F1, F2, F12, ?, F10, F8, F6, F4, TAB, ~
db 0, 1 , 0, 1 , 1 , 1 , 1 , 1 , 0, 1 , 1 , 1 , 1 , 1 , '~'
; ?, ?,Lalt,Lshf, ?,Lctr, Q , ! , ?, ?, ?, Z , S , A , W , @
db 0, 0, 0 , 0 , 0, 0 , 'q', '1', 0, 0, 0, 'z', 's', 'a', 'w', '2'
; ?, ?, C , X , D , E , $ , # , ?, ?, " ", V , F , T , R
db 0, 0, 'c', 'x', 'd', 'e', '4', '3', 0, 0, ' ', 'v', 'f', 't', 'r'
; % , ?, ?, N , B , H , G , Y , ^ , ?, ?, ?, M , J , U , &
db '5', 0, 0, 'n', 'b', 'h', 'g', 'y', '6', 0, 0, 0, 'm', 'j', 'u', '7'
; * , ?, ?, < , K , I , O , ) , ( , ?, ?, > , ? , L , : , P
db '8', 0, 0, ',', 'k', 'i', 'o', '0', '9', 0, 0, '.', '/', 'l', ';', 'p'
; _ , ?, ?, ?, " , ?, { , + , ?, ?,Caps,Rshf,Entr, } , ?, |
db '-', 0, 0, 0, 39 , 0, '[', '=', 0, 0, 0 , 0 , 1 , ']', 0, 92
; ?, ?, ?, ?, ?, ?, ?, ?,BkSp, ?, ?, 1 , ?, 4 , 7 , ?, ?, ?, 0
db 0, 0, 0, 0, 0, 0, 0, 0, 1 , 0, 0, '1', 0, '4', '7', 0, 0, 0, '0'
; . , 2 , 5 , 6 , 8 , ESC,Numl, F11, + , 3 , - , * , 9 ,Scrl
db '.', '2', '5', '6', '8', 1 , 0 , 1 , '+', '3', '-', '*', '9', 0
; ?, ?, ?, ?, F7
db 0, 0, 0, 0, 1
KbScanCodes2:
; Keyboard Scancodes with shift
; ?, F9, ?, F5, F4, F1, F2, F12, ?, F10, F8, F6, F4, TAB, ~
db 0, 2 , 0, 2 , 2 , 2 , 2 , 2 , 0, 2 , 2 , 2 , 2 , 2 , '`'
; ?, ?,Lalt,Lshf, ?,Lctr, Q , ! , ?, ?, ?, Z , S , A , W , @
db 0, 0, 0 , 0 , 0, 0 , 'Q', '!', 0, 0, 0, 'Z', 'S', 'A', 'W', '@'
; ?, ?, C , X , D , E , $ , # , ?, ?, " ", V , F , T , R
db 0, 0, 'C', 'X', 'D', 'E', '$', '#', 0, 0, ' ', 'V', 'F', 'T', 'R'
; % , ?, ?, N , B , H , G , Y , ^ , ?, ?, ?, M , J , U , &
db '%', 0, 0, 'N', 'B', 'H', 'G', 'Y', '^', 0, 0, 0, 'M', 'J', 'U', '&'
; * , ?, ?, < , K , I , O , ) , ( , ?, ?, > , ? , L , : , P
db '*', 0, 0, '<', 'K', 'I', 'O', ')', '(', 0, 0, '>', '?', 'L', ':', 'P'
; _ , ?, ?, ?, " , ?, { , + , ?, ?,Caps,Rshf,Entr, } , ?, |
db '_', 0, 0, 0, '"', 0, '{', '+', 0, 0, 0 , 0 , 2 , '}', 0, '|'
; ?, ?, ?, ?, ?, ?, ?, ?,BkSp, ?, ?, 1 , ?, 4 , 7 , ?, ?, ?, 0
db 0, 0, 0, 0, 0, 0, 0, 0, 2 , 0, 0, '1', 0, '4', '7', 0, 0, 0, '0'
; . , 2 , 5 , 6 , 8 , ESC,Numl, F11, + , 3 , - , * , 9 ,Scrl
db '.', '2', '5', '6', '8', 2 , 0 , 2 , '+', '3', '-', '*', '9', 0
; ?, ?, ?, ?, F7
db 0, 0, 0, 0, 2
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -