找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3141|回復(fù): 9
打印 上一主題 下一主題
收起左側(cè)

PIC16單片機(jī)的匯編程序,看不懂,請(qǐng)求幫助

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
200黑幣
PIC16F的程序:
//*********************************************************************************
外部IO口中斷信號(hào)
int_rb0               movlw     d'20'            ; INT中斷開始  STB信號(hào)
                movwf     dl1
dl_200us             nop                        ; 1us
                    decfsz     dl1,F            ; 1us
                    goto     dl_200us            ; 2us
                    movfw     SIG_PORT            ; 延時(shí)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,延時(shí)400us,實(shí)際約520us
                    btfss     PORTB,0            ; int=1有信號(hào)
                    goto     sig_err_1            ; 600us后未有信號(hào)轉(zhuǎn)錯(cuò)誤   
is_bal            movfw     sig_buffer
                    xorlw     bal_equ_def        ; 是否為bal信號(hào)
                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            ; 有信號(hào),重置十分鐘自動(dòng)關(guān)機(jī)
                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        ; 清干擾計(jì)數(shù)
   
int_rb0_end        bcf         INTCON,INTF        ; 關(guān)中斷
                goto     int_end


//*************************************************************************
下面還有一段,是中斷信號(hào)接收后的處理
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)前信號(hào)
                    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)前信號(hào)
                        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)前信號(hào)
                        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單片機(jī)的數(shù)據(jù)手冊(cè)中有說明的,自己去把指令的含義放在后面就是解釋了PIC的匯編不好理解,沒有用過的人,基本是看不明白的 如果你是用PIC匯編的,那就應(yīng)該能看明白 如果你不是用PIC匯編的,那看PIC匯編也沒什么意義
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:401564 發(fā)表于 2022-8-3 16:36 | 只看該作者
8051的匯編用的人都少
PIC的匯編就更加少了
你要解釋什么?指令在PIC單片機(jī)的數(shù)據(jù)手冊(cè)中有說明的,自己去把指令的含義放在后面就是解釋了PIC的匯編不好理解,沒有用過的人,基本是看不明白的
如果你是用PIC匯編的,那就應(yīng)該能看明白
如果你不是用PIC匯編的,那看PIC匯編也沒什么意義



回復(fù)

使用道具 舉報(bào)

板凳
ID:236035 發(fā)表于 2022-8-4 07:56 | 只看該作者
Y_G_G 發(fā)表于 2022-8-3 17:17
8051的匯編用的人都少
PIC的匯編就更加少了
你要解釋什么?指令在PIC單片機(jī)的數(shù)據(jù)手冊(cè)中有說明的,自己去把 ...

感謝回復(fù)。我沒用過PIC 匯編,但51的匯編搞過。這程序是公司的老產(chǎn)品,我看了前面幾行,就是延時(shí)和信號(hào)IO口的讀取。如果后面也這么簡單,那問題就不大,但要全部讀通,估計(jì)還是有難度。所以希望有搞過的人幫助解惑。
如果沒有其它有價(jià)值的回復(fù),黑幣就給你了。
回復(fù)

使用道具 舉報(bào)

地板
ID:584814 發(fā)表于 2022-8-4 09:12 | 只看該作者
一般判斷,能講清楚的不太可能混在壇子里細(xì)講
建議自己學(xué)自己理解。對(duì)照說明書如果不能理解,就算是細(xì)講又如何 ?

評(píng)分

參與人數(shù) 1黑幣 +15 收起 理由
ly1972001 + 15 贊一個(gè)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

5#
ID:236035 發(fā)表于 2022-8-4 10:16 | 只看該作者
man1234567 發(fā)表于 2022-8-4 09:12
一般判斷,能講清楚的不太可能混在壇子里細(xì)講
建議自己學(xué)自己理解。對(duì)照說明書如果不能理解,就算 ...

哎,是的。自己硬啃也不是不行,上一段快看完了,感覺還行。要不是公司催著搞下一個(gè)項(xiàng)目,也不會(huì)這么急迫。其實(shí)也就幾十條指令,常用的也就是那幾個(gè)。感謝回復(fù)!
回復(fù)

使用道具 舉報(bào)

6#
ID:401564 發(fā)表于 2022-8-4 19:54 | 只看該作者
ly1972001 發(fā)表于 2022-8-4 07:56
感謝回復(fù)。我沒用過PIC 匯編,但51的匯編搞過。這程序是公司的老產(chǎn)品,我看了前面幾行,就是延時(shí)和信號(hào)IO ...

黑幣?我應(yīng)該不缺的,我缺是另外一種幣
PIC的匯編很難啃,如果你學(xué)過匯編,那至少也得一個(gè)星期才能真正的適應(yīng)PIC的匯編
16F系列每個(gè)不同型號(hào)單片機(jī)有著不同的匯編指令,或多或少的
你要看你用的那個(gè)型號(hào)的指令集
而且,PIC16F指令要注意BANK操作,同一個(gè)地址,BANK不同,對(duì)應(yīng)的寄存器也不同
回復(fù)

使用道具 舉報(bào)

7#
ID:236035 發(fā)表于 2022-8-5 11:23 | 只看該作者
Y_G_G 發(fā)表于 2022-8-4 19:54
黑幣?我應(yīng)該不缺的,我缺是另外一種幣
PIC的匯編很難啃,如果你學(xué)過匯編,那至少也得一個(gè)星期才能真正的適 ...

剛剛我已經(jīng)把這兩段程序看通了,花了寶貴的兩天時(shí)間,然后就是按邏輯用C寫進(jìn)新的MCU,第一段已經(jīng)驗(yàn)證成功了。
我對(duì)公司產(chǎn)品已經(jīng)有些理解了,且用過51匯編,所以讀PIC的匯編還算順利。而且不是要讀懂所有的程序,只要知道關(guān)鍵程序的邏輯就可以了。如果驗(yàn)證不成功,只能等有時(shí)間了再用仿真器仿真它。
感謝所有回復(fù)我的人!感謝論壇!
此貼已失效。
回復(fù)

使用道具 舉報(bào)

8#
ID:123289 發(fā)表于 2022-8-5 14:19 | 只看該作者
這是你學(xué)習(xí)單片機(jī)的絕好機(jī)會(huì)!
對(duì)照PIC的指令系統(tǒng),一一逐解,解完了,你的單片機(jī)(不僅僅是PIC,其理是相通的)水平絕對(duì)會(huì)有一個(gè)極大的提升。!
我的話是真的,不信可以與我打個(gè)賭。
回復(fù)

使用道具 舉報(bào)

9#
ID:236035 發(fā)表于 2022-8-8 08:22 | 只看該作者
yzwzfyz 發(fā)表于 2022-8-5 14:19
這是你學(xué)習(xí)單片機(jī)的絕好機(jī)會(huì)!
對(duì)照PIC的指令系統(tǒng),一一逐解,解完了,你的單片機(jī)(不僅僅是PIC,其理是相 ...

學(xué)習(xí)倒是談不上,畢竟搞了20年的單片機(jī)。想起以前第一次搞單片機(jī),也是把51匯編改成C語言,感慨良多!
關(guān)鍵還是在于一句一句搞懂指令的意思,再綜合起來看設(shè)計(jì)思路。急不得。
回復(fù)

使用道具 舉報(bào)

10#
ID:1034262 發(fā)表于 2022-8-8 17:48 | 只看該作者
雖然快20年沒用過PIC的匯編了,但是我還是熟悉的,畢竟只有35條指令。
不過我沒有空去看,樓主對(duì)應(yīng)一條條指令加解釋,一段段程序研讀,花即天時(shí)間沒問題的,這種MCU才30多條指令,邏輯超級(jí)簡單。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表