⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 transmitter.a51

📁 uart communication uart communication
💻 A51
📖 第 1 页 / 共 2 页
字号:
         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 &amp; 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 &amp; 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 &gt; 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 &gt; 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) &amp; Caps &gt; 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 + -