找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 336|回复: 9
收起左侧

PIC16单片机的汇编程序,看不懂,请求帮助

[复制链接]
ID:236035 发表于 2022-8-3 16:36 | 显示全部楼层 |阅读模式
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汇编也没什么意义
回复

使用道具 举报

ID:401564 发表于 2022-8-3 16:36 | 显示全部楼层
8051的汇编用的人都少
PIC的汇编就更加少了
你要解释什么?指令在PIC单片机的数据手册中有说明的,自己去把指令的含义放在后面就是解释了PIC的汇编不好理解,没有用过的人,基本是看不明白的
如果你是用PIC汇编的,那就应该能看明白
如果你不是用PIC汇编的,那看PIC汇编也没什么意义
51hei截图20220803171511.png


回复

使用道具 举报

ID:236035 发表于 2022-8-4 07:56 | 显示全部楼层
Y_G_G 发表于 2022-8-3 17:17
8051的汇编用的人都少
PIC的汇编就更加少了
你要解释什么?指令在PIC单片机的数据手册中有说明的,自己去把 ...

感谢回复。我没用过PIC 汇编,但51的汇编搞过。这程序是公司的老产品,我看了前面几行,就是延时和信号IO口的读取。如果后面也这么简单,那问题就不大,但要全部读通,估计还是有难度。所以希望有搞过的人帮助解惑。
如果没有其它有价值的回复,黑币就给你了。
回复

使用道具 举报

ID:584814 发表于 2022-8-4 09:12 | 显示全部楼层
一般判断,能讲清楚的不太可能混在坛子里细讲
建议自己学自己理解。对照说明书如果不能理解,就算是细讲又如何 ?

评分

参与人数 1黑币 +15 收起 理由
ly1972001 + 15 赞一个!

查看全部评分

回复

使用道具 举报

ID:236035 发表于 2022-8-4 10:16 | 显示全部楼层
man1234567 发表于 2022-8-4 09:12
一般判断,能讲清楚的不太可能混在坛子里细讲
建议自己学自己理解。对照说明书如果不能理解,就算 ...

哎,是的。自己硬啃也不是不行,上一段快看完了,感觉还行。要不是公司催着搞下一个项目,也不会这么急迫。其实也就几十条指令,常用的也就是那几个。感谢回复!
回复

使用道具 举报

ID:401564 发表于 2022-8-4 19:54 | 显示全部楼层
ly1972001 发表于 2022-8-4 07:56
感谢回复。我没用过PIC 汇编,但51的汇编搞过。这程序是公司的老产品,我看了前面几行,就是延时和信号IO ...

黑币?我应该不缺的,我缺是另外一种币
PIC的汇编很难啃,如果你学过汇编,那至少也得一个星期才能真正的适应PIC的汇编
16F系列每个不同型号单片机有着不同的汇编指令,或多或少的
你要看你用的那个型号的指令集
而且,PIC16F指令要注意BANK操作,同一个地址,BANK不同,对应的寄存器也不同
回复

使用道具 举报

ID:236035 发表于 2022-8-5 11:23 | 显示全部楼层
Y_G_G 发表于 2022-8-4 19:54
黑币?我应该不缺的,我缺是另外一种币
PIC的汇编很难啃,如果你学过汇编,那至少也得一个星期才能真正的适 ...

刚刚我已经把这两段程序看通了,花了宝贵的两天时间,然后就是按逻辑用C写进新的MCU,第一段已经验证成功了。
我对公司产品已经有些理解了,且用过51汇编,所以读PIC的汇编还算顺利。而且不是要读懂所有的程序,只要知道关键程序的逻辑就可以了。如果验证不成功,只能等有时间了再用仿真器仿真它。
感谢所有回复我的人!感谢论坛!
此贴已失效。
回复

使用道具 举报

ID:123289 发表于 2022-8-5 14:19 | 显示全部楼层
这是你学习单片机的绝好机会!
对照PIC的指令系统,一一逐解,解完了,你的单片机(不仅仅是PIC,其理是相通的)水平绝对会有一个极大的提升!!!
我的话是真的,不信可以与我打个赌。
回复

使用道具 举报

ID:236035 发表于 2022-8-8 08:22 | 显示全部楼层
yzwzfyz 发表于 2022-8-5 14:19
这是你学习单片机的绝好机会!
对照PIC的指令系统,一一逐解,解完了,你的单片机(不仅仅是PIC,其理是相 ...

学习倒是谈不上,毕竟搞了20年的单片机。想起以前第一次搞单片机,也是把51汇编改成C语言,感慨良多!
关键还是在于一句一句搞懂指令的意思,再综合起来看设计思路。急不得。
回复

使用道具 举报

ID:1034262 发表于 2022-8-8 17:48 | 显示全部楼层
虽然快20年没用过PIC的汇编了,但是我还是熟悉的,毕竟只有35条指令。
不过我没有空去看,楼主对应一条条指令加解释,一段段程序研读,花即天时间没问题的,这种MCU才30多条指令,逻辑超级简单。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表