📄 sd.asm
字号:
list p=16f877A
include "p16f877A.inc"
W_TEMP equ 25H
RECDATA equ 26H
XUANZHUAN equ 27H
SHANGXIA equ 28H
STATUS_TEMP EQU 29H
PCLATH_TEMP EQU 30H
TEMP EQU 31H
CNT EQU 32H
TEMP1 EQU 33H
TEMP2 EQU 34H
SOU EQU 35H
SOUH EQU 36H
RLTH EQU 37H
RLT EQU 38H
RESU3 EQU 39H
RESU2 EQU 40H
RESU1 EQU 41H
RESU0 EQU 42H
HIGHDATA EQU 43H
SDNUM EQU 44H
NUM EQU 45H
DISPLAYDATA EQU 72H
ADDR EQU 70H
org 000h
GOTO STARTT
org 004h
GOTO SERV
CONVERT
ADDWF PCL,1
retlw b'00000011' ;0
retlw b'10011111' ;1
retlw b'00100101' ;2
retlw b'00001101' ;3
retlw b'10011001' ;4
retlw b'01001001' ;5
retlw b'01000001' ;6
retlw b'00011111' ;7
retlw b'00000001' ;8
retlw b'00001001' ;9
retlw b'00010001' ;A
retlw b'11000001' ;B
retlw b'01100011' ;C
retlw b'10000101' ;D
retlw b'01100001' ;E
retlw b'01110001' ;F
SERV
CLRWDT
;开始保护现场
MOVWF W_TEMP
SWAPF STATUS,w
CLRF STATUS
MOVWF STATUS_TEMP
MOVF PCLATH,w
MOVWF PCLATH_TEMP
CLRF PCLATH
intserv
CLRWDT
BANKSEL INTCON
BCF INTCON,GIE
BTFSS INTCON,INTF
GOTO OVER
BCF INTCON,INTF
;SLEEP
MOVF PORTB,w
MOVWF RECDATA
BCF RECDATA,7
BCF RECDATA,6
BCF RECDATA,5
BCF RECDATA,0
MOVF RECDATA,w
BTFSC STATUS,Z
GOTO OVER
;开始判断输入的指令
CLRWDT
MOVF RECDATA,w
SUBLW 0x1E
BTFSC STATUS,Z
GOTO STOP_XUANZHUAN
CLRWDT
MOVF RECDATA,w
SUBLW 0x1C
BTFSC STATUS,Z
GOTO STOPALL
CLRWDT
MOVF RECDATA,w
SUBLW 0x1A
BTFSC STATUS,Z
GOTO STOPVALUE
CLRWDT
MOVF RECDATA,w
SUBLW 0x18
BTFSC STATUS,Z
GOTO OPENVALUE1
CLRWDT
MOVF RECDATA,w
SUBLW 0x16
BTFSC STATUS,Z
GOTO OPENVALUE2
CLRWDT
MOVF RECDATA,w
SUBLW 0x14
BTFSC STATUS,Z
GOTO CLOSEFAN
CLRWDT
MOVF RECDATA,w
SUBLW 0x12
BTFSC STATUS,Z
GOTO OPENFAN
CLRWDT
MOVF RECDATA,w
SUBLW 0x10
BTFSC STATUS,Z
GOTO CLOSEPUMP
CLRWDT
MOVF RECDATA,w
SUBLW 0x0E
BTFSC STATUS,Z
GOTO OPENPUMP
CLRWDT
MOVF RECDATA,w
SUBLW 0x0C
BTFSC STATUS,Z
GOTO MOVEDOWN
CLRWDT
MOVF RECDATA,w
SUBLW 0x0A
BTFSC STATUS,Z
GOTO MOVEUD
CLRWDT
MOVF RECDATA,w
SUBLW 0x08
BTFSC STATUS,Z
GOTO MOVEUP
CLRWDT
MOVF RECDATA,w
SUBLW 0x06
BTFSC STATUS,Z
GOTO MOVERIGHT
CLRWDT
MOVF RECDATA,w
SUBLW 0x04
BTFSC STATUS,Z
GOTO MOVELR
CLRWDT
MOVF RECDATA,w
SUBLW 0x02
BTFSC STATUS,Z
GOTO MOVELEFT
CLRWDT
GOTO OVER
STOP_XUANZHUAN ;左右关闭旋转
BSF PORTD,0 ;LEFT
BSF PORTD,1 ;RIGHT
BSF PORTD,2 ;UP
BSF PORTD,3 ;DOWN
CLRF SHANGXIA
CLRF XUANZHUAN
GOTO OVER
STOPALL ;全部停止
movlw 0xff
movwf PORTD
CLRF XUANZHUAN
CLRF SHANGXIA
GOTO OVER
STOPVALUE ;关闭电磁阀
BSF PORTD,6
BSF PORTD,7
GOTO OVER
OPENVALUE1 ;打开电磁阀一
BSF PORTD,6
SLEEP
BCF PORTD,7
GOTO OVER
OPENVALUE2 ;打开电磁阀二
BSF PORTD,7
SLEEP
BCF PORTD,6
GOTO OVER
OPENFAN ;打开风机
BCF PORTD,5
GOTO OVER
CLOSEFAN ;关闭风机
BSF PORTD,5
GOTO OVER
OPENPUMP ;打开水泵
BCF PORTD,4
SLEEP
GOTO OVER
CLOSEPUMP ;关闭水泵
BSF PORTD,4
GOTO OVER
MOVEUP ;向上
CLRF SHANGXIA
BSF SHANGXIA,0
GOTO OVER
MOVEUD ;向下
CLRF SHANGXIA
BSF SHANGXIA,1
GOTO OVER
MOVEDOWN ;垂直中间
CLRF SHANGXIA
BSF SHANGXIA,2
GOTO OVER
MOVELEFT ;向左
CLRF XUANZHUAN
BSF XUANZHUAN,0
GOTO OVER
MOVELR ;水平中间
CLRF XUANZHUAN
BSF XUANZHUAN,1
GOTO OVER
MOVERIGHT ;向右
CLRF XUANZHUAN
BSF XUANZHUAN,2
OVER
BANKSEL PORTA
;开始现场恢复
MOVF PCLATH_TEMP,w
MOVWF PCLATH
SWAPF STATUS_TEMP,w
MOVWF STATUS
SWAPF W_TEMP,F
SWAPF W_TEMP,w
BANKSEL INTCON
BSF INTCON,GIE
RETFIE
STARTT
BANKSEL CMCON
MOVLW 0X07
MOVWF CMCON
BANKSEL PORTA
MOVWF PORTA
BANKSEL XUANZHUAN
CLRF XUANZHUAN
CLRF SHANGXIA
BANKSEL INTCON
BSF INTCON,PEIE
BSF INTCON,GIE
BSF INTCON,INTE
BCF INTCON,T0IF
BANKSEL OPTION_REG
MOVLW B'11001100'
MOVWF OPTION_REG
CLRWDT
banksel ADCON1
MOVLW B'00000111'
MOVWF ADCON1
BANKSEL TRISD
CLRF TRISD
MOVLW 0XFF
MOVWF TRISB
BCF TRISB,5
BCF TRISE,2
BSF TRISA,0
BSF TRISA,1
bsf TRISA,2
BSF TRISA,3
BSF TRISA,4
BSF TRISC,0
BSF TRISC,1
BSF TRISC,2
BCF TRISC,3
BSF TRISC,4
BCF TRISC,5
BSF TRISC,6
BSF TRISE,0
BSF TRISE,1
BANKSEL PORTD
MOVLW 0XFF
MOVWF PORTD
BSF PORTB,5
CLRF ADDR
CALL READ
CALL TOBCD
MOVLW 0X00
MOVWF SDNUM
CALL CONVERT
MOVWF RESU3
CALL PLAY
START
CLRWDT
MOVF PORTA,W
MOVWF 21H
BCF 21H,0
BCF 21H,1
BCF 21H,2
BCF 21H,3
BCF 21H,5
BCF 21H,6
BCF 21H,7
MOVF 21H,W
BTFSC STATUS,Z
GOTO XZ
SLEEP
BTFSC PORTA,4
GOTO SHOUDONG
XZ
SLEEP
MOVF XUANZHUAN,w
BTFSS STATUS,Z ;判断是否要求有左右旋转
GOTO OP
GOTO START2
START2
CLRWDT
SLEEP
MOVF SHANGXIA,w
BTFSS STATUS,Z
GOTO OP2
GOTO START
OP
CLRWDT
BTFSC XUANZHUAN,0
GOTO LEFT
BTFSC XUANZHUAN,2
GOTO RIGHT
BTFSC XUANZHUAN,1
GOTO MIDDLE
OP2
CLRWDT
BTFSC SHANGXIA,0
GOTO UP
BTFSC SHANGXIA ,1
GOTO LEVER
BTFSC SHANGXIA,2
GOTO DOWN
LEFT
CLRWDT
BTFSC PORTA,0
GOTO STOP
GOTO TOLEFT
RIGHT
CLRWDT
BTFSC PORTA,1
GOTO STOP
GOTO TORIGHT
STOP
CLRWDT
CLRWDT
BSF PORTD,0
SLEEP
BSF PORTD,1
SLEEP
CLRF XUANZHUAN
GOTO START2
TOLEFT
CLRWDT
BSF PORTD,1
SLEEP
BCF PORTD,0
SLEEP
GOTO START2
TORIGHT
CLRWDT
BSF PORTD,0
SLEEP
BCF PORTD,1
SLEEP
GOTO START2
MIDDLE
CLRWDT
BTFSC PORTA,1
GOTO TOLEFT ;如果碰到右边的行程开关
BTFSC PORTA,0
GOTO TORIGHT ;如果碰到左边的行程开关
BTFSS PORTD,1 ;检测是否向右转
GOTO START2 ; YES TO RIGHT
btfss PORTD,0 ;检测是否向左转
goto START2 ; YES TO LEFT
GOTO TOLEFT ;GO LEFT
UP
CLRWDT
BTFSC PORTA,2
GOTO UP_DOWNSTOP
GOTO TOUP
DOWN
CLRWDT
BANKSEL PORTD
BTFSC PORTA,3
GOTO UP_DOWNSTOP
GOTO TODOWN
UP_DOWNSTOP
CLRWDT
BANKSEL PORTB
BSF PORTD,2
SLEEP
BSF PORTD,3
SLEEP
CLRF SHANGXIA
GOTO START
TOUP
CLRWDT
BSF PORTD,3
SLEEP
BCF PORTD,2
SLEEP
GOTO START2
TODOWN
CLRWDT
BSF PORTD,2
SLEEP
BCF PORTD,3
SLEEP
GOTO START
LEVER
CLRWDT
BTFSC PORTA,2
GOTO TODOWN
BTFSC PORTA,3
GOTO TOUP
BTFSS PORTD,2
GOTO START
btfss PORTD,3
goto START
GOTO TOUP
GOTO START
SHOUDONG
BANKSEL SDNUM
MOVLW D'1'
MOVWF SDNUM
CLRWDT
BANKSEL INTCON
BCF INTCON,GIE
BANKSEL PORTD
CLRF SHANGXIA
CLRF XUANZHUAN
MOVLW 0XFF
MOVWF PORTD
SLEEP
BCF PORTB,5
BSF PORTE,2
SLEEP
MOVLW D'1'
CALL CONVERT
MOVWF RESU3
CALL PLAY
GOTO AUTO
AUTO
CLRWDT
MOVF PORTA,W
MOVWF 21H
BCF 21H,0
BCF 21H,1
BCF 21H,2
BCF 21H,3
BCF 21H,5
BCF 21H,6
BCF 21H,7
MOVF 21H,W
BTFSC STATUS,Z
GOTO RCTEXT
sleep
sleep
BTFSC PORTA,4
GOTO ZIDONG
RCTEXT ;检测RC口是否有按键按下
BANKSEL INTCON
BCF INTCON,INTF
BANKSEL PORTA
MOVF PORTC,W
MOVWF 21H
BCF 21H,4
BCF 21H,7
BCF 21H,5
MOVF 21H,W
BTFSC STATUS,Z
GOTO AUTO
GOTO AUTOSTART ;RC口是有按键按下
AUTOSTART
sleep
sleep
BTFSC PORTC,0
GOTO SW1
BTFSC PORTC,1
GOTO SW2
BTFSC PORTC,2
GOTO SW3
BTFSC PORTC,6
GOTO SW4
GOTO AUTO
SW1
MOVF SDNUM,W
SUBLW 0x0A
BTFSS STATUS,Z
GOTO SDSTART
GOTO AUTO
SDSTART
MOVF SDNUM,W
SUBLW 0x01
BTFSC STATUS,Z
GOTO SDLEFT
MOVF SDNUM,W
SUBLW 0x02
BTFSC STATUS,Z
GOTO SDRIGHT
MOVF SDNUM,W
SUBLW 0x03
BTFSC STATUS,Z
GOTO SDUP
MOVF SDNUM,W
SUBLW 0x04
BTFSC STATUS,Z
GOTO SDDOWN
MOVF SDNUM,W
SUBLW 0x05
BTFSC STATUS,Z
BCF PORTD,4
MOVF SDNUM,W
SUBLW 0x06
BTFSC STATUS,Z
BCF PORTD,5
MOVF SDNUM,W
SUBLW 0x07
BTFSC STATUS,Z
GOTO SDVALUE1
MOVF SDNUM,W
SUBLW 0x08
BTFSC STATUS,Z
GOTO SDVALUE2
GOTO AUTO
SDVALUE1
BSF PORTD,7
SLEEP
BCF PORTD,6
GOTO AUTO
SDVALUE2
BSF PORTD,6
SLEEP
BCF PORTD,7
GOTO AUTO
SDLEFT
BSF PORTD,1
sleep
BCF PORTD,0
sleep
GOTO AUTO
SDRIGHT
BSF PORTD,0
sleep
BCF PORTD,1
sleep
GOTO AUTO
SDUP
BSF PORTD,3
sleep
BCF PORTD,2
sleep
GOTO AUTO
SDDOWN
BSF PORTD,2
sleep
BCF PORTD,3
sleep
GOTO AUTO
SW2
MOVF SDNUM,W
SUBLW 0x0A
BTFSC STATUS,Z
GOTO ADDNUM
MOVLW D'1'
ADDWF SDNUM,F
MOVF SDNUM,W
CALL CONVERT
MOVWF RESU3
CALL PLAY
GOTO AUTO
ADDNUM
MOVLW D'1'
ADDWF TEMP,1
CALL TOBCD
CALL PLAY
GOTO AUTO
SW3 MOVF SDNUM,W
SUBLW 0x0A
BTFSC STATUS,Z
GOTO SUBNUM
MOVF SDNUM,W
SUBLW 0X01
BTFSC STATUS,Z
GOTO AUTO
MOVLW D'1'
SUBWF SDNUM,F
MOVF SDNUM,W
CALL CONVERT
MOVWF RESU3
CALL PLAY
GOTO AUTO
SUBNUM
MOVLW D'1'
SUBWF TEMP,F
CALL TOBCD
CALL PLAY
GOTO AUTO
SW4
MOVF SDNUM,W
SUBLW 0x0A
BTFSS STATUS,Z
GOTO SDCLOSE
GOTO AUTO
SDCLOSE
MOVF SDNUM,W
SUBLW 0x01
BTFSC STATUS,Z
BSF PORTD,0
MOVF SDNUM,W
SUBLW 0x02
BTFSC STATUS,Z
BSF PORTD,1
MOVF SDNUM,W
SUBLW 0x03
BTFSC STATUS,Z
BSF PORTD,2
MOVF SDNUM,W
SUBLW 0x04
BTFSC STATUS,Z
BSF PORTD,3
MOVF SDNUM,W
SUBLW 0x05
BTFSC STATUS,Z
BSF PORTD,4
MOVF SDNUM,W
SUBLW 0x06
BTFSC STATUS,Z
BSF PORTD,5
MOVF SDNUM,W
SUBLW 0x07
BTFSC STATUS,Z
BSF PORTD,6
MOVF SDNUM,W
SUBLW 0x08
BTFSC STATUS,Z
BSF PORTD,7
GOTO AUTO
ZIDONG
BANKSEL SDNUM
MOVLW D'0'
MOVWF SDNUM
CLRWDT
BANKSEL PORTB
BCF PORTE,2
sleep
BSF PORTB,5
sleep
BANKSEL INTCON
BSF INTCON,GIE
MOVLW b'11111111'
movwf PORTD
movlw 0X00
CALL CONVERT
MOVWF RESU3
CALL WRITE
CALL PLAY
GOTO START
TOBCD
;%100
CLRF RESU0
CLRF RESU1
CLRF RESU2
CLRF SOUH
CLRF RLTH
CLRF TEMP1
CLRF TEMP2
MOVF TEMP,W
MOVWF SOU
MOVLW D'100'
MOVWF RLT
CALL CHUFA
MOVF SOU,W
CALL CONVERT
MOVWF RESU2
;%10
CLRF SOUH
CLRF RLTH
CLRF TEMP1
CLRF TEMP2
MOVF RLT,W
MOVWF SOU
MOVLW D'10'
MOVWF RLT
CALL CHUFA
MOVF SOU,W
CALL CONVERT
MOVWF RESU1
MOVF RLT,W
CALL CONVERT
MOVWF RESU0
RETURN
CHUFA
IFNDEF DUDIV1
#DEFINE DUDIV1
DUDIV MOVLW .16 ;循环16次
MOVWF CNT
CLRF TEMP2
CLRF TEMP1 ;TEMP2:TEMP1得到余数
BCF STATUS,C
RLF SOU,F
RLF SOUH,F
RLF TEMP1,F
RLF TEMP2,F
LOOP79 MOVF RLTH,W
SUBWF TEMP2,W ;检测是否余数大于除数
BTFSS STATUS,Z
GOTO NOCHK
MOVF RLT,W
SUBWF TEMP1,W ;如果高位相等则检测低位
NOCHK BTFSS STATUS,C
GOTO NOGO
MOVF RLT,W ;余数减除数
SUBWF TEMP1,F
BTFSS STATUS,C
DECF TEMP2,F
MOVF RLTH,W
SUBWF TEMP2,F
BSF STATUS,C ;结果中移入1
NOGO RLF SOU,F
RLF SOUH,F
RLF TEMP1,F
RLF TEMP2,F
DECFSZ CNT,F
GOTO LOOP79
BCF STATUS,C
RRF TEMP2,W
MOVWF RLTH
RRF TEMP1,W ;恢复余数
MOVWF RLT
RETLW 0
ENDIF
RETURN
WRITE
BANKSEL EECON1
BTFSC EECON1,RP1
GOTO $-1
BANKSEL ADDR
MOVF ADDR,W
BANKSEL EEADR
MOVWF EEADR
BANKSEL TEMP
MOVF TEMP,W
BANKSEL EEDATA
MOVWF EEDATA
BANKSEL EECON1
BCF EECON1,EEPGD
BSF EECON1,WREN
MOVLW 55H
MOVWF EECON2
MOVLW 0xAA
movwf EECON2
bsf EECON1,WR
bcf EECON1,WREN
banksel PORTB
RETURN
READ
BANKSEL ADDR
MOVF ADDR,W
BANKSEL EEADR
MOVWF EEADR
BANKSEL EECON1
BCF EECON1,EEPGD
BSF EECON1,RD
BANKSEL EEDATA
MOVF EEDATA,W
BANKSEL TEMP
MOVWF TEMP
RETURN
PLAY
MOVF TEMP,W
CALL DISPLAY
MOVF RESU0,W
CALL DISPLAY
MOVF RESU1,W
CALL DISPLAY
MOVF RESU2,W
CALL DISPLAY
MOVF RESU3,W
CALL DISPLAY
RETURN
DISPLAY
banksel TRISC
bcf TRISC,3
bcf TRISC,5
banksel PORTC
CLRF PORTC
XUNHUAN
CLRWDT
MOVWF 47H
BTFSS 47H,0
GOTO SEND00
GOTO SEND01
SEND00
CALL SENDDATA0
GOTO SEND1
SEND01
CALL SENDDATA1
GOTO SEND1
SEND1
BTFSS 47H,1
GOTO SEND10
GOTO SEND11
SEND10
CALL SENDDATA0
GOTO SEND2
SEND11
CALL SENDDATA1
GOTO SEND2
SEND2
CLRWDT
BTFSS 47H,2
GOTO SEND20
GOTO SEND21
SEND20
CALL SENDDATA0
GOTO SEND3
SEND21
CALL SENDDATA1
GOTO SEND3
SEND3
CLRWDT
BTFSS 47H,3
GOTO SEND30
GOTO SEND31
SEND30
CALL SENDDATA0
GOTO SEND4
SEND31
CALL SENDDATA1
GOTO SEND4
SEND4
CLRWDT
BTFSS 47H,4
GOTO SEND40
GOTO SEND41
SEND40
CALL SENDDATA0
GOTO SEND5
SEND41
CALL SENDDATA1
GOTO SEND5
SEND5
CLRWDT
BTFSS 47H,5
GOTO SEND50
GOTO SEND51
SEND50
CALL SENDDATA0
GOTO SEND6
SEND51
CALL SENDDATA1
GOTO SEND6
SEND6
CLRWDT
BTFSS 47H,6
GOTO SEND60
GOTO SEND61
SEND60
CALL SENDDATA0
GOTO SEND7
SEND61
CALL SENDDATA1
GOTO SEND7
SEND7
CLRWDT
BTFSS 47H,7
GOTO SEND70
GOTO SEND71
SEND70
CALL SENDDATA0
RETURN
SEND71
CALL SENDDATA1
RETURN
SENDDATA1
BSF PORTC,3
BSF PORTC,5
CALL DELAY1
CALL DELAY1
BCF PORTC,5
CALL DELAY1
CALL DELAY1
RETURN
SENDDATA0
BCF PORTC,3
BSF PORTC,5
CALL DELAY1
CALL DELAY1
BCF PORTC,5
CALL DELAY1
CALL DELAY1
RETURN
DELAY1
CLRWDT
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
RETURN
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -