📄 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 + -