⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clean.asm

📁 PIC风机智能化控制程序
💻 ASM
📖 第 1 页 / 共 3 页
字号:

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