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

📄 xiaomao.asm

📁 利用pic876实现的小毛脉冲控制器
💻 ASM
字号:
 title  "小毛脉冲控制器"
;
; RB1--脉冲输入1          RB2--脉冲输入2     RB0--清除端          RC1-输出1         RC2--输出2
; RC0--输出指示0   	  RC3-输出指示1
; Simulated PIC16F876 Running at 4 MHz
;
; 龙元
; 03.06.24
;
  LIST P=16F876
  INCLUDE "p16f876.inc"

;  Register Usage
 CBLOCK 0x020		;  Start Registers at End of the Values
  min_now    		;当前剩余时间

  XW_TEMP   		;equ 0x24中断保存缓冲区
  XHOSTS    		;equ 0x25
  HOSTF     		;equ 0x26
  
  count0_100ms		;100ms计数器0
  count1_100ms		;100ms计数器1
  
  SREG_ms	    	;equ 0x2a	;计时临时寄存器
		
  ENDC

   	org    0
  	nop
 	goto Main
 	
;////////////////中断矢量//////////////////////////////////////////////  
  	org  	0x0004
INTER	MOVWF	XW_TEMP				;保存W的值
	SWAPF	STATUS,W
	MOVWF	XHOSTS				;暂存STATUS的值
	MOVF	FSR,W
	MOVWF	HOSTF				;保存FSR的值。以上程序为中断现场??
  	btfsc	INTCON,T0IF
  	goto	INTTRM0  	
  	
;////////////////主程序/////////////////////////////////////////////////  
  	org	0x0100
Main 	 				;a,b,c口初始化
	movlw	0x03
 	movwf	PORTA
 	movlw	0xff
 	movwf	PORTB
 	movlw	0x12
 	movwf	PORTC
 	bsf	STATUS,RP0
 	movlw	0x07
 	movwf	ADCON1^0x0080
 	movlw	0X00      		;A   输入
 	movwf	TRISA^0x0080
 	movlw	0Xff       		;B   输入
 	movwf	TRISB^0x0080
  	movlw	0X00       		;C   0,1---输出
 	movwf	TRISC^0x0080
 	bcf	STATUS,RP0
	
	bcf	PORTC,0
	bcf	PORTC,1
	bcf	PORTC,2
	bcf	PORTC,3
	
	clrf	count0_100ms
	clrf	count1_100ms
	clrf	SREG_ms
	call	trm0init

	banksel	INTCON
 	bsf	INTCON,GIE		;开中断
	
;//////////////主循环/////////////////////////////////////////////////
star	clrwdt
	btfSS	PORTB,0
	goto	loop0
	bcf	PORTC,0
	bcf	PORTC,1
	bcf	PORTC,2
	bcf	PORTC,3
	goto	star
loop0	movlw	0x64
	subwf	count0_100ms,w
	btfss	STATUS,C
	goto	loop1
	clrf	count0_100ms		;超过100ms  清零
	bcf	PORTC,1	
	bcf	PORTC,0
loop1	movlw	0x64
	subwf	count1_100ms,w
	btfss	STATUS,C
	goto	loop2
	clrf	count1_100ms
	bcf	PORTC,2	
	bcf	PORTC,3
		
loop2	btfss	PORTB,1
	goto	loop3
	clrf	count0_100ms
	bsf	PORTC,1
	bsf	PORTC,0
	
loop3	btfss	PORTB,2
	goto	star
	clrf	count1_100ms
	bsf	PORTC,2
	bsf	PORTC,3
	
	goto	star		;从新开始	
	
;/////////////主循环结束////////////////////////////////////////
;////////////TRM0初始化/////////////////////////////////////////
trm0init
	bsf	STATUS,RP0
	bcf	STATUS,RP1
	bcf	OPTION_REG^0x0080,T0CS
	bsf	OPTION_REG^0x0080,PSA
	bcf	STATUS,RP0
	bcf	INTCON,T0IF
	bcf	INTCON,GIE
	MOVLW	0X14
	MOVWF	TMR0
	bsf	INTCON,T0IE
	return
;////////////////中断处理///////////////////////////////////	
INTTRM0  		;定时器处理
	MOVLW	0X14
	MOVWF	TMR0		;对TMR0写入一个调整值,因为写入TMR0后接着的两个周期不能增量
	BCF	INTCON,T0IF	;清除中断标志
	INCF	SREG_ms,f
	MOVF	SREG_ms,W
	SUBLW	0X04		;TMR0 每250 μs中断一次
	BTFSS	STATUS,Z	;其中断4次为1ms
	GOTO	intend
	incf	count0_100ms,f
	incf	count1_100ms,f
	clrf	SREG_ms
	
intend	MOVF	HOSTF,W		;以下为中断现场恢复
	MOVWF	FSR		;恢复间接寻址指针FSR的值
	SWAPF	XHOSTS,W
	MOVWF	STATUS		;恢复STATUS的值
	SWAPF	XW_TEMP,1
	SWAPF	XW_TEMP,W	;恢复W的值
	RETFIE

	end	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -