📄 xiaomao.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 + -