PIC程序集:用变量调用函数



假设我有一个变量,它包含一个歌曲编号。->歌曲_无

根据这个变量的值,我希望调用一个函数。

假设我有许多不同的功能:

Fcn1。。。。Fcn2。。。。Fcn3

例如,如果song_no=1,调用Fcn1如果song_no=2,则调用Fcn2等等

我该怎么做?

您应该在指令集中有compare函数(帖子建议您正在寻找汇编解决方案),其结果通常是设置True位或在寄存器中设置值。但你需要检查一下指令集。

代码应该看起来像:

load(song_no, $R1)
cmpeq($1,R1)   //result is in R3
jmpe  Fcn1     //jump if equal
cmpeq ($2,R1)
jmpe  Fcn2
....

希望这能帮助

我对图片不太熟悉,但这类东西通常是作为跳转表实现的。简而言之,将指向目标例程的指针放在数组中,然后调用/跳转到由song_no索引的条目。你只需要以某种方式将地址计算到数组中,所以它非常有效。没有必要进行比较。

要详细说明Jens的回复,在12/14位PIC上执行的传统方法与从ROM中查找常量数据的方法相同,只是您不用RETLW返回数字,而是用GOTO跳到所需的例程。实际跳转到跳转表是通过将偏移量添加到程序计数器来执行的。

大致如下:

    movlw high(table)
    movwf PCLATH
    movf song_no,w
    addlw table
    btfsc STATUS,C
    incf PCLATH
    addwf PCL
table:
    goto fcn1
    goto fcn2
    goto fcn3
     .
     .
     .

不幸的是,这里有一些微妙之处。

  • PIC16只有一个8位累加器,而要跳转到的地址空间是11位。因此,可直接写入的低字节(PCL)和锁存的高字节PCLATH寄存器都是可用的。一旦进行跳转,锁存器中的值将作为MSB应用
  • 跳转表可能会跨页,因此手动进入PCLATH。如果您知道该表将始终位于256指令页内,则省略BTFSC/INCF
  • 当PCL被添加到表中时,ADDWF指令将已经被读取并指向表。因此,0偏移量跳到第一个表条目
  • 与PIC18不同,每个GOTO指令都适合一个14位指令字,PCL寻址指令而不是字节,因此偏移量不应乘以2

综合考虑,你最好搜索一下PIC16的通用教程。其中任何一个都将清楚地解释数据/跳转表是如何工作的,更不用说从如何处理芯片的基础知识开始了。坦率地说,这是一个特别复杂的体系结构,我建议你继续使用"免费"的高科技C编译器,除非你特别喜欢逻辑谜题或迫切需要它的性能。

最新更新