📄 clean.asm
字号:
BSF MIEJUN
NOP
NOP
GOTO KEY_FENGJI
JUN_GUAN
BCF MIEJUN
NOP
NOP
;***************************************
; 风机按键检测
;***************************************
KEY_FENGJI
CALL KEYSCAN
COMF VALUE,0
BTFSC STATUS,2
GOTO FENG_NO
CALL DEL100MS
CALL KEYSCAN
COMF VALUE,0
BTFSC STATUS,2 ;检测风机按键
GOTO FENG_NO
CALL TRANSLATE
MOVF FSR,0
XORLW 03H ; 3 TO 风机键
BTFSS STATUS,2
GOTO FENG_NO
GOTO FENG_YES
FENG_YES
;___________________
MOVLW .1
ADDWF FENG_F
;___________________
FENG_L
CALL KEYSCAN
COMF VALUE,0
BTFSC STATUS,2 ;等待键放!
GOTO FENG_NO ;键放!
CALL TRANSLATE
MOVF FSR,0
XORLW 03H ; 3 TO 风机键
BTFSC STATUS,2
GOTO FENG_L ;等待键放!
GOTO FENG_NO ;键放!
FENG_NO
BTFSC FENG_F,0
GOTO FENG_KAI
GOTO FENG_GUAN
;*************************************************
; 以风机的开关为分支,分两支
;*************************************************
FENG_GUAN
;====================
BTFSC OPEN_F,0
;====================
GOTO NEW_CLOSE
BCF FENGJI
NOP
NOP
nop
BCF INTCON,TOIF
BCF INTCON,INTF
BCF INTCON,GIE
CLRF INTCON ;关掉所有中断
CALL DISPLAY
CALL TESTKEY ;调用所有按键子程序
GOTO MAIN
;====================
;从开向关跳,则先关送风电机,延时后再关排风电机
;====================
NEW_CLOSE
BSF INTCON,TOIE
BSF INTCON,INTE
BSF INTCON,GIE
CALL DISPLAY
;.......................................
;MOVF MINUTE,W ;检测延时是否到??
;SUBWF MINUTE_BUF,0
;BTFSS STATUS,2
;.......................................
;--------------------------------------
;关机延时的过程中,屏蔽了所有按键.
WWWWW
MOVLW .240 ; 240*250=1 MINUTE*BUFLL=延时时间
MOVWF CNT_MINUTE
LNNNN
DECFSZ CNT_MINUTE
GOTO GGGGG
DECFSZ BUFLL ;!%%%%% 延时时间中间寄存器。BUFL———>BUFLL
GOTO WWWWW
CLRF OPEN_F ;标明设备已关机!!!
;CLRF MINUTE ;关机延时的过程中,屏蔽了所有按键.
GOTO MAIN
GGGGG
CALL DEL250MS ;250MS
CALL TESTKEY ;调用所有按键子程序
CALL DISPLAY
GOTO LNNNN
;——————————————
DEL250MS
MOVLW .250
MOVWF CP1
WAIT .1000
DECFSZ CP1
GOTO $-2
RETURN
;--------------------------------------
;__________________________________
; 风机开
;__________________________________
FENG_KAI
;====================
BSF OPEN_F,0 ;设立开机(风纪)标志位.
;====================
BSF FENGJI
NOP
NOP
CALL DISPLAY
CLRF INTCON
BCF INTCON,TOIE ;关闭定时中断
BSF INTCON,INTE ;打开外部中断
BSF INTCON,GIE ;打开总中断
CALL TESTKEY ;调用所有按键子程序
CALL CAI_SONGFENG ;送风量采集并比较\报警
CALL CAI_PAIFENG ;排风量采集并比较\报警
GOTO MAIN
;=================================================================
DISPLAY
DECFSZ CNT_DIS ;通过CNT_DIS检测显示的是延时时间还是调速值???
GOTO DISOTHER
CALL DIS_YANSHI
MOVLW .1
MOVWF CNT_DIS
BSF F_BAOCHI,1;延时显示--->显示送风或者排风调速值,第一键不自加或自减!设立标志.表明处于延时显示状态
GOTO DOO
;~~~~~~~~~~~~~~~
;显示送风或者排风调速值
;~~~~~~~~~~~~~~~~~
DISOTHER
BTFSC F_P_S,0 ;检测显示的是送风还是排风????
GOTO OT
;CALL DIS_SONG ;两者选一,一个闪动,一个不闪.
CALL SHAN_S
GOTO DOO
OT
;CALL DIS_PAI ;两者选一,一个闪动,一个不闪.
CALL SHAN_P
DOO
RETURN
;==================================================================
;——————————————————————————————;——————————————————————————————
;==================================================================
CHENGJI
MOVLW .51
SUBWF ADRES,1
BTFSS STATUS,0
CLRF ADRES
CLRF H_B
CLRF L_B
MOVLW 8
MOVWF BIT
MOVF CHUNG,W
;MOVLW .99
BCF STATUS,0
CLOOP
RRF ADRES
BTFSC STATUS,0
ADDWF H_B
RRF H_B
RRF L_B
DECFSZ BIT
GOTO CLOOP
CHU
MOVLW 00H
MOVWF CHUH
MOVLW .204
MOVWF CHUL
CHUZI CLRF SHANGH
CLRF SHANGL
CALL DIVYIWEI
CLRF YUH
CLRF YUL
DIVLOOP BCF STATUS,0
RLF P1L
RLF P1H
RLF YUL
RLF YUH
MOVF CHUH,W
SUBWF YUH ,W
BTFSS STATUS,2
GOTO ASP
MOVF CHUL,W
SUBWF YUL,W
ASP BTFSS STATUS,0
GOTO PUP
MOVF CHUL,W
SUBWF YUL
BTFSS STATUS,0
DECF YUH
MOVF CHUH,W
SUBWF YUH
BSF STATUS,0
PUP RLF L_B
RLF H_B
DECFSZ BIT
GOTO DIVLOOP
MOVF H_B,W
MOVWF SHANGH
MOVF L_B,W
MOVWF SHANGL
RETLW 0
DIVYIWEI
MOVLW .16
MOVWF BIT
MOVF H_B,W
MOVWF P1H
MOVF L_B,W
MOVWF P1L
CLRF H_B
CLRF L_B
RETLW 0
CHU5
MOVLW 00H
MOVWF CHUH
MOVLW .11
MOVWF CHUL
MOVF 2FH,W
MOVWF H_B
MOVF 2EH,W
MOVWF L_B
CALL CHUZI
RETURN
;——————————————————————————————;——————————————————————————————
;——————————————————————————————;——————————————————————————————
WRBYTES
CLRF FLAG
MOVWF FSR ;源数据地址送F4
MOVLW 0A0H
MOVWF TXBUF ;从机器地址送TXBUF
CALL BSTART ;发送开始条件
CALL TX ;发送从机器地址
MOVF ADDR,W ;发送要写入的24L01的起始地址
MOVWF TXBUF
CALL TX
WRLOOP
MOVF 0,W
MOVWF TXBUF ;把主机的数据先放到TXBUF中去
CALL TX ;把一个字节数据写到24L01
INCF FSR,1
DECFSZ NUMBER, 1 ;已写入N个字节
GOTO WRLOOP
CALL BSTOP
RETLW 0
;**********************************
RDBYTES
MOVWF FSR ;目标数据地址送FSR
MOVLW 0A0H
MOVWF TXBUF ;从设备地址送TXBUF
CALL BSTART ;发送开始条件
CALL TX ;发送从机器地址
MOVF ADDR,W ;发送要读入数据的起始地址
MOVWF TXBUF
CALL TX
CALL BSTART ;发送开始命令
MOVLW 0A1H
MOVWF TXBUF
CALL TX ;发送读控制信号
RDLOOP
CALL RX
MOVF RXBUF,W ;从2401中读出一字节给RXBUF
MOVWF 0 ;再送给主机的寄存器
INCF FSR,1
DECFSZ NUMBER ,1 ;已读完N个字节
GOTO LOWACK ;否,发出应答信号
BSF STATUS,RP0
MOVLW B'00000000'
MOVWF TRISX
BCF STATUS,RP0
NOP
BSF SDA
BCF SCL
NOP
BSF SCL
CALL BSTOP
RETLW 0
LOWACK
BSF STATUS,RP0
MOVLW B'00000000'
MOVWF TRISX
BCF STATUS,RP0
NOP
BCF SDA ;SDA输出低电瓶,发出应答信号
NOP
BSF SCL
NOP
BCF SCL
GOTO RDLOOP ;读下一个字节
;*************开始*********************
BSTART
BSF STATUS,RP0
MOVLW B'00000000'
MOVWF TRISX
BCF STATUS,RP0
NOP
NOP
NOP
NOP
NOP
BSF SDA ;
BSF SCL ;同为高电平
NOP
NOP
NOP
NOP
BCF SDA ;在SCL=1时产生下降沿
NOP
NOP
NOP
NOP
BCF SCL
RETLW 0
;************* 写一个字节数据 *********************
TX
MOVLW 08H
MOVWF CNT ;一字节8
TXLP
BCF FLAG,0
BTFSC TXBUF,7
BSF FLAG,0
BSF STATUS,RP0
MOVLW B'00000000'
MOVWF TRISX
BCF STATUS,RP0
NOP
BTFSS TXBUF,7 ;从第七位开始送数据,从高到低.
GOTO TX0
BSF SDA
GOTO TX1
TX0 BCF SDA ;根据缓冲器的第7位去写RB,SDA
TX1 NOP
BCF SCL
NOP
NOP
NOP
NOP
NOP
BSF SCL ;SCL产生一上升沿,发送一位数据
NOP
NOP
BCF SCL
RLF TXBUF,1
DECFSZ CNT ,1 ;发送8次???一个字节是否发送完??
GOTO TXLP ;否,发送下一位.
BSF STATUS,RP0
MOVLW B'00001000' ;RB7变输入态.
MOVWF TRISX
BCF STATUS,RP0
NOP
ACK NOP
BCF SCL
NOP
NOP
NOP
BSF SCL
NOP
NOP
BTFSC SDA ;检测是否受到从机发来响应信号.
GOTO ACK
BCF SCL
RETLW 0
;**************结束********************
BSTOP
BSF STATUS,RP0
MOVLW B'00000000';
MOVWF TRISX
BCF STATUS,RP0
NOP
BCF SDA
BSF SCL
NOP
NOP
NOP
BSF SDA ;SDA产生上升沿,操作结束.
NOP
NOP
NOP
NOP
NOP
BCF SCL
NOP
RETLW 0
;**************读一个字节数据********************
RX
MOVLW 08H
MOVWF CNT ;共8位.
CLRF RXBUF
BSF STATUS,RP0
MOVLW B'00001000'
MOVWF TRISX
BCF STATUS,RP0
NOP
RXLP
BSF SCL ;**&&&&&&&&&
BCF STATUS,0
NOP
NOP
NOP
NOP
NOP
BTFSC SDA
BSF STATUS,0 ;否,1 to C ,是,C中仍为0
RLF RXBUF,1 ;C移入RXBUF.
BCF SCL
DECFSZ CNT,1
GOTO RXLP ;一个字节未完,继续.
RETLW 0
;**********************************
ROMW
MOVF BUFP,W
MOVWF BUFFER1
MOVF BUFS,W
MOVWF BUFFER1+1
MOVF BUFL,W
MOVWF BUFFER1+2
;MOVF BMIN,W
;MOVWF BUFFER1+3
MOVLW 3 ;将BUFFER1开始的3字节数据写入24C01的10H-13H
MOVWF NUMBER ;buffer1为40H,BUFFER+3为43H
MOVLW 10H ;ROM中的地址
;MOVLW 22H
MOVWF ADDR
MOVLW BUFFER1
CALL WRBYTES
RETLW 0
;*************************************
ROMR
MOVLW 3 ;将24C01的10H-13H存放的数据读入BUFFER1开始3字节中
MOVWF NUMBER
MOVLW 10H
;MOVLW 22H
MOVWF ADDR
MOVLW BUFFER1
CALL RDBYTES
MOVF BUFFER1,W
MOVWF BUFP
MOVF BUFFER1+1,W
MOVWF BUFS
MOVF BUFFER1+2,W
MOVWF BUFL
;MOVF BUFFER1+3,W
;MOVWF BMIN
RETLW 0
;——————————————————————————————
SERVE
MOVF BUFP,W
SUBWF BUFP_B,0
BTFSS STATUS,2
GOTO FUBUFP
MOVF BUFS,W
SUBWF BUFS_B,0
BTFSS STATUS,2
GOTO FUBUFS
MOVF BUFL,W
SUBWF BUFL_B,0
BTFSS STATUS,2
GOTO XIE1
;MOVF BMIN,W
;SUBWF BMIN_B,0
;BTFSS STATUS,2
;GOTO XIE2
MOVF HOUR,W
SUBWF HOUR_BUF,0
BTFSS STATUS,2
GOTO XIE_HOUR
MOVF TIAN,W
SUBWF TIAN_BUF,0
BTFSS STATUS,2
GOTO XIE_TIAN
;MOVF MINUTE,W ;分钟不保存
;SUBWF MINUTE_BUF,0
;BTFSS STATUS,2
;GOTO XIE_MINUTE
RETLW 0
FUBUFP
MOVF BUFP,W
MOVWF BUFP_B
CALL ROMW
RETLW 0
FUBUFS
MOVF BUFS,W
MOVWF BUFS_B
CALL ROMW
RETLW 0
XIE1
MOVF BUFL,W
MOVWF BUFL_B
CALL ROMW
RETLW 0
XIE2
;MOVF BMIN,W
;MOVWF BMIN_B
;CALL ROMW
;RETLW 0
XIE_HOUR
MOVF HOUR,W
MOVWF HOUR_BUF
CALL ROMW_TIME
RETLW 0
XIE_TIAN
MOVF TIAN,W
MOVWF TIAN_BUF
CALL ROMW_TIME
RETLW 0
;XIE_MINUTE
;MOVF MINUTE,W
;MOVWF MINUTE_BUF
;CALL ROMW_TIME
;RETLW 0
;_________________________________
ROMW_TIME
MOVLW 2 ;分钟不保存;将TIAN开始的2字节数据写入24C01的20H-21H
MOVWF NUMBER ;
MOVLW 25H ;ROM中的地址
MOVWF ADDR
MOVLW TIAN
CALL WRBYTES
RETLW 0
;_________________________________
ROMR_TIME
MOVLW 2 ;将24C01的20H-21H存放的数据读入TIAN开始2字节中
MOVWF NUMBER
MOVLW 25H
MOVWF ADDR
MOVLW TIAN
CALL RDBYTES
MOVF TIAN,W
MOVWF TIAN_BUF
MOVF HOUR,W
MOVWF HOUR_BUF
;MOVF MINUTE,W
;MOVWF MINUTE_BUF
RETLW 0
;_________________________________
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -