• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

PIC877A单片机MOVF f, d 这个指令在d=1的情况下有什么用途?

PIC877A单片机MOVF f, d 这个指令在d=1的情况下有什么用途?
全部回复(34)
正序查看
倒序查看
ningsane
LV.4
2
2005-12-06 15:07
d指定了f寄存器中的数据的存放位置,如果d=1,那么寄存器f中的数据就存放在自身f寄存器中(会影响标示位),如果d=0那么数据就存放在W寄存器中.
0
回复
ucc2800
LV.7
3
2005-12-06 16:49
@ningsane
d指定了f寄存器中的数据的存放位置,如果d=1,那么寄存器f中的数据就存放在自身f寄存器中(会影响标示位),如果d=0那么数据就存放在W寄存器中.
movf f,1这个命令的用途就是仅仅影响标志位吗?
0
回复
ningsane
LV.4
4
2005-12-07 11:18
@ucc2800
movff,1这个命令的用途就是仅仅影响标志位吗?
在movf f,d中,d可以省略,这时系统的d值确省为1,因此数据到底要放在f中还是W中,要自己考虑的.一般来说,d的主要作用是用来指定存储位置的
0
回复
ucc2800
LV.7
5
2005-12-07 11:49
@ningsane
在movff,d中,d可以省略,这时系统的d值确省为1,因此数据到底要放在f中还是W中,要自己考虑的.一般来说,d的主要作用是用来指定存储位置的
好的,谢谢你啊
是不是编写程序时这个值可以用一个变量来代替,比如F,而不赋予任何值给它?
0
回复
ningsane
LV.4
6
2005-12-07 12:26
@ucc2800
好的,谢谢你啊是不是编写程序时这个值可以用一个变量来代替,比如F,而不赋予任何值给它?
不是太明白你说的意思,movf f,d中,d的值只能是1或0,一般在介绍指令系统中这样写,一般在具体程序中写1或0,如果非要写字母d,那么要对d具体赋值,实际是一样的,这样还不如直接写1或0省事,
0
回复
ucc2800
LV.7
7
2005-12-07 14:25
@ningsane
不是太明白你说的意思,movff,d中,d的值只能是1或0,一般在介绍指令系统中这样写,一般在具体程序中写1或0,如果非要写字母d,那么要对d具体赋值,实际是一样的,这样还不如直接写1或0省事,
我这两天在学习PIC编程
在程序中老发现这样的语句:
rlf PORTD,F
decfsz delay1,F
xorwf NN,F
rlf NN,W
等等.
F,W在程序中都没有定义,不知道这样写的目的是何用意?
0
回复
ningsane
LV.4
8
2005-12-07 14:30
@ucc2800
我这两天在学习PIC编程在程序中老发现这样的语句:rlfPORTD,Fdecfszdelay1,FxorwfNN,FrlfNN,W等等.F,W在程序中都没有定义,不知道这样写的目的是何用意?
f要么是0,要么是1,和上面d的作用是完全一样的,只是字母不同,意义一样的,
0
回复
ucc2800
LV.7
9
2005-12-07 14:49
@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赋初值?
0
回复
ningsane
LV.4
10
2005-12-07 14:59
@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
LV.7
11
2005-12-07 15:20
@ningsane
程序应该是对的,具体你编译一下,应该是可以通过的,DelayLoop不需要必须对Delay2赋值,你可以在执行中查看一下寄存器的值,无论Delay2值是多少,减1运算到0后又开始从255开始循环,这样循环嵌套,可以用很少的指令实现比较长的延时.如果需要精确的延时时间,这时候就要对Delay1,Delay2赋值了,具体是多少,要从WATCH中具体执行一下看看,多试几次,哪两个数据最接近,就采用哪两个.
子程序中为什么 要用F呢,为什么不写成 1 或者 0,这样可以吗?
0
回复
ningsane
LV.4
12
2005-12-07 15:26
@ucc2800
子程序中为什么要用F呢,为什么不写成1或者0,这样可以吗?
你可以在程序的其他地方找到f的值,在包含文件include<>呢,一般的f=1,w=0,
0
回复
ucc2800
LV.7
13
2005-12-07 15:32
@ningsane
你可以在程序的其他地方找到f的值,在包含文件include呢,一般的f=1,w=0,
哦,书上也没给我说,害我琢磨老半天就是理解不了,听你这么一说,突然间明白了,谢谢啊.
还有p16f877a.inc这个文件是默认的还是自己定义制作的?
呵呵,我是刚学,你要有耐心啊
0
回复
ningsane
LV.4
14
2005-12-07 15:47
@ucc2800
哦,书上也没给我说,害我琢磨老半天就是理解不了,听你这么一说,突然间明白了,谢谢啊.还有p16f877a.inc这个文件是默认的还是自己定义制作的?呵呵,我是刚学,你要有耐心啊
你可以自己往里面添加定义,*.INC文件是文本方式的,可以自己用写字板打开,一看就都明白了
0
回复
ucc2800
LV.7
15
2005-12-07 15:52
@ningsane
你可以自己往里面添加定义,*.INC文件是文本方式的,可以自己用写字板打开,一看就都明白了
好的,真的很感激你,再次谢谢啊,以后我碰到的问题会更多,还需要你多多指点.我以前学的51,现在学习PIC,刚开始学^_^
0
回复
ucc2800
LV.7
16
2005-12-08 09:16
@ningsane
在movff,d中,d可以省略,这时系统的d值确省为1,因此数据到底要放在f中还是W中,要自己考虑的.一般来说,d的主要作用是用来指定存储位置的
在movf f,d中,d可以省略,这时系统的d值确省为1.

是不是其他的指令只要有省略0或者1的,缺省值都是1??
0
回复
ningsane
LV.4
17
2005-12-08 11:49
@ucc2800
在movff,d中,d可以省略,这时系统的d值确省为1.是不是其他的指令只要有省略0或者1的,缺省值都是1??
是的,如果写成了movf f,  命令也是对的,这时确省它为1,数据存放到f中,和f=1的效果是一样的,对其他的命令也是一样的
0
回复
ucc2800
LV.7
18
2005-12-08 12:35
@ningsane
是的,如果写成了movff,  命令也是对的,这时确省它为1,数据存放到f中,和f=1的效果是一样的,对其他的命令也是一样的
谢谢啊,收获很多!
还有,我今天在一个程序里碰到了banksel这个东西?这是什么玩意?从来没有见过啊.它是不是又是在include文件里呢,具体什么意思啊?有什么作用?继续指点啊,嘿嘿.
0
回复
ningsane
LV.4
19
2005-12-08 13:00
@ucc2800
谢谢啊,收获很多!还有,我今天在一个程序里碰到了banksel这个东西?这是什么玩意?从来没有见过啊.它是不是又是在include文件里呢,具体什么意思啊?有什么作用?继续指点啊,嘿嘿.
banksel 是一个比较的命令,  一般修改bank用这样的两条指令
     BSF STATUS,RPO
     BCF  STATUS,RP1
具体是1,还是0看自己的实际位置,自己要知道实际的BANK.用banksel就省事多了,banksel f,一个指令就设定了f所在的BANK了,用这一个指令就可以替代上面的两条指令,还省去了计算f寄存器实际的BANK 的麻烦呢
0
回复
ucc2800
LV.7
20
2005-12-08 13:15
@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
0
回复
ningsane
LV.4
21
2005-12-08 14:37
@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
下面的两个是一样的道理.
你可以体会一下这两中方法的不同用法和好处
0
回复
ucc2800
LV.7
22
2005-12-08 15:06
@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
0
回复
ningsane
LV.4
23
2005-12-08 15:16
@ucc2800
我明白了但是PORTD:在Bank0(第一个)TRISD:在Bank1(第二个),而你说的是位于第三个ADCON1:在Bank1(第二个)INTCON:四个Bank都有,该怎么办?具体指到哪一个?再有耐心一点点,这个问题快解决了啊我用的芯片是PIC16F877A
用哪个BANK中的寄存器BANK是经常要改变的,你写的那四个语句一般不会在一起用的,如果在一起的话就是最后一个,就是先转到BANK1,再到BANK2,第三个再转到BANK2,其实不变,最后转到BANK4,还是按照程序执行顺序来的
0
回复
ucc2800
LV.7
24
2005-12-08 15:35
@ningsane
用哪个BANK中的寄存器BANK是经常要改变的,你写的那四个语句一般不会在一起用的,如果在一起的话就是最后一个,就是先转到BANK1,再到BANK2,第三个再转到BANK2,其实不变,最后转到BANK4,还是按照程序执行顺序来的
在Bank 0, Bank 1, Bank 2, Bank 3四个存储体中都有一个INTCON寄存器,如果出现这条命令banksel INTCON,那么目前的存储体应该是哪个?
0
回复
ningsane
LV.4
25
2005-12-08 15:59
@ucc2800
在Bank0,Bank1,Bank2,Bank3四个存储体中都有一个INTCON寄存器,如果出现这条命令bankselINTCON,那么目前的存储体应该是哪个?
一般改变BANK没有选择INTCON的,你用这个指令只能用唯一存在的寄存器,确定了某个寄存器,必须它所在的BANK是确定的,这样才能用这个指令
0
回复
ucc2800
LV.7
26
2005-12-08 16:19
@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
0
回复
ningsane
LV.4
27
2005-12-08 16:22
@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
回复
ucc2800
LV.7
28
2005-12-08 16:28
@ningsane
你把该程序执行一下,看PC实际在哪里呢
用什么软件调试?我还没有安装过,这两天才开始学,今天刚看完一本书.从明天开始研究细节方面.还有我准备买一个开发板,编程器我已经有了.
0
回复
ningsane
LV.4
29
2005-12-14 15:26
@ucc2800
用什么软件调试?我还没有安装过,这两天才开始学,今天刚看完一本书.从明天开始研究细节方面.还有我准备买一个开发板,编程器我已经有了.
现在开发环境有了么?有编程器就自己作个板子,便宜多了,
0
回复
ucc2800
LV.7
30
2005-12-15 09:58
@ningsane
现在开发环境有了么?有编程器就自己作个板子,便宜多了,
不好买零件啊,板子也很贵,想了想还是买划算一点
开发环境我是从微芯网站上下载的
什么maltab v7.22
0
回复
picczzz
LV.2
31
2005-12-20 19:49
用c语言吧,会提高很大效率.给你个免费软件下载点http://www.pic16.com/jszl/jszl.htm
0
回复