PIC877A单片机MOVF f, d 这个指令在d=1的情况下有什么用途?
PIC877A单片机MOVF f, d 这个指令在d=1的情况下有什么用途?
全部回复(34)
正序查看
倒序查看
现在还没有回复呢,说说你的想法
@ningsane
f要么是0,要么是1,和上面d的作用是完全一样的,只是字母不同,意义一样的,
我知道了,是程序不对,程序上是写的F,但是没有对F赋值,肯定是树上写错了,误导我.汗
还有一个延时程序也有问题,我给你写出来看看:
...
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
是不是这个延时程序是错误的,为什么要把delay2清零?是不是还要在DelayLoop得程序中加入一句给Delay2赋初值?
还有一个延时程序也有问题,我给你写出来看看:
...
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
是不是这个延时程序是错误的,为什么要把delay2清零?是不是还要在DelayLoop得程序中加入一句给Delay2赋初值?
0
回复
提示
@ucc2800
我知道了,是程序不对,程序上是写的F,但是没有对F赋值,肯定是树上写错了,误导我.汗还有一个延时程序也有问题,我给你写出来看看:...Delay1equ20HDelay2equ21H...DELAY movlw05FH movwfDelay1 clrf Delay2DelayLoop decfszDelay2,F goto DelayLoop decfszDelay1,F goto DelayLoop return end是不是这个延时程序是错误的,为什么要把delay2清零?是不是还要在DelayLoop得程序中加入一句给Delay2赋初值?
程序应该是对的,具体你编译一下,应该是可以通过的,DelayLoop不需要必须对Delay2赋值,你可以在执行中查看一下寄存器的值,无论Delay2值是多少,减1运算到0后又开始从255开始循环,这样循环嵌套,可以用很少的指令实现比较长的延时.如果需要精确的延时时间,这时候就要对Delay1,Delay2赋值了,具体是多少,要从WATCH中具体执行一下看看,多试几次,哪两个数据最接近,就采用哪两个.
0
回复
提示
@ucc2800
谢谢啊,收获很多!还有,我今天在一个程序里碰到了banksel这个东西?这是什么玩意?从来没有见过啊.它是不是又是在include文件里呢,具体什么意思啊?有什么作用?继续指点啊,嘿嘿.
banksel 是一个比较的命令, 一般修改bank用这样的两条指令
BSF STATUS,RPO
BCF STATUS,RP1
具体是1,还是0看自己的实际位置,自己要知道实际的BANK.用banksel就省事多了,banksel f,一个指令就设定了f所在的BANK了,用这一个指令就可以替代上面的两条指令,还省去了计算f寄存器实际的BANK 的麻烦呢
BSF STATUS,RPO
BCF STATUS,RP1
具体是1,还是0看自己的实际位置,自己要知道实际的BANK.用banksel就省事多了,banksel f,一个指令就设定了f所在的BANK了,用这一个指令就可以替代上面的两条指令,还省去了计算f寄存器实际的BANK 的麻烦呢
0
回复
提示
@ningsane
banksel是一个比较的命令, 一般修改bank用这样的两条指令 BSFSTATUS,RPO BCF STATUS,RP1具体是1,还是0看自己的实际位置,自己要知道实际的BANK.用banksel就省事多了,bankself,一个指令就设定了f所在的BANK了,用这一个指令就可以替代上面的两条指令,还省去了计算f寄存器实际的BANK的麻烦呢
谢谢啊,我明白了一部分.但还有两个问题:
1.这是一个指令吗?为什么指令命令里没有这个?
2.如果不是指令,它需要定义或者声明吗?在哪个地方?
下面有一些语句,你可以解释一下给我好吗?
banksel PORTD
banksel TRISD
banksel ADCON1
banksel INTCON
1.这是一个指令吗?为什么指令命令里没有这个?
2.如果不是指令,它需要定义或者声明吗?在哪个地方?
下面有一些语句,你可以解释一下给我好吗?
banksel PORTD
banksel TRISD
banksel ADCON1
banksel INTCON
0
回复
提示
@ucc2800
谢谢啊,我明白了一部分.但还有两个问题:1.这是一个指令吗?为什么指令命令里没有这个?2.如果不是指令,它需要定义或者声明吗?在哪个地方?下面有一些语句,你可以解释一下给我好吗?banksel PORTDbanksel TRISDbanksel ADCON1banksel INTCON
这是个指令,你找原来比较早些的书上一般都有介绍,
第一行banksel PORTD 等同于BCF STATUS,RP1,
BCF STATUS,RP0,
PORTD 位于第一BANK
第二行banksel TRISD 等同于BCF STATUS,RP1,
BSF STATUS,RP0,
TRISD位于第三BANK
下面的两个是一样的道理.
你可以体会一下这两中方法的不同用法和好处
第一行banksel PORTD 等同于BCF STATUS,RP1,
BCF STATUS,RP0,
PORTD 位于第一BANK
第二行banksel TRISD 等同于BCF STATUS,RP1,
BSF STATUS,RP0,
TRISD位于第三BANK
下面的两个是一样的道理.
你可以体会一下这两中方法的不同用法和好处
0
回复
提示
@ningsane
这是个指令,你找原来比较早些的书上一般都有介绍,第一行bankselPORTD等同于BCFSTATUS,RP1, BCFSTATUS,RP0,PORTD位于第一BANK第二行bankselTRISD等同于BCFSTATUS,RP1, BSFSTATUS,RP0,TRISD位于第三BANK下面的两个是一样的道理.你可以体会一下这两中方法的不同用法和好处
我明白了
但是
PORTD:在Bank 0(第一个)
TRISD:在Bank 1(第二个),而你说的是位于第三个
ADCON1:在Bank 1(第二个)
INTCON:四个Bank都有,该怎么办?具体指到哪一个?
再有耐心一点点,这个问题快解决了啊
我用的芯片是PIC16F877A
但是
PORTD:在Bank 0(第一个)
TRISD:在Bank 1(第二个),而你说的是位于第三个
ADCON1:在Bank 1(第二个)
INTCON:四个Bank都有,该怎么办?具体指到哪一个?
再有耐心一点点,这个问题快解决了啊
我用的芯片是PIC16F877A
0
回复
提示
@ningsane
一般改变BANK没有选择INTCON的,你用这个指令只能用唯一存在的寄存器,确定了某个寄存器,必须它所在的BANK是确定的,这样才能用这个指令
一个初始化程序:
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
回复
提示
@ucc2800
一个初始化程序: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
你把该程序执行一下,看PC实际在哪里呢
0
回复
提示