|
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后未有信号转错误
is_bal movfw sig_buffer
xorlw bal_equ_def ; 是否为bal信号
btfss STATUS,Z
goto is_up ; 转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 以第二次为准
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 ; 有信号,重置十分钟自动关机
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 ; 清干扰计数
int_rb0_end bcf INTCON,INTF ; 关中断
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 ;取得当前信号
xorlw H'01' ;是bal?
btfss STATUS,Z
goto sig01_end ;不是bal转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 ;当前信号
xorlw h'03' ;是down?
btfss STATUS,Z
goto sig03_end ;不是down转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 ;当前信号
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
//*****************************************************************
以上两段程序望能帮助解释
如有必要,也可上传全部程序。
|
最佳答案
查看完整内容
8051的汇编用的人都少
PIC的汇编就更加少了
你要解释什么?指令在PIC单片机的数据手册中有说明的,自己去把指令的含义放在后面就是解释了PIC的汇编不好理解,没有用过的人,基本是看不明白的
如果你是用PIC汇编的,那就应该能看明白
如果你不是用PIC汇编的,那看PIC汇编也没什么意义
|