代碼里的這部分的意思我不太清除,想請大佬指教一下,謝了
MOV R7,Velocity+03H
MOV R6,Velocity+02H
MOV R5,Velocity+01H
MOV R4,Velocity
----------------------------------------------------------------------------
NAME MABIAO ;定義1602相關管腳
COUNT_IN EQU P3.2 ; 計數(shù)脈沖輸入端P3.2
en EQU P2.6 ;使能端P2.6
rs EQU P2.7
delayMABIAO SEGMENT CODE ;段名
initMABIAO SEGMENT CODE ;中斷初始化
write_1602comMABIAO SEGMENT CODE
write_1602datMABIAO SEGMENT CODE ;液晶寫入數(shù)據(jù)函數(shù)
lcd_initMABIAO SEGMENT CODE ;液晶初始化
displayMABIAO SEGMENT CODE ;LCD顯示速度函數(shù)
mainMABIAO SEGMENT CODE
EXINT0MABIAO SEGMENT CODE
PRtime0MABIAO SEGMENT CODE
DTtime0MABIAO SEGMENT DATA OVERLAYABLE
COMABIAO SEGMENT CODE
BIMABIAO SEGMENT BIT
DTMABIAO SEGMENT DATA
EXTRN CODE (?C?ULDIV) ;無符號長型除法程序 ;
EXTRN CODE (?C?ULCMP) ;無符號長型比較程序
EXTRN CODE (?C_STARTUP)
EXTRN CODE (?C?LMUL) ;長型乘法程序
EXTRN CODE (?C?UIDIV) ;無符號整型除法程序
PUBLIC Velocity
PUBLIC Mileage
PUBLIC count
PUBLIC flag
PUBLIC tab2
PUBLIC tab1
PUBLIC time0
PUBLIC EXINT0
PUBLIC main
PUBLIC display
PUBLIC lcd_init
PUBLIC _write_1602dat
PUBLIC _write_1602com
PUBLIC init
PUBLIC _delay
RSEG DTtime0MABIAO
?time0?BYTE:
L0: DS 1 ;段地址
RSEG BIMABIAO
flag: DBIT 1 ;為flag預留1 BIT的空間
RSEG DTMABIAO ;count定義2 byte存儲空間
count: DS 2 ;Mileage定義4 Byte存儲空間
Mileage: DS 4 ;Velocity定義4 Byte存儲空間
Velocity: DS 4
RSEG delayMABIAO
L?0036:
USING 0
MOV P0,R7
MOV R7,#01H
MOV R6,#00H
LCALL _delay
SETB en
_delay: ;延時函數(shù)
USING 0
CLR A
MOV R5,A
MOV R4,A
?C0001:
CLR C
MOV A,R5
SUBB A,R7
MOV A,R4
SUBB A,R6
JNC ?C0007
CLR A
MOV R3,A
MOV R2,A
?C0004:
INC R3
CJNE R3,#00H,?C0029
INC R2
?C0029:
MOV A,R3
XRL A,#06EH
ORL A,R2
JNZ ?C0004
?C0003:
INC R5
CJNE R5,#00H,?C0030
INC R4
?C0030:
SJMP ?C0001
?C0007:
RET
RSEG initMABIAO
init: ;中斷初始化程序
SETB IT0 ;INT0負跳變觸發(fā)
MOV TMOD,#01H ;定時器工作于方式1
MOV TH0,#03CH ;50ms定時初值
MOV TL0,#0B0H ;
SETB EA ;CPU開中斷總允許
SETB ET0 ;開定時中斷
SETB EX0 ;開外部INTO中斷
SETB TR0 ;啟動定時
RET
RSEG write_1602comMABIAO
_write_1602com: ;液晶寫入指令函數(shù)與寫入數(shù)據(jù)模塊
USING 0
CLR rs;數(shù)據(jù)/指令選擇置為指令
LCALL L?0036;送入數(shù)據(jù)
CLR en ;en由高變低,產(chǎn)生下降沿,液晶執(zhí)行命令
RET
RSEG write_1602datMABIAO
L?0034:
USING 0
CLR A
MOV R1,A
MOV R0,A
L?0035:
LCALL ?C?ULDIV ;無符號長型除法程序;
MOV A,R7
ADD A,#030H
MOV R7,A
_write_1602dat: ;液晶寫入數(shù)據(jù)函數(shù)
USING 0
SETB rs
LCALL L?0036
CLR en
RET
RSEG lcd_initMABIAO
lcd_init: ;液晶初始化函數(shù)
USING 0
MOV R7,#038H ;設置液晶工作模式,意思:16*2行顯示,5*7點陣,8位數(shù)據(jù)
LCALL _write_1602com
MOV R7,#0CH ;開顯示不顯示光標
LCALL _write_1602com
MOV R7,#06H ;整屏不移動,光標自動右移
LCALL _write_1602com
MOV R7,#01H ;清顯示
LCALL _write_1602com
MOV R7,#080H ;顯示固定符號從第一行第1個位置之后開始顯示
LCALL _write_1602com
CLR A
MOV R1,A
?C0011:
MOV A,R1
MOV DPTR,#tab1 ;向液晶屏寫固定符號部分
MOVC A,@A+DPTR
MOV R7,A
LCALL _write_1602dat
INC R1
CJNE R1,#010H,?C0011
?C0012:
MOV R7,#0C0H
LCALL _write_1602com
CLR A
MOV R1,A
?C0014:
MOV A,R1 ;顯示固定符號寫入位置,從第2個位置后開始顯示
MOV DPTR,#tab2
MOVC A,@A+DPTR
MOV R7,A
LCALL _write_1602dat
INC R1
CJNE R1,#010H,?C0014
?C0017:
RET
RSEG displayMABIAO
display: ;LCD顯示速度函數(shù)
// 1km/h=100m/0.1h 360s
// 10km/h=100m/0.01h 36s
// 100km/h=100m/0.001h 3.6s
USING 0
MOV R7,#089H
LCALL _write_1602com
CLR A
MOV R3,#064H
MOV R2,A
MOV R1,A
MOV R0,A
MOV R7,Velocity+03H
MOV R6,Velocity+02H
MOV R5,Velocity+01H
MOV R4,Velocity
LCALL ?C?ULDIV ;無符號長型除法程序
CLR A
MOV R3,A
MOV R2,A
MOV R1,A
MOV R0,A
CLR C
LCALL ?C?ULCMP ; 無符號長型比較程序
JNZ ?C0018
MOV R7,#020H
SJMP ?C0032
?C0018:
CLR A
MOV R3,#064H
MOV R2,A
MOV R1,A
MOV R0,A
MOV R7,Velocity+03H
MOV R6,Velocity+02H
MOV R5,Velocity+01H
MOV R4,Velocity
LCALL ?C?ULDIV
MOV A,R7
ADD A,#030H
MOV R7,A
?C0032:
LCALL _write_1602dat ;調(diào)用液晶寫入數(shù)據(jù)函數(shù)
?C0019:
CLR A
MOV R3,#064H
MOV R2,A
MOV R1,A
MOV R0,A
MOV R7,Velocity+03H
MOV R6,Velocity+02H
MOV R5,Velocity+01H
MOV R4,Velocity
LCALL ?C?ULDIV
MOV R4,AR0
MOV R5,AR1
MOV R6,AR2
MOV R7,AR3
CLR A
MOV R3,#0AH
MOV R2,A
MOV R1,A
MOV R0,A
LCALL ?C?ULDIV
PUSH AR4
PUSH AR5
PUSH AR6
PUSH AR7
CLR A
MOV R3,#064H
MOV R2,A
MOV R1,A
MOV R0,A
MOV R7,Velocity+03H
MOV R6,Velocity+02H
MOV R5,Velocity+01H
MOV R4,Velocity
LCALL ?C?ULDIV
POP AR3
POP AR2
POP AR1
POP AR0
MOV A,R7
ADD A,R3
MOV R7,A
MOV A,R6
ADDC A,R2
MOV R6,A
MOV A,R5
ADDC A,R1
MOV R5,A
MOV A,R4
ADDC A,R0
MOV R4,A
CLR A
MOV R3,A
MOV R2,A
MOV R1,A
MOV R0,A
CLR C
LCALL ?C?ULCMP
JNZ ?C0020
MOV R7,#020H
SJMP ?C0033
?C0020:
CLR A
MOV R3,#064H
MOV R2,A
MOV R1,A
MOV R0,A
MOV R7,Velocity+03H
MOV R6,Velocity+02H
MOV R5,Velocity+01H
MOV R4,Velocity
LCALL ?C?ULDIV
MOV R4,AR0
MOV R5,AR1
MOV R6,AR2
MOV R7,AR3
CLR A
MOV R3,#0AH
MOV R2,A
MOV R1,A
MOV R0,A
LCALL ?C?ULDIV
MOV A,R7
ADD A,#030H ;數(shù)字+30得到該數(shù)字的LCD1602顯示碼
MOV R7,A
?C0033:
LCALL _write_1602dat
?C0021:
CLR A
MOV R3,#0AH
MOV R2,A
MOV R1,A
MOV R0,A
MOV R7,Velocity+03H
MOV R6,Velocity+02H
MOV R5,Velocity+01H
MOV R4,Velocity
LCALL ?C?ULDIV
MOV A,R3
ADD A,#030H
MOV R7,A
LCALL _write_1602dat
MOV R7,#0C8H
LCALL _write_1602com
MOV R3,#040H
MOV R2,#042H
MOV R1,#0FH
MOV R0,#00H
MOV R7,Mileage+03H
MOV R6,Mileage+02H
MOV R5,Mileage+01H
MOV R4,Mileage
LCALL L?0035
MOV R3,#040H
MOV R2,#042H
MOV R1,#0FH
MOV R0,#00H
MOV R7,Mileage+03H
MOV R6,Mileage+02H
MOV R5,Mileage+01H
MOV R4,Mileage
LCALL ?C?ULDIV
MOV R4,AR0
MOV R5,AR1
MOV R6,AR2
MOV R7,AR3
MOV R3,#0A0H
MOV R2,#086H
MOV R1,#01H
MOV R0,#00H
LCALL L?0035
MOV R7,#0CBH
LCALL _write_1602com
MOV R3,#0A0H
MOV R2,#086H
MOV R1,#01H
MOV R0,#00H
MOV R7,Mileage+03H
MOV R6,Mileage+02H
MOV R5,Mileage+01H
MOV R4,Mileage
LCALL ?C?ULDIV
MOV R4,AR0
MOV R5,AR1
MOV R6,AR2
MOV R7,AR3
MOV R3,#010H
MOV R2,#027H
LCALL L?0034
CLR A
MOV R3,#010H
MOV R2,#027H
MOV R1,A
MOV R0,A
MOV R7,Mileage+03H
MOV R6,Mileage+02H
MOV R5,Mileage+01H
MOV R4,Mileage
LCALL ?C?ULDIV
MOV R4,AR0
MOV R5,AR1
MOV R6,AR2
MOV R7,AR3
MOV R3,#0E8H
MOV R2,#03H
LCALL L?0034
CLR A
MOV R3,#0E8H
MOV R2,#03H
MOV R1,A
MOV R0,A
MOV R7,Mileage+03H
MOV R6,Mileage+02H
MOV R5,Mileage+01H
MOV R4,Mileage
LCALL ?C?ULDIV
MOV R4,AR0
MOV R5,AR1
MOV R6,AR2
MOV R7,AR3
CLR A
MOV R3,#064H
MOV R2,A
MOV R1,A
MOV R0,A
LCALL ?C?ULDIV
MOV A,R7
ADD A,#030H
MOV R7,A
LJMP _write_1602dat
RSEG mainMABIAO
main: ;主函數(shù)
USING 0
LCALL init
LCALL lcd_init ;調(diào)用液晶初始化函數(shù)
?C0023:
LCALL display
SJMP ?C0023
CSEG AT 00003H ;外部中斷0入口地址
LJMP EXINT0
RSEG EXINT0MABIAO
USING 0
EXINT0: ;外部中斷函數(shù)
PUSH ACC
INC count+01H
MOV A,count+01H
JNZ ?C0031
INC count ;計數(shù)脈沖值+1
?C0031:
POP ACC ;出棧
RETI ;外部中斷0返回
CSEG AT 0000BH
LJMP time0
RSEG PRtime0MABIAO
USING 0
time0: ;定時器中斷函數(shù)
PUSH ACC
PUSH B ;入棧保護
PUSH DPH
PUSH DPL
PUSH PSW
MOV PSW,#00H
PUSH AR0
PUSH AR1
PUSH AR2
PUSH AR3
PUSH AR4
PUSH AR5
PUSH AR6
PUSH AR7
USING 0
MOV TH0,#03CH ;重裝50ms定時初值
MOV TL0,#0B0H
INC L0 ;每中斷一次(L0)+1
MOV A,L0 ; (L0)->A
CLR C
SUBB A,#0AH ;寄存器A中內(nèi)容與10比較
JC ?C0028 ;不相等則轉移至?C0028
MOV L0,#00H ;相等則清零
CLR A ;//Mileage=Mileage+Velocity*500/36;里程m=速度km/h*1000*5/3.6
MOV R7,#0F4H
MOV R6,#01H
MOV R5,A
MOV R4,A
MOV R3,Velocity+03H
MOV R2,Velocity+02H
MOV R1,Velocity+01H
MOV R0,Velocity
LCALL ?C?LMUL
CLR A
MOV R3,#024H
MOV R2,A
MOV R1,A
MOV R0,A
LCALL ?C?ULDIV
MOV A,Mileage+03H
ADD A,R7
MOV Mileage+03H,A
MOV A,Mileage+02H
ADDC A,R6
MOV Mileage+02H,A
MOV A,Mileage+01H
ADDC A,R5
MOV Mileage+01H,A
MOV A,Mileage
ADDC A,R4
MOV Mileage,A
MOV R6,count ; Velocity=count/5;//將100ms內(nèi)的脈沖數(shù)/5
MOV R7,count+01H
MOV R4,#00H
MOV R5,#05H
LCALL ?C?UIDIV ;除法子程序
CLR A
MOV Velocity+03H,R7
MOV Velocity+02H,R6
MOV Velocity+01H,A
MOV Velocity,A
MOV count,A
MOV count+01H,A
?C0028: ;出棧
POP AR7
POP AR6
POP AR5
POP AR4
POP AR3
POP AR2
POP AR1
POP AR0
POP PSW
POP DPL
POP DPH
POP B
POP ACC
RETI ;T0中斷返回
RSEG COMABIAO
tab1: ;定義字符串
DB ' ' ,' ' ,'S' ,'p' ,'e' ,'e' ,'d' ,':' ,' ' ,' '
DB ' ' ,' ' ,' ' ,' ' ,'k' ,'m' ,'/' ,'h' ,000H
tab2:
DB 'M' ,'i' ,'l' ,'e' ,'a' ,'g' ,'e' ,':' ,' ' ,' '
DB '.' ,' ' ,' ' ,' ' ,'k' ,'m' ,000H
END
|