PIC877A單片機(jī)MOVF f, d 這個(gè)指令在d=1的情況下有什么用途?
PIC877A單片機(jī)MOVF f, d 這個(gè)指令在d=1的情況下有什么用途?
全部回復(fù)(34)
正序查看
倒序查看
@ningsane
f要么是0,要么是1,和上面d的作用是完全一樣的,只是字母不同,意義一樣的,
我知道了,是程序不對,程序上是寫的F,但是沒有對F賦值,肯定是樹上寫錯(cuò)了,誤導(dǎo)我.汗
還有一個(gè)延時(shí)程序也有問題,我給你寫出來看看:
...
Delay1 equ 20H
Delay2 equ 21H
...
DELAY
movlw 05FH
movwf Delay1
clrf Delay2
DelayLoop
decfsz Delay2,F
goto DelayLoop
decfsz Delay1,F
goto DelayLoop
return
end
是不是這個(gè)延時(shí)程序是錯(cuò)誤的,為什么要把delay2清零?是不是還要在DelayLoop得程序中加入一句給Delay2賦初值?
還有一個(gè)延時(shí)程序也有問題,我給你寫出來看看:
...
Delay1 equ 20H
Delay2 equ 21H
...
DELAY
movlw 05FH
movwf Delay1
clrf Delay2
DelayLoop
decfsz Delay2,F
goto DelayLoop
decfsz Delay1,F
goto DelayLoop
return
end
是不是這個(gè)延時(shí)程序是錯(cuò)誤的,為什么要把delay2清零?是不是還要在DelayLoop得程序中加入一句給Delay2賦初值?
0
回復(fù)
@ucc2800
我知道了,是程序不對,程序上是寫的F,但是沒有對F賦值,肯定是樹上寫錯(cuò)了,誤導(dǎo)我.汗還有一個(gè)延時(shí)程序也有問題,我給你寫出來看看:...Delay1equ20HDelay2equ21H...DELAY movlw05FH movwfDelay1 clrf Delay2DelayLoop decfszDelay2,F goto DelayLoop decfszDelay1,F goto DelayLoop return end是不是這個(gè)延時(shí)程序是錯(cuò)誤的,為什么要把delay2清零?是不是還要在DelayLoop得程序中加入一句給Delay2賦初值?
程序應(yīng)該是對的,具體你編譯一下,應(yīng)該是可以通過的,DelayLoop不需要必須對Delay2賦值,你可以在執(zhí)行中查看一下寄存器的值,無論Delay2值是多少,減1運(yùn)算到0后又開始從255開始循環(huán),這樣循環(huán)嵌套,可以用很少的指令實(shí)現(xiàn)比較長的延時(shí).如果需要精確的延時(shí)時(shí)間,這時(shí)候就要對Delay1,Delay2賦值了,具體是多少,要從WATCH中具體執(zhí)行一下看看,多試幾次,哪兩個(gè)數(shù)據(jù)最接近,就采用哪兩個(gè).
0
回復(fù)
@ningsane
程序應(yīng)該是對的,具體你編譯一下,應(yīng)該是可以通過的,DelayLoop不需要必須對Delay2賦值,你可以在執(zhí)行中查看一下寄存器的值,無論Delay2值是多少,減1運(yùn)算到0后又開始從255開始循環(huán),這樣循環(huán)嵌套,可以用很少的指令實(shí)現(xiàn)比較長的延時(shí).如果需要精確的延時(shí)時(shí)間,這時(shí)候就要對Delay1,Delay2賦值了,具體是多少,要從WATCH中具體執(zhí)行一下看看,多試幾次,哪兩個(gè)數(shù)據(jù)最接近,就采用哪兩個(gè).
子程序中為什么 要用F呢,為什么不寫成 1 或者 0,這樣可以嗎?
0
回復(fù)
@ucc2800
謝謝啊,收獲很多!還有,我今天在一個(gè)程序里碰到了banksel這個(gè)東西?這是什么玩意?從來沒有見過啊.它是不是又是在include文件里呢,具體什么意思啊?有什么作用?繼續(xù)指點(diǎn)啊,嘿嘿.
banksel 是一個(gè)比較的命令, 一般修改bank用這樣的兩條指令
BSF STATUS,RPO
BCF STATUS,RP1
具體是1,還是0看自己的實(shí)際位置,自己要知道實(shí)際的BANK.用banksel就省事多了,banksel f,一個(gè)指令就設(shè)定了f所在的BANK了,用這一個(gè)指令就可以替代上面的兩條指令,還省去了計(jì)算f寄存器實(shí)際的BANK 的麻煩呢
BSF STATUS,RPO
BCF STATUS,RP1
具體是1,還是0看自己的實(shí)際位置,自己要知道實(shí)際的BANK.用banksel就省事多了,banksel f,一個(gè)指令就設(shè)定了f所在的BANK了,用這一個(gè)指令就可以替代上面的兩條指令,還省去了計(jì)算f寄存器實(shí)際的BANK 的麻煩呢
0
回復(fù)
@ningsane
banksel是一個(gè)比較的命令, 一般修改bank用這樣的兩條指令 BSFSTATUS,RPO BCF STATUS,RP1具體是1,還是0看自己的實(shí)際位置,自己要知道實(shí)際的BANK.用banksel就省事多了,bankself,一個(gè)指令就設(shè)定了f所在的BANK了,用這一個(gè)指令就可以替代上面的兩條指令,還省去了計(jì)算f寄存器實(shí)際的BANK的麻煩呢
謝謝啊,我明白了一部分.但還有兩個(gè)問題:
1.這是一個(gè)指令嗎?為什么指令命令里沒有這個(gè)?
2.如果不是指令,它需要定義或者聲明嗎?在哪個(gè)地方?
下面有一些語句,你可以解釋一下給我好嗎?
banksel PORTD
banksel TRISD
banksel ADCON1
banksel INTCON
1.這是一個(gè)指令嗎?為什么指令命令里沒有這個(gè)?
2.如果不是指令,它需要定義或者聲明嗎?在哪個(gè)地方?
下面有一些語句,你可以解釋一下給我好嗎?
banksel PORTD
banksel TRISD
banksel ADCON1
banksel INTCON
0
回復(fù)
@ucc2800
謝謝啊,我明白了一部分.但還有兩個(gè)問題:1.這是一個(gè)指令嗎?為什么指令命令里沒有這個(gè)?2.如果不是指令,它需要定義或者聲明嗎?在哪個(gè)地方?下面有一些語句,你可以解釋一下給我好嗎?banksel PORTDbanksel TRISDbanksel ADCON1banksel INTCON
這是個(gè)指令,你找原來比較早些的書上一般都有介紹,
第一行banksel PORTD 等同于BCF STATUS,RP1,
BCF STATUS,RP0,
PORTD 位于第一BANK
第二行banksel TRISD 等同于BCF STATUS,RP1,
BSF STATUS,RP0,
TRISD位于第三BANK
下面的兩個(gè)是一樣的道理.
你可以體會(huì)一下這兩中方法的不同用法和好處
第一行banksel PORTD 等同于BCF STATUS,RP1,
BCF STATUS,RP0,
PORTD 位于第一BANK
第二行banksel TRISD 等同于BCF STATUS,RP1,
BSF STATUS,RP0,
TRISD位于第三BANK
下面的兩個(gè)是一樣的道理.
你可以體會(huì)一下這兩中方法的不同用法和好處
0
回復(fù)
@ningsane
這是個(gè)指令,你找原來比較早些的書上一般都有介紹,第一行bankselPORTD等同于BCFSTATUS,RP1, BCFSTATUS,RP0,PORTD位于第一BANK第二行bankselTRISD等同于BCFSTATUS,RP1, BSFSTATUS,RP0,TRISD位于第三BANK下面的兩個(gè)是一樣的道理.你可以體會(huì)一下這兩中方法的不同用法和好處
我明白了
但是
PORTD:在Bank 0(第一個(gè))
TRISD:在Bank 1(第二個(gè)),而你說的是位于第三個(gè)
ADCON1:在Bank 1(第二個(gè))
INTCON:四個(gè)Bank都有,該怎么辦?具體指到哪一個(gè)?
再有耐心一點(diǎn)點(diǎn),這個(gè)問題快解決了啊
我用的芯片是PIC16F877A
但是
PORTD:在Bank 0(第一個(gè))
TRISD:在Bank 1(第二個(gè)),而你說的是位于第三個(gè)
ADCON1:在Bank 1(第二個(gè))
INTCON:四個(gè)Bank都有,該怎么辦?具體指到哪一個(gè)?
再有耐心一點(diǎn)點(diǎn),這個(gè)問題快解決了啊
我用的芯片是PIC16F877A
0
回復(fù)
@ucc2800
我明白了但是PORTD:在Bank0(第一個(gè))TRISD:在Bank1(第二個(gè)),而你說的是位于第三個(gè)ADCON1:在Bank1(第二個(gè))INTCON:四個(gè)Bank都有,該怎么辦?具體指到哪一個(gè)?再有耐心一點(diǎn)點(diǎn),這個(gè)問題快解決了啊我用的芯片是PIC16F877A
用哪個(gè)BANK中的寄存器BANK是經(jīng)常要改變的,你寫的那四個(gè)語句一般不會(huì)在一起用的,如果在一起的話就是最后一個(gè),就是先轉(zhuǎn)到BANK1,再到BANK2,第三個(gè)再轉(zhuǎn)到BANK2,其實(shí)不變,最后轉(zhuǎn)到BANK4,還是按照程序執(zhí)行順序來的
0
回復(fù)
@ningsane
用哪個(gè)BANK中的寄存器BANK是經(jīng)常要改變的,你寫的那四個(gè)語句一般不會(huì)在一起用的,如果在一起的話就是最后一個(gè),就是先轉(zhuǎn)到BANK1,再到BANK2,第三個(gè)再轉(zhuǎn)到BANK2,其實(shí)不變,最后轉(zhuǎn)到BANK4,還是按照程序執(zhí)行順序來的
在Bank 0, Bank 1, Bank 2, Bank 3四個(gè)存儲(chǔ)體中都有一個(gè)INTCON寄存器,如果出現(xiàn)這條命令banksel INTCON,那么目前的存儲(chǔ)體應(yīng)該是哪個(gè)?
0
回復(fù)
@ningsane
一般改變BANK沒有選擇INTCON的,你用這個(gè)指令只能用唯一存在的寄存器,確定了某個(gè)寄存器,必須它所在的BANK是確定的,這樣才能用這個(gè)指令
一個(gè)初始化程序:
Initial
banksel TRISD
clrf TRISD
banksel PORTD
clrf PORTD
banksel PIE1
bsf PIE1,ADIE
bsf TRISA,0
banksel ADCON1
movlw B'00000000'
movwf ADCON1
banksel ADCON0
movlw B'00000001'
movwf ADCON0
banksel INTCON
bsf INTCON,GIE
bsf INTCON,PEIE
bsf ADCON0,2
return
Initial
banksel TRISD
clrf TRISD
banksel PORTD
clrf PORTD
banksel PIE1
bsf PIE1,ADIE
bsf TRISA,0
banksel ADCON1
movlw B'00000000'
movwf ADCON1
banksel ADCON0
movlw B'00000001'
movwf ADCON0
banksel INTCON
bsf INTCON,GIE
bsf INTCON,PEIE
bsf ADCON0,2
return
0
回復(fù)
@ucc2800
一個(gè)初始化程序:Initial banksel TRISD clrf TRISD banksel PORTD clrf PORTD banksel PIE1 bsf PIE1,ADIE bsf TRISA,0 banksel ADCON1 movlw B'00000000' movwf ADCON1 banksel ADCON0 movlw B'00000001' movwf ADCON0 banksel INTCON bsf INTCON,GIE bsf INTCON,PEIE bsf ADCON0,2 return
你把該程序執(zhí)行一下,看PC實(shí)際在哪里呢
0
回復(fù)