📄 us-std.asm
字号:
;/***********************************************************
;**--------------文件信息-----------------------------------
;**文 件 名: UM-STD.asm 键盘、显示、延时等用的子程序库
;**创 建 人: 弗兰克
;**最后修改日期: 2006年4月10日
;**描 述: MCU程序
; ==========================================================
;
; ==========================================================
;**--------------历史版本信息--------------------------------
;** 修改人: 布莱德
;** 版 本: V1.0
;** 日 期: 2009.1.12
;** 描 述:
; 20090112:
;*********************************************************************************************
; Fm = 11.0592 MHz crystal with two 30p of capacitor. 1 machine cycle = 1.085 uS
; =============================================================================================
; Define RAM
stack EQU 60H
TMP EQU 2EH
FLAG EQU 2FH ; All FLAG
SECD_F BIT FLAG.0
TASK_F BIT FLAG.1
ALAM_F BIT FLAG.2
; ---------------------------------------------------------------------------------------------
; Define const for display
CH_A EQU 10 ; Display " A "
CH_B EQU 11 ; Display " B "
CH_C EQU 12 ; Display " C "
CH_D EQU 13 ; Display " D "
CH_E EQU 14 ; Display " E "
CH_F EQU 15 ; Display " F "
CH_G EQU 16 ; Display " G "
CH_H EQU 17 ; Display " H "
CH_L EQU 18 ; Display " L "
CH_P EQU 19 ; Display " P "
CH_U EQU 20 ; Display " U "
dot EQU 21 ; Display " . "
dash EQU 22 ; Display " - "
BLAK EQU 23 ; For not display, base on DSPLY data table
COM_BYTES EQU 8 ; Counts of Communication bytes
KDNUM EQU 5 ; Keys or digits displayed
B11M_1200 EQU 0E8H ; 1200 baud
B11M_2400 EQU 0F4H ; 2400 baud
B11M_9600 EQU 0FDH ; 9600 baud
B6M_1200 EQU 0F3H ; 1200 baud
B6M_2400 EQU 0F9H ; 2400 baud
B6M_9600 EQU 0FEH ; 9600 baud
; =============================================================================================
; Init. routine
; =============================================================================================
STD_INIT:
MOV FLAG,#0 ; Reset all flag
SETB EA ; global interrupt enable
MOV P1,#0FFH
MOV P3,#0FFH
; Init. times
MOV TMOD,#21H ; T1:mode2 for S-port,T0:mode1,for time & clock
; For serial communication
SETB ES ; enable serial interrupt
MOV SCON,#01000000b ; serial port mode 1, 8 bit
SETB REN
MOV TL1,#B11M_1200 ; T1 reload value
MOV TH1,#B11M_1200 ; T1 reload value
SETB TR1
CLR EN485T
CLR DCK
CLR DDA
RET
; =============================================================================================
; Display routine
; =============================================================================================
; Display with statiic mode
DCK BIT P1.6 ; For display,To P8 of 74HC164
DDA BIT P1.7 ; For display,To P1,2 of 74HC164
DSPLY:
MOV R7,#KDNUM
MOV R0,#MBUF+KDNUM-1 ; Pointer of display buffer
SDSA: MOV A,@R0
MOV DPTR,#CHAR
MOVC A,@A+DPTR ;
ACALL SDS
DEC R0
DJNZ R7,SDSA
RET
CHAR: DB 41H,0E7H,89H,83H,27H,13H,11H,0C7H ; 0 -- 7
DB 01H,03H,05H,31H,59H,0A1H,19H,1DH ; 8 -- F
DB 51H,25H,79H,0DH,61H,0FEH,0BFH,0FFH ; G,H,L,P,U,".","-",BLANK
; ---------------------------------------------------------------------------------------------
; Send a byte to 74hc164, sended byte in A, execution time: 180uS
SDS: PUSH B
CLR DCK ; Clock bit
MOV B,#8
SD1: RRC A
MOV DDA,C ; data bit
SETB DCK
CLR DCK
DJNZ B,SD1
POP B
RET
; ---------------------------------------------------------------------------------------------
; Clear the LED
CLRLED: MOV R1,#MBUF
MOV R2,#KDNUM
CL1: MOV @R1,#BLAK
INC R1
DJNZ R2,CL1
ACALL DSPLY
RET
; =============================================================================================
; Serial port communication
; =============================================================================================
; Receive data INT. routine
SR: PUSH ACC
PUSH PSW
SETB RS0
CLR ES
CLR TI ; clear transmit interrupt FLAG
MOV R0,#MBUF ; Pointe mem. to save data
SR1:
MOV R3,#20 ; LOOP = 20mS
SR3: MOV R4,#250 ; LOOP = 1mS
SR4: JBC RI,SR5 ; exit loop when char received
DJNZ R4,SR4
DJNZ R3,SR3
AJMP SR6 ; Time over, No next data,jump to do things
SR5:
MOV @R0,SBUF
INC R0
AJMP SR1
SR6:
SETB TASK_F ; Tell main routine
SETB ES
POP PSW
POP ACC
RETI
; ---------------------------------------------------------------------------------------------
; Transmite HEX data to another MCU
; Converte BCD data in MBUF as ASCII code first If transmite to PC
ST: CLR ES
SETB EN485T
MOV R2,#COM_BYTES
MOV R1,#MBUF
ST1:
CLR RI ; This is must
MOV A,@R1
MOV SBUF,A
JNB TI,$
CLR TI
INC R1
DJNZ R2,ST1
CLR EN485T
SETB ES
RET
; =============================================================================================
; Standard routines
; =============================================================================================
WMULB: MOV A,R5 ; R5*(R6,R7)-->(R5,R6,R7)
MOV B,R7 ; Use R3,R4
MUL AB
XCH A,R7
MOV R3,B
CLR A
ADDC A,#0
MOV R4,A
MOV A,R6
MOV B,R5
MUL AB
ADD A,R3
XCH A,R6
XCH A,B
ADDC A,R4
MOV R5,A
RET
;-----------------------------------------------------------------------------------------------
; 2Word / word
;-----------------------------------------------------------------------------------------------
; R4R5R6R7 / R2R3 --> R6R7 ram in R4R5
; *** If R4,R5 > R2,R3, failure
WDIV: MOV A,R5 ; R4R5R6R7 / R2R3 --> R6R7 ram in R4R5
CLR C ; 456789ABH/6789H=AB9B...56B8
SUBB A,R3
MOV A,R4
SUBB A,R2
JNC WDI5 ; ****If R4,R5 > R2,R3, failure
MOV B,#16
CLR C ; RLC R4,R5,R6,R7 ......
WDI1: MOV A,R7
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
MOV A,R5
RLC A
MOV R5,A
MOV A,R4
RLC A
MOV R4,A
MOV F0,C
CLR C
MOV A,R5
SUBB A,R3
MOV R1,A
MOV A,R4
SUBB A,R2
JB F0,WDI2
JC WDI3
WDI2: MOV R4,A
MOV A,R1
MOV R5,A
SETB C
AJMP WDI4
WDI3: CLR C
WDI4: DJNZ B,WDI1
MOV A,R7
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
CLR F0 ;F0 = 0, WDIV OK
AJMP WDI6
WDI5: SETB F0 ;F0 = 1, R4R5>R2R3,WDIV failure
WDI6: RET
; ---------------------------------------------------------------------------------------------
MIND: MOV B,#0FFH
MOV R3,#1
MD1: MOV A,@R1
CLR C
SUBB A,B
JNC MD2
MOV B,@R1
MOV A,R3
MOV R4,A
MD2:
INC R1
INC R3
DJNZ R2,MD1
MOV A,B ;
RET ; Return in A (data)min / R4(number of data)
; ----------------------------------------------------------------------------------------------
BB2D: MOV B,#100 ; Input in A
DIV AB ;
MOV @R1,A
INC R1
MOV A,#10
XCH A,B
DIV AB
MOV @R1,A
INC R1
MOV @R1,B ; Return in @R1(MSB),@R1+1,@R1+2
RET
; ---------------------------------------------------------------------------------------------
B2D: MOV B,#10 ; Input in A
DIV AB
MOV @R1,A
INC R1
MOV @R1,B ; Return in @R1(MSB),@R1+1
RET
; =============================================================================================
; Delay Fm = 11.0592MHz 1 machine cycle = 1.085 uS
; =============================================================================================
; ACALL,PUSH,POP,RET,MOV take 10*1.085 = 10.85 uS
D50: ; N = (50 - 10.85)/2.17 = 18
PUSH B
MOV B,#18
DJNZ B,$ ; DJNZ takes 2.17 uS
POP B
RET
D100: ; N = (100 - 10.85)/2.17 = 41
PUSH B
MOV B,#41
DJNZ B,$ ; DJNZ takes 2.17 uS
POP B
RET
D250: ; N = (250 - 10.85)/2.17 = 110.207
PUSH B
MOV B,#110
DJNZ B,$ ; DJNZ takes 2.17 uS POP B
RET
D500: ; N = (500 - 10.85)/2.17 = 225.4
PUSH B
MOV B,#225
DJNZ B,$ ; DJNZ takes 2.17 uS
POP B
RET
D1MS: PUSH B ; Delay 1 mS
MOV B,#4
D1M1: ACALL D250
DJNZ B,D1M1
POP B
RET
D4MS: PUSH B
MOV B,#16 ; Delay 4 ms
D4M1: ACALL D250
DJNZ B,D4M1
POP B
RET
D20MS: PUSH B
MOV B,#80 ; Delay 20 ms
D20M1: ACALL D250
DJNZ B,D20M1
POP B
RET
D60MS: PUSH B
MOV B,#240 ; Delay 20 ms
D60M1: ACALL D250
DJNZ B,D60M1
POP B
RET
D1S: PUSH B
MOV B,#50 ; Delay 1 S
D1S1: ACALL D20MS
DJNZ B,D1S1
POP B
RET
; =============================================================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -