?? myproj.asm
字號:
;命令協議為:
;LENG為除起止位外其它數據長度 CRC為除起止、LENG及地址外所有數據的檢驗和
;| STR | LENG | ADDR | CMD | DAT0 | DAT1 | CRC | END |
;R0為參數0 R1為參數1 R2為參數2 R3為模式 R4為當前數值 R5為接收字節數 R6為按鍵功能 R7為秒倍數
org 0000H
LJMP Main
org 0003H
LJMP Int0Add
org 000bH
LJMP TimeSec
org 0013H
LJMP Int1Ent
org 0023H
LJMP RecvDat
org 0100H
R8 DATA 08H ;微秒延時
R9 DATA 09H ;毫秒延時
R10 DATA 0AH ;秒延時
R11 DATA 0BH
R12 DATA 0CH
R13 DATA 0DH
ADDR DATA 0EH
INITDAT DATA 0FH ;倒計時初值
RecvBUF DATA 10H ;接收緩沖區最大16個
Main: ;初始化
mov SP,#60h
mov ADDR,#01h
mov R0,#01h
mov R1,#10h
mov R2,#00h
mov R3,#00h
mov R4,#00h
mov R5,#00h
mov R6,#00H
mov R7,#20H
mov P2,#0FFh
mov P0,#0FFH
mov DPTR,#0400H
mov INITDAT,#3cH
mov TMOD,#21h
mov TH1,#0FAh
mov TL1,#0FAh
mov TH0,#00h
mov TL0,#00h
mov SCON,#50h
mov PCON,#80h
mov IE,#0d7h
setb it1
setb it0
setb TR1
setb TR0
clr F0
mov R2,#10H
mov R0,#10H
call ClearM
Again: ;循環調用顯示
Call DispLed
Call DispNum
Call ExcuBuf
JMP Again
;LED顯示
DispLed:
mov P2,#80h
jb F0,ShowOtr
mov P0,R6
JMP Show
ShowOtr:
CJNE R6,#04h,ShowStart
mov P0,R3
JMP Show
ShowStart:
mov P0,INITDAT
Show:
mov R9,#05h
Call DelayMs
ret
;數碼顯示 注意修改位控位及位控電平
DispNum:
mov A,R4
mov B,#0Ah
div AB
movc A,@A+DPTR
mov p2,#40h
mov p0,A
mov R9,#05h
Call DelayMs
mov A,B
movc A,@A+DPTR
mov p2,#20H
mov P0,A
mov R9,#05h
Call DelayMs
ret
;命令處理線程
ExcuBuf:
mov R0,#10h
CJNE R5,#08h,NEqu08H
Nequ08H:
JC ExitExcu ;小于8個
CJNE @R0,#02H,ERR
mov A,11H
add A,#11H
mov R0,A
CJNE @R0,#03H,ERR ;結尾不為0x03
mov R0,#12H
CJNE @R0,#01H,ERR ;地址不為0x01
mov R0,#13H
mov R1,11H
dec R1
dec R1
dec R1
mov A,#00h
CRCADD: Add A,@R0
inc R0
DJNZ R1,CRCADD ;校驗和不正確
mov R8,16h
CJNE A,R8,ERR
mov R0,13H
mov R1,14H
mov R2,15H
Call DoCMD
clr ES
mov R2,11H
inc R2
inc R2
mov A,R5
SUBB A,R2
mov R5,A
mov R0,#10H
Call ClearM
mov A,R5
mov R2,A
mov R1,#10H
mov A,#12H
Add A,11H
mov R0,A
call MoveM
setb ES
jmp ExitExcu
ERR: ;錯誤
clr ES
dec R5
mov A,R5
mov R2,A
mov R0,#11H
mov R1,#10H
Call MoveM
add A,#10H
mov R0,A
mov @R0,#00H
setb ES
ExitExcu:
ret
;外部中斷0
Int0Add:
clr ex0
JNB F0,AddR1
CJNE R6,#04H,AddR3
inc R3
CJNE R3,#02h,Exit0
mov R3,#00H
JMP Exit0
AddR3:
inc INITDAT
mov A,#63H
CJNE A,INITDAT,Exit0
mov INITDAT,#00H
JMP Exit0
AddR1:
inc R6
CJNE R6,#06h,Exit0
mov R6,#00H
Exit0:
setb ex0
reti
;外部中斷1
Int1Ent:
clr ex1
CJNE R6,#00H,Next01
setb TR0
JMP Exit1
Next01:
CJNE R6,#01H,Next02
clr TR0
JMP Exit1
Next02:
CJNE R6,#02H,Next03
mov R4,#00H
JMP Exit1
Next03:
CJNE R6,#03H,NextOther
CJNE R3,#00H,MODE1
mov R4,#00h
mov R7,#20h
setb TR0
JMP Exit1
MODE1:
mov A,INITDAT
mov R4,A
JMP Exit1
NextOther:
CPL F0
Exit1:
setb ex1
reti
;串行中斷 實現簡單的置數及計數啟停
RecvDat:
CLR ES
mov 30H,R0
jnb TI,RiCom
CLR TI
RiCom:
jnb RI,ExitCom
CLR RI
CJNE R5,#10H,RiNext
jmp ExitCom
RiNext:
mov A,R5
add A,#10H
mov R0,A
mov A,SBUF
mov @R0,A
inc R5
ExitCom:
mov R0,30H
Setb ES
reti
;定時器中斷0
TimeSec:
mov TL0,#00h
mov TH0,#00h
DJNZ R7,ExitSec
mov R7,#20H
CJNE R3,#00H,DecR0
inc R4
CJNE R4,#3Ch,ExitSec
mov R4,#00h
JMP ExitSec
DecR0:
dec R4
CJNE R4,#00h,ExitSec
mov R4,INITDAT
ExitSec:
reti
;清指定位置內存 R2字節數 R0起始位置
ClearM:
CJNE R2,#00,Clear
jmp ExitClear
Clear:
mov @R0,#00H
inc R0
DJNZ R2,ClearM
ExitClear:
ret
;移指定位置內存 R2字節數 R0源地址 R1目的地址
MoveM:
CJNE R2,#00H,NextM
jmp ExitMove
NextM:
mov R11,R2
mov R12,R0
Move:
mov A,@R0
mov @R1,A
inc R0
inc R1
DJNZ R2,Move
mov A,R12
subb A,#10H
mov R2,A
mov A,R5
ADD A,#10H
mov R0,A
Call ClearM
ExitMove:
ret
;執行命令 R0命令 R1擴展命令字節1 R2擴展命令字節2
DoCMD:
CJNE R0,#00H,Do01H ;啟動
setb TR0
jmp ExitDo
Do01H:
CJNE R0,#01H,Do02H ;暫停
clr TR0
jmp ExitDo
Do02H:
CJNE R0,#02H,Do03H ;清零
mov R4,#00h
jmp ExitDo
Do03H:
CJNE R0,#03H,Do04H ;復位
CJNE R3,#00H,MODE01
mov R4,#00h
setb TR0
jmp ExitDo
MODE01:
mov R4,INITDAT
setb TR0
jmp ExitDo
Do04H:
CJNE R0,#04H,Do05H ;模式
mov A,R1
mov R3,A
jmp ExitDo
Do05H:
CJNE R0,#05H,ExitDo ;初值
mov INITDAT,R1
jmp ExitDo
ExitDo:
ret
;秒級延時子程序以130050us為單位,最大為130050us
DelaySs:
mov r9,#0ffh
ss:
mov r8,#0ffh
djnz r8,$
djnz r9,ss
djnz r10,DelaySs
ret
;毫秒延時子程序以510us為單位,最大為130050us
DelayMs:
mov r8,#0ffh
djnz r8,$
djnz r9,DelayMs
ret
;微秒延時以2us為單位,最大為510us
DelayUs:
djnz r8,$
ret
org 0400h
;共陽極數碼管數模0~9、A~F
DB 0C0h,0F9H,0A4H,0B0H,099H,092H,082H,0F8H
DB 080H,090H,088H,083H,0C6H,0A1H,086H,08EH
end
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -