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