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

📄 serialr.asm

📁 USB9602 source code for C 8051
💻 ASM
字号:
;* PSI                                                      St醔l Robrt */
;*                                                                      */
;* SerialR (Funkce pro komunikaci po SCI)                   23.06.1998  */
;************************************************************************/
; Revize 5.3.1999


serialR_seg     SEGMENT CODE
serialData_seg  SEGMENT DATA

VelBafr         equ     8

RSEG            serialData_seg
RxBafr:         ds      VelBafr         ; bafr vstupnich vzorku
RxPoint:        ds      1               ; Pozice posledniho cteneho znaku
RxPointG:       ds      1               ; Pozice znaku pro f-ci get
RxCount:        ds      1               ; Pocet znaku v bafru
LinkFlg:        ds	   1					 ; Fleg volne linty (1 volno)

RxBafrMax       equ     RxBafr+8        ; Max hodnota bafru
RxBafrMin       equ     RxBafr          ; Min hodnota begru


;CSEG
;              ORG     0023h
;              push    psw
;              ljmp    serial_int

RSEG           serialR_seg
PUBLIC         serial_int              ; interrupt handler
PUBLIC         getkeyR                 ; Vycteni 1B z prijmaciho bafru
PUBLIC         getCharR                ; Vycte 1B (neni-li v bafru tak ceka)
PUBLIC			getWordR                ; Vycte 2B (neni-li...) cte Lo Hi
PUBLIC         _putkeyR                ; Poslani 1B na seriak
PUBLIC         _putWordR               ; Poslani 2B na seriak (Lo Hi)
PUBLIC         in_Rx                   ; Pocet B v prijmacim bafru
PUBLIC         init_Bafr               ; Inicializace prijm. bafru
PUBLIC         LinkFlg                 ; Priznak vysilaci linka volna
PUBLIC			RxCount                 ; Pocet znaku v prijmacim bafru
PUBLIC			Tim_out_Int					; Funkce pro obsluhu time out
; ********************************************************************
_putkeyR:
		mov	a,LinkFlg
		jz     _putkeyR
		push   00h             ; r0
		mov    a,r7
		setb   ti
		mov    sbuf,a
		clr    ti
		mov    LinkFlg,#0
		pop    00h             ; r0
		ret

; ********************************************************************
init_Bafr:      mov    RxPoint,#RxBafr
		mov    RxPointG,#RxBafr
		mov    RxCount,#0
		ret

; ********************************************************************

serial_int:
		jnb    ti,testri
		mov    LinkFlg,#1
		clr    ti

testri:		jbc     ri,got_ri       	; check for character in buffer
		ret                			; reti

got_ri:
		push    00h             	; r0 to stack
		mov     a,RxCount       	; V bafru je volne misto
		inc     a
		cjne    a,#VelBafr,dal
		mov     a,sbuf
		sjmp    keyexit         	; Bafr je plny, konec
dal:
		mov     RxCount,a
		mov     a,RxPoint       	; Rotace bafru
		inc     a               	;
		cjne    a,#RxBafrMax,keyptok
		mov     a,#RxBafrMin    	; rotace bafru preteceni
														;
keyptok:        mov     r0,a            	; load the Buffer pointer
		mov     a,sbuf          	; get the character waiting
		mov     @r0,a           	; save the character
		mov     RxPoint,r0      	; save Point
keyexit:        pop     00h
		ret            			; reti
; ************************************************************************

getkeyR:    clr     ES
            push    acc             ;save acc
         	push    00h             ;save r0

      		mov     a,RxCount       ;Test Count
		      cjne    a,#0,pokr
      		ajmp    kbfrd_ok        ;Neni co precist
pokr:
            dec     a
      		mov     RxCount,a       ;
      		mov     a,RxPointG
      		inc     a
      		cjne    a,#RxBafrMax,pokr2
      		mov     a,#RxBafrMin
pokr2:
		      mov     RxPointG,a
      		mov     r0,a
		      mov     a,@r0
      		mov     r7,a

kbfrd_ok:   pop     00h             ; get the character back
            pop     acc
            clr     c               ; clear the carry flag
            setb    ES
            ret                     ; return

; ***********************************************************************
in_Rx:          mov     r7,RxCount
                ret

; ***********************************************************************
getCharR:
                mov     A,RxCount
                jz      getCharR        ; Cekani na prijmuti B
                lcall   getkeyR
                ret

; ***********************************************************************
getWordR:
                lcall   getcharR        ; Cteni Lo B
                mov     B,R7
                lcall   getcharR        ; Cteni Hi B
                mov     A,R7
                mov     R6,A
                mov     R7,B
                ret                     ; R6-Hi R7-Lo

; ***********************************************************************
_putWordR:                              ; R6-Hi R7-Lo
                lcall   _putkeyR        ; Poslani Lo B
                mov     A,R6
                mov     R7,A
                lcall   _putkeyR        ; Poslani Hi B
                ret

; ***********************************************************************

Tim_out_Int:
					push    00h             	; r0 to stack
					mov     a,RxCount       	; V bafru je volne misto
					inc     a
					cjne    a,#VelBafr,Tdal
					sjmp    Tkeyexit         	; Bafr je plny, konec
Tdal:
					mov     RxCount,a
					mov     a,RxPoint       	; Rotace bafru
					inc     a               	;
					cjne    a,#RxBafrMax,Tkeyptok
					mov     a,#RxBafrMin    	; rotace bafru preteceni
														;
Tkeyptok:      mov     r0,a            	; load the Buffer pointer
					mov     a,#0	          	; get the character waiting
					mov     @r0,a           	; save the character
					mov     RxPoint,r0      	; save Point
Tkeyexit:      pop     00h
					ret            			   ; reti
; ***********************************************************************

end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -