|
200黑幣
PIC16F的程序:
//*********************************************************************************
外部IO口中斷信號
int_rb0 movlw d'20' ; INT中斷開始 STB信號
movwf dl1
dl_200us nop ; 1us
decfsz dl1,F ; 1us
goto dl_200us ; 2us
movfw SIG_PORT ; 延時200us
andlw sig_mask_def
movwf sig_buffer
movlw d'130'
movwf dl1
dl_400us nop ; 1us
decfsz dl1,F ; 1us
goto dl_400us ; 2us,延時400us,實際約520us
btfss PORTB,0 ; int=1有信號
goto sig_err_1 ; 600us后未有信號轉(zhuǎn)錯誤
is_bal movfw sig_buffer
xorlw bal_equ_def ; 是否為bal信號
btfss STATUS,Z
goto is_up ; 轉(zhuǎn)up
balance movlw H'01' ; pb=00000001
movwf signal_now
goto sig_normal
is_up movfw sig_buffer ; is up
xorlw up_equ_def
btfss STATUS,Z
goto is_down
up movlw H'05' ; pb=00000101
movwf signal_now
goto sig_normal
is_down movfw sig_buffer ; is down
xorlw down_equ_def
btfss STATUS,Z
goto sig_err_1
down movlw h'03' ; pb=00000011
movwf signal_now
goto sig_normal
sig_err_1
bcf tasklist, fstbuzz_f ; invalid signal
;clrf t_rpm_last
sig_normal movfw t_rpm_laser
sublw tsig_fstbuzz_def-1
btfss STATUS,C
goto int_rb0_1 ; (tsig_fstbuzz_def-1) 直接處理
incf gr_counter,F ; =,gr不能超過兩次,解決反射光
movfw gr_counter
sublw D'1'
btfss STATUS,C
goto int_rb0_1 ;gr_counter1 兩次以上(含兩次)要處理
goto int_rb0_end ;gr_counter=1 以第二次為準(zhǔn)
int_rb0_1
movfw sig_buffer ;110406
xorlw sig_mask_def
btfsc STATUS,Z
goto invalid_rpm ; 相等
movfw t_rpm_last
sublw t_rpm_laser_max_def
btfsc STATUS,C
goto invalid_rpm ; t_rpm_last= t_rpm_laser_max_def, invalid rpm
movfw t_rpm_laser
sublw t_rpm_laser_max_def ; t_rpm_laser_max_def - t_rpm_laser
btfsc STATUS,C
goto invalid_rpm ; = t_rpm_laser_max_def, invalid rpm
;movfw t_rpm_laser ; 最終速度慢
;sublw t_rpm_laser_min_def
;btfss STATUS,C
;goto invalid_rpm
int_rb0_2
bsf tasklist,fstbuzz_f ; t_rpm_laser_max_def, valid rpm
valid_rpm
movlw t_1minute_def ; 有信號,重置十分鐘自動關(guān)機
movwf t_1minute
movlw t_10minute_def
movwf t_10minute
clrf sig_counter
goto reset_t_rpm
invalid_rpm bcf tasklist, fstbuzz_f
goto reset_t_rpm
reset_t_rpm
movfw t_rpm_laser
movwf t_rpm_last
clrf t_rpm_laser
clrf gr_counter ; 清干擾計數(shù)
int_rb0_end bcf INTCON,INTF ; 關(guān)中斷
goto int_end
//*************************************************************************
下面還有一段,是中斷信號接收后的處理
ml_sig
movfw t_rpm_laser
xorlw tsig_fstbuzz_def ;first buzzerring delay
btfss STATUS,Z
goto ml_isgr0
btfss tasklist,fstbuzz_f
goto ml_isgr0
;movfw t_rpm_laser
;xorlw D'1'
;btfsc STATUS,Z
;goto rpm_laser_1
;movfw t_rpm_laser
;xorlw D'5'
;btfsc STATUS,Z
;goto rpm_laser_5
;movfw t_rpm_laser
;xorlw D'7'
;btfsc STATUS,Z
;goto rpm_laser_7
;movfw sig_buffer1
;xorwf sig_buffer,W ;0 5相反
;btfss STATUS,Z
;goto ml_isgr0
;movlw sig_mask_def
;xorwf sig_buffer5,F
;movfw sig_buffer5
;xorwf sig_buffer,W
;btfss STATUS,Z
;goto ml_isgr0
;movlw t_1minute_def
;movwf t_1minute
;movlw t_10minute_def
;movwf t_10minute
;clrf sig_counter
call sig_roll
call get_signal
sig01 movfw signal_now ;取得當(dāng)前信號
xorlw H'01' ;是bal?
btfss STATUS,Z
goto sig01_end ;不是bal轉(zhuǎn)down
m_lcdup_off
m_lcddown_off
m_lcdbal_on
clrf tsig_bal
sig01_1 btfsc key_st,nobuzz_f
goto sig01_end
movfw buzz_mode
andlw h'07'
xorlw buzz_mode_bal_def
btfsc STATUS,Z
goto sig01_end
sig01_2 movlw buzz_mode_bal_def
movwf buzz_mode
sig01_end goto sig03
sig03 movfw signal_now ;當(dāng)前信號
xorlw h'03' ;是down?
btfss STATUS,Z
goto sig03_end ;不是down轉(zhuǎn)up
;btfss up1_dn1,dn1 ;20151013
;goto sig03_3 ;20151013
m_lcdup_off
m_lcdbal_off
;m_lcddown1_on ;20151013
;goto sig03_1 ;20151013
sig03_3 ;m_lcdup_off ;20151013
;m_lcdbal_off ;20151013
m_lcddown_on
clrf tsig_down
sig03_1 btfsc key_st,nobuzz_f
goto sig03_end
movfw buzz_mode
andlw h'07'
xorlw buzz_mode_down_def
btfsc STATUS,Z
goto sig03_end
sig03_2 movlw buzz_mode_down_def
movwf buzz_mode
sig03_end goto sig05
sig05 movfw signal_now ;當(dāng)前信號
xorlw h'05' ;是up?
btfss STATUS,Z
goto sig05_end
;btfss up1_dn1,up1 ;20151013
;goto sig05_3 ;20151013
m_lcddown_off ;Ver2.2
m_lcdbal_off
;m_lcdup1_on ;20151013
;goto sig05_1 ;20151013
sig05_3 ;m_lcddown_off ;20151013
;m_lcdbal_off ;20151013
m_lcdup_on
clrf tsig_up
sig05_1 btfsc key_st,nobuzz_f
goto sig05_end
movfw buzz_mode
andlw h'07'
xorlw buzz_mode_up_def
btfsc STATUS,Z
goto sig05_end
sig05_2 movlw buzz_mode_up_def
movwf buzz_mode
sig05_end
movfw signal_now
movwf signal_st
goto ml_isgr0
//*****************************************************************
以上兩段程序望能幫助解釋
如有必要,也可上傳全部程序。
|
最佳答案
查看完整內(nèi)容
8051的匯編用的人都少
PIC的匯編就更加少了
你要解釋什么?指令在PIC單片機的數(shù)據(jù)手冊中有說明的,自己去把指令的含義放在后面就是解釋了PIC的匯編不好理解,沒有用過的人,基本是看不明白的
如果你是用PIC匯編的,那就應(yīng)該能看明白
如果你不是用PIC匯編的,那看PIC匯編也沒什么意義
|