📄 suaizhiji.asm
字号:
;==========================
;BANK 0
R0 EQU 0X00
R1 EQU 0X01
R2 EQU 0X02
R3 EQU 0X03
C EQU 0X00
DC EQU 0X01
Z EQU 0X02
PS0 EQU 0X05
PS1 EQU 0X06
IOCPAGE EQU 0X07
R4 EQU 0X04
R5 EQU 0X05
SWITCHLED EQU 0X00
BEEP EQU 0X01
R6 EQU 0X06
ZHENGFAN EQU 0X01
PWM EQU 0X02
MODELED EQU 0X07
INTENSITYLED EQU 0X05 ;up down
REVERSELED EQU 0X06 ;zheng fan
R7 EQU 0X07
R8 EQU 0X08
R9 EQU 0X09
RA EQU 0X0A
RAMP EQU 0X04
RB EQU 0X0B
RC EQU 0X0C
RD EQU 0X0D
RE EQU 0X0E
IOCE EQU 0X0E
RF EQU 0X0F
R3_BUF EQU 0X10
R4_BUF EQU 0X11
ACC_BUF EQU 0X12
RTMP1 EQU 0X15
RTMP2 EQU 0X16
RTMP3 EQU 0X17
RTMP4 EQU 0X18
RTMP5 EQU 0X19
INRTMP1 EQU 0X1A
INRTMP2 EQU 0X1B
INRTMP3 EQU 0X1C
INRTMP4 EQU 0X1D
;PWMFLG EQU 0X1F
TFLAG1 EQU 0X1E
AUTOPWMUP EQU 0X00
WAITF EQU 0X01
PWMEN EQU 0X02
BEEPF EQU 0X03
MODELEDF EQU 0X04
REVERSELEDF EQU 0X05
INTENSITYLEDF EQU 0X06
KOFLAG EQU 0X07
;buff_r EQU 0X20
;buff_g EQU 0X21
;buff_b EQU 0X22
PWMINC EQU 0X21
PWMEND EQU 0X22
TIMFLAG equ 0x23
st200us equ 0x00
MODECHAN equ 0x01
ST08MSF equ 0x03
poweron equ 0x04
LEDPOWBUF EQU 0X25
TIMEBUF EQU 0X26
RLDAT EQU 0X27
WAITCT EQU 0X28
RUNMODE EQU 0X29
BEEPTIME EQU 0X2A
KEYREF EQU 0X2B
KFIRSTF EQU 0X05 ;THE "05" BIT
PWMBAK EQU 0X2C
PWMBUF EQU 0X2D
;=================
ORG 0X0000
;================
NOP
NOP
DISI
CLR R4
CLR R3
BC R3,PS0
BC R3,PS1
JMP RESET
;=================
ORG 0X0008
;=================
INTDET:
MOV ACC_BUF,A ;FOR PUSH A
SWAP ACC_BUF
SWAPA R3
MOV R3_BUF,A ;FOR PUSH 0X03
MOV A,R4
MOV R4_BUF,A ;FOR PUSH 0X04
CLR R3
CLR R4
MOV A,@0X9C ;中断里面是100次
MOV R1,A
JBC RF,0X00
JMP TCC_INT ;DET TCC_IRQ
INTDET_R:
MOV A,@00000000B
MOV RF,A
MOV A,R4_BUF
MOV R4,A
SWAPA R3_BUF
MOV R3,A
SWAPA ACC_BUF
RETI
;一次的时间是100us.
TCC_INT:
JBS TFLAG1,PWMEN ;先处理PWM的输出.
JMP TCC_INT01
INC PWMEND
MOV A,PWMEND
SUB A,PWMBUF ;相等就转换到低电平
JBC R3,2
BC R6,PWM
MOV A,PWMEND ;总长度2.7豪秒
SUB A,@27
JBS R3,2
JMP TCC_INT01
CLR PWMEND
BS R6,PWM
TCC_INT01:
JBS TIMFLAG,POWERON ;开机状态下电源灯总亮
JMP TCC_INT012
INC LEDPOWBUF
MOV A,LEDPOWBUF ;电源灯5ms长度时间内1ms供电
SUB A,@10
JBC R3,2
BS R5,SWITCHLED
MOV A,LEDPOWBUF
SUB A,@50
JBS R3,2
JMP TCC_INT011
CLR LEDPOWBUF
BC R5,SWITCHLED
TCC_INT011:
MOV A,LEDPOWBUF ;是0也照样取反
JBC R3,2
JMP TCC_INT0A
MOV RTMP1,A
TCC_INT0B:
MOV A,@10
SUB RTMP1,A
JBC R3,2
JMP TCC_INT0A ;查找被10整除的数,1ms取反一次.
JBC R3,C
JMP TCC_INT0B
JMP TCC_INT012
TCC_INT0A1:
MOV A,@0B10000000
JMP TCC_INT0A3
TCC_INT0A2:
MOV A,@0B01000000
JMP TCC_INT0A3
TCC_INT0A:
JBC TFLAG1,MODELEDF
JMP TCC_INT0A1
JBC TFLAG1,REVERSELEDF
JMP TCC_INT0A2
JBS TFLAG1,INTENSITYLEDF
JMP TCC_INT012
MOV A,@0B00100001
TCC_INT0A3:
XOR R6,A
TCC_INT012:
INC TIMEBUF ;产生8毫秒的标志位
MOV A,TIMEBUF
SUB A,@80
JBS R3,2
JMP TCC_INT02
CLR TIMEBUF
BS TIMFLAG,ST08MSF
JBS TFLAG1,WAITF
JMP TCC_INT02
MOV WAITCT,WAITCT
JBC R3,Z
JMP TCC_INT02
INC WAITCT
TCC_INT02:
JBS TFLAG1,BEEPF ;按键音的处理
JMP TCC_INT03
MOV A,@0B00000001
XOR TIMFLAG,A
JBS TIMFLAG,ST200US
JMP TCC_INT03
MOV A,@0B00000010
XOR R5,A
TCC_INT03:
JMP INTDET_R
;==================FOR RESET THE MCU
RESET:
MOV A,@00000001B
CONTW ;TCC=256US
MOV A,@01110111B ;
IOW rb
MOV A,@10000000B ;开看门狗
IOW ioce
MOV A,@00011001B ;
IOW R6 ;
MOV A,@00001100B ;
IOW R5 ;
;==================RESET COMMAN REGISTER AND REGISTER(BANK0,1)
MOV A,@10H
MOV R4,A
LOOP1:
CLR R0
INC R4
MOV A,@00111111B
AND A,R4
SUB A,@0X2F
JBS R3,Z
JMP LOOP1
LOOP2:
CLR R4
MOV A,@00000001B ;TCC ENABLE
IOW RF
CALL INI_BUFF
BS TFLAG1,BEEPF ;按键音的处理
MOV A,@64
MOV BEEPTIME,A
ENI
;============ MAIN START
HAH2:
WDTC
JBC TIMFLAG,ST08mSF ;8豪秒的时间处理
JMP RLROUT1
HAH3:
JBS TFLAG1,WAITF
JMP HAH4
MOV WAITCT,WAITCT
JBS R3,Z
JMP HAH4
JMP WAITRT
HAH4:
JMP HAH2
WAITRT:
BC TFLAG1,WAITF
SWAPA RLDAT
AND A,@0X0F
MOV RTMP1,A
JBC R3,2
JMP WAITR0
MOV A,RTMP1
XOR A,@1
JBC R3,2
JMP WAITR1
MOV A,RTMP1
XOR A,@2
JBC R3,2
JMP WAITR2
MOV A,RTMP1
XOR A,@3
JBC R3,2
JMP WAITR3
JMP HAH4
;
WAITR3:
JBS TIMFLAG,poweron
JMP WAITR31
MOV A,RUNMODE
AND A,@3
SUB A,@2
JBS R3,2
JMP WAITR31
MOV A,RLDAT
AND A,@3
MOV RTMP1,A
JBC R3,2
JMP WAITR3A
MOV A,RTMP1
XOR A,@1
JBC R3,2
JMP WAITR3B
MOV A,RTMP1
XOR A,@2
JBC R3,2
JMP WAITR3C
MOV A,RTMP1
XOR A,@3
JBC R3,2
JMP WAITR3D
JMP HAH4
WAITR3A:
MOV A,@0X31
JMP WAITA1
WAITR3B:
BC TFLAG1,PWMEN ;停止输出.
BC R6,PWM
MOV A,@0X32
WAITR3B1:
MOV RLDAT,A
MOV A,@0X83
MOV WAITCT,A ;SET 1000mS
BS TFLAG1,WAITF
JMP HAH4
WAITR3C:
MOV A,@0B00000010
XOR R6,A ;正反转输出
MOV A,@0X33
JMP WAITR3B1
WAITR3D:
BS TFLAG1,PWMEN ;
JMP WAITR2
WAITR31:
JMP HAH4
;输出10和17
WAITR2:
CLR PWMEND
MOV A,@10
MOV PWMBUF,A
BS R6,PWM
BS TIMFLAG,MODECHAN ;开始工作,具体模式看设定.
MOV A,RUNMODE
AND A,@3
SUB A,@2
JBS R3,2
JMP HAH4
MOV A,@0X30
WAITA1:
MOV RLDAT,A
BS TFLAG1,WAITF
MOV A,@0X06
MOV WAITCT,A ;SET 2000mS
JMP HAH4
;输出9和18延时300ms
WAITR1:
MOV A,@9
MOV PWMBUF,A
MOV A,@0X0F
AND RLDAT,A ;WAITF_DAT=0H
MOV A,@0X20
JMP WAITR01
;1秒钟的时间到.输出8和19延时300ms
WAITR0:
BS TFLAG1,PWMEN ;先处理PWM的输出.
MOV A,@8
MOV PWMBUF,A
MOV A,@0X0F
AND RLDAT,A ;WAITF_DAT=0H
MOV A,@0X10
;延时300ms
WAITR01:
OR RLDAT,A ;WAITF_DAT=1H
MOV A,@0Xda;C0;DA
MOV WAITCT,A ;SET 500mS WAIT FOR RV POWER STABLE
BS TFLAG1,WAITF
BS R6,PWM
CLR PWMEND
JMP HAH4
RLROUT1:
BC TIMFLAG,ST08mSF
JBS TFLAG1,BEEPF ;按键音的处理,延时的时间到没有.
JMP RLROUT2
DJZ BEEPTIME
JMP RLROUT2
BC TFLAG1,BEEPF
BC TFLAG1,MODELEDF
BC TFLAG1,REVERSELEDF
BC TFLAG1,INTENSITYLEDF
BC R5,BEEP
BS R6,MODELED
BS R6,REVERSELED
BS R6,INTENSITYLED
RLROUT2:
JBS TIMFLAG,MODECHAN ;在自动模式下边,程序的运行是500ms改变一次数据的.
JMP RLROUT3
MOV A,@0B00000100
ADD RUNMODE,A
JBS R3,C
JMP RLROUT3
MOV A,RUNMODE
AND A,@3
MOV RTMP1,A
;JBC R3,2
;JMP RLROUT3
MOV A,RTMP1
XOR A,@1
JBC R3,2
JMP RLROUT201
MOV A,RTMP1
XOR A,@2
JBC R3,2
JMP RLROUT202
JMP RLROUT3
RLROUT201:
JBC TFLAG1,AUTOPWMUP
JMP RLROUT211
INC PWMBUF
MOV A,PWMBUF
SUB A,@23
JBC R3,2
BS TFLAG1,AUTOPWMUP
JMP RLROUT3
RLROUT211:
DEC PWMBUF
MOV A,PWMBUF
SUB A,@9
JBC R3,2
BC TFLAG1,AUTOPWMUP
JMP RLROUT3
RLROUT202:
MOV A,PWMBAK
SUB A,PWMBUF ;IF PWMBUF > PWMBAK R3,C = 1
JBC R3,C
JMP RLROUT3
INC PWMBUF
INC PWMBUF
JMP RLROUT3
;检测键盘
RLROUT3:
MOV A,@11100110B
OR A,R6 ;DET THE KEY OPRATE
SUB A,@0FFH
JBS R3,Z ;DETECT "Z" FLAG
JMP SCANKEY
JBS R5,0X02
JMP SCANKEY
JBS R5,0X03
JMP SCANKEY
;键盘放开一切标志恢复.
RL1RT1:
BC KEYREF,KFIRSTF ;RESET KFIRSTF
BC TFLAG1,KOFLAG ;RESET THE KOFLAG
KEYRLR:
JMP HAH3
SCANKEY:
JBC TFLAG1,KOFLAG ;键盘已经有按下
JMP KEYRLR
;JBC CONFLAG,FORBIDF ;禁止键盘
;JMP KEYRLR
CALL DETKDT
MOV A,@0XFF
SUB A,RTMP4
JBS R3,Z
JMP KEYRL2 ;DET THE KEY, IF NOT "0FFH"
KEYRL1:
BC KEYREF,KFIRSTF ;RESET THE KFIRSTF
JMP KEYRLR
KEYRL2:
JBC KEYREF,KFIRSTF
JMP KEYRL21
MOV A,RTMP4
OR A,@00100000B ;SET THE KFIRSTF
MOV KEYREF,A
JMP KEYRLR
KEYRL21:
MOV A,KEYREF
AND A,@00000111B
SUB A,RTMP4
JBS R3,Z ;DET "Z" FLAG
JMP KEYRL1
MOV A,@01000000B
ADD KEYREF,A
JBS R3,C ;DET "C" FLAG
JMP KEYRLR
MOV A,@00000111B
AND KEYREF,A
BS TFLAG1,KOFLAG ;产生键盘的标志
;CALL SOUND_OF1
;JMP KEYRLR
KEYRL22:
MOV A,KEYREF
AND A,@0X07
MOV RTMP1,A
JBC R3,2
JMP KEY_ONOF ;0
MOV A,RTMP1
SUB A,@1
JBC R3,2
JMP KEY_MODE ;1
MOV A,RTMP1
SUB A,@2
JBC R3,2
JMP KEY_TRAN ;2
MOV A,RTMP1
SUB A,@3
JBC R3,2
JMP KEY_UP ;3
MOV A,RTMP1
SUB A,@4
JBC R3,2
JMP KEY_DOWN ;4
JMP KEYRLR ;NOP
;开关机键盘
KEY_ONOF:
CALL SOUND_OF1
MOV A,@0B00010000
XOR TIMFLAG,A
JBC TIMFLAG,poweron
JMP POW_ON
;关机了 所有的运转都停止 灯也灭
CALL INI_BUFF
clr PWMINC
;clr PWMBAK
JMP KEYRL3
;1秒钟以后启动电机
POW_ON:
CLR RUNMODE
MOV A,@10
MOV PWMBAK,A
POW_ON_1:
BS TFLAG1,WAITF
MOV A,@0X0F
AND RLDAT,A ;WAITF_DAT=0H
MOV A,@0X06;83
MOV WAITCT,A ;SET 2000mS WAIT FOR RV POWER STABLE
BC TIMFLAG,MODECHAN ;还没开始工作
JMP KEYRL3
KEYRL3:
JMP HAH3
;模式转换键盘
KEY_MODE:
JBS TIMFLAG,poweron
JMP KEYRL3
BS TFLAG1,MODELEDF
CALL SOUND_OF1
INC RUNMODE
MOV A,RUNMODE
AND A,@3
MOV RTMP1,A
XOR A,@1
JBC R3,2
JMP MODE001
MOV A,RTMP1
XOR A,@2
JMP MODE002
MODE000:
MOV A,@0XFC
AND RUNMODE,A
CLR PWMINC
JMP POW_ON_1
MODE002:
MOV A,@10
MOV PWMBAK,A
MOV PWMBUF,A
CLR PWMINC
MODE001:
JMP POW_ON_1
;方向切换键盘
KEY_TRAN:
JBS TIMFLAG,poweron ;关机时候没作用
JMP KEYRL3
MOV A,RUNMODE ;模式2的时候是没作用的
AND A,@3
XOR A,@2
JBC R3,2
JMP KEYRL3
BS TFLAG1,REVERSELEDF
CALL SOUND_OF1
MOV A,@0B00000010
XOR R6,A
BC TFLAG1,PWMEN ;先处理PWM的输出.
BC R6,PWM
JMP POW_ON_1
;力度加
KEY_UP:
JBS TIMFLAG,poweron ;关机时候没作用
JMP KEYRL3
MOV A,RUNMODE ;模式1的时候是没作用的
AND A,@3
XOR A,@1
JBC R3,2
JMP KEYRL3
MOV A,PWMINC
SUB A,@4
JBC R3,2
JMP KEYRL3
INC PWMINC
KEY_UP01:
BS TFLAG1,INTENSITYLEDF
CALL SOUND_OF1
CLR PWMEND
CALL PWMDEC
MOV PWMBUF,A
MOV PWMBAK,A
;BS R6,PWM
JMP KEYRL3
;力度减
KEY_DOWN:
JBS TIMFLAG,poweron ;关机时候没作用
JMP KEYRL3
MOV A,RUNMODE ;模式1的时候是没作用的
AND A,@3
XOR A,@1
JBC R3,2
JMP KEYRL3
MOV PWMINC,PWMINC
JBC R3,2
JMP KEYRL3
DEC PWMINC
JMP KEY_UP01
PWMDEC:
MOV A,PWMINC
AND A,@7
MOV RTMP1,A
mov a,rtmp1
JBC R3,2
RETL @10
MOV A,RTMP1
XOR A,@1
JBC R3,2
RETL @13
MOV A,RTMP1
XOR A,@2
JBC R3,2
RETL @16
MOV A,RTMP1
XOR A,@3
JBC R3,2
RETL @20
MOV A,RTMP1
XOR A,@4
JBC R3,2
RETL @23
RETL @10
SOUND_OF1:
BS TFLAG1,BEEPF ;按键音的处理
MOV A,@32
MOV BEEPTIME,A
RET
DETKDT:
JBS R6,0X03
JMP DETKDT01
JBS R5,0X02
JMP DETKDT02
JBS R5,0X03
JMP DETKDT03
JBS R6,0X00
JMP DETKDT04
JBS R6,0X04
JMP DETKDT05
MOV A,@0XFF
MOV RTMP4,A
DETKDTEND:
RET
DETKDT01:
MOV A,@1 ;MODE KEY
DETKDT011:
MOV RTMP4,A
JMP DETKDTEND
DETKDT02:
MOV A,@2
JMP DETKDT011 ;转向 KEY
DETKDT03:
MOV A,@3
JMP DETKDT011 ;UP KEY
DETKDT04:
MOV A,@4
JMP DETKDT011 ;DOWN KEY
DETKDT05:
MOV A,@0
JMP DETKDT011 ;POWER KEY
INI_BUFF:
BS R5,SWITCHLED
BS R6,MODELED
BS R6,REVERSELED
BS R6,INTENSITYLED
;BC TFLAG1,PWMEN ;先处理PWM的输出.
BC R6,PWM
BC R6,ZHENGFAN
CLR RUNMODE
CLR PWMEND
CLR PWMBUF
CLR PWMBAK
MOV A,@0X88
AND TFLAG1,A
CLR WAITCT
CLR TIMFLAG
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -