欢迎来到亿配芯城! | 免费注册
你的位置:GD32兆易创新MCU芯片全系列-亿配芯城 > 芯片资讯 > PIC单片机查表程序的设计
PIC单片机查表程序的设计
发布日期:2024-11-20 07:06     点击次数:177
PIC的查表程序可以利用子程序返回值的特点来实现。具体来说,在主程序中,首先取表的数据地址并放入w中,然后调用子程序,子程序的第一条指令放入w中,然后程序跳转到数据地址的位置,然后“RETLW”指令将数据放入w中并返回主程序。以下过程使用F10来放置标题地址。移动工作台;标题地址→F10MOVWF 10┋mov lw 1;1→W,准备取线段值“1”ADDWF 10,1;F10+w = "1 "数据地址呼叫转换mov wf 6;将线段值设置为端口b,并点亮发光二极管。┋转换MOVwf 2;w→电脑桌RETLW 0C0H“0”段值RETLW 0F9H“1”段值┋RETLW 90H“9”段值9)"改为...数据,RESTORE”格式程序“读...data”程序一次读取一个数据表中的一个数据,然后将1加到数据指针上以准备下一个数据。在以下示例中,F10用作数据表的起始地址,F11用作数据指针。指针EQU 11;将F11定义为指针┋移动数据MOVWF 10数据标题地址→F10CLRF指针;清除数据指针┋MOVF POINTER,0ADDWF 10,0;w = F10+指针┋INCF指针,1;指针加1呼叫转换;调整程序,获取表格数据┋转换MOVwf 2;数据地址→电脑数据返回20H数据┋RETLW 15H数据如果你想执行“恢复”,只需执行一个“CLRF指针”。 10)延迟程序如果延迟时间短,程序可以简单地连续执行几个空的操作指令“NOP”。如果延迟时间长,可以通过循环来实现。在以下示例中,F10用于使循环重复100次。MOVLW D'100 'MOVWF 10环路DECFSZ 10,1;F10-1 → F10,如果结果为零,跳转到循环┋延迟程序中计算的指令执行时间之和就是延迟时间。如果使用4MHz振荡,每个指令周期为1 μ s,因此单周期指令时间为1μS,双周期指令时间为2 μ s,上例中的循环周期延迟时间为:(1+2)*100+2=302(μS)。在循环中插入空操作指令会延长延迟时间:MOVLW D'100 'MOVWF 10环路NOPNOPNOPDECFSZ 10,1,1转到循环┋延迟时间=(1+1+1+1+2)*100+2=602(μS)。嵌套几个循环可以大大延长延迟时间。以下示例使用2个周期来延迟:MOVLW D'100 'MOVWF 10环路移动阀D'16 'MOVWF 11DECFSZ 11,1,1回路1转到循环1DECFSZ 10,1,1转到循环┋延迟时间= 1+1+[1+1+(1+2)* 16-1+1+2]* 100-1 = 5201(μs)11)RTCC计数器的使用RTCC是脉冲计数器。它的计数脉冲有两个来源,一个是从RTCC引脚输入的外部信号,另一个是内部命令时钟信号。您可以使用程序选择信号源之一作为输入。程序可以将RTCC用于计时目的。程序读取RTCC寄存器值来计算时间。当RTCC用作内部定时器时,将RTCC引脚连接到VDD或VSS,以减少干扰和电流消耗。以下示例使用RTCC作为延迟:RTCC·EQU 1┋CLRF·RTCC;RTCC晴0MOVLW 07H选项;选择预设倍数1: 256 → RTCC环路MOVLW 255RTCC计数最终值RTCC超低音扬声器,0BTFSS状态,Z;RTCC=255?转到循环┋在这个延迟程序中,RTCC寄存器每256个指令周期递增1(分频比= 1: 256)。如果芯片使用4MHz振荡,则:延迟时间=256*256=65536(μS)RTCC是自振荡的。当它计数时,程序可以做其他事情,只要它定期读取它并检测它的计数值。12)注册银行地址对于PIC16C54/55/56,有32个寄存器,只有一个存储体,因此不存在存储体寻址问题。对于PIC16C57/58,有80个寄存器,分为4个存储体(BANK0-BANK3)。在对F4(FSR)的解释中,可以看出F4的位6和位5是寄存器体寻址位,它们的对应关系如下:当芯片上电复位时,F4的位6和位5是随机的,而没有上电的复位将保持在原始状态。以下示例将数据写入BANK1和BANK2的30H和50H寄存器。例1。(将当前正文设置为BANK0)BSF 4,5;设置位5=1,选择BANK1移动数据MOVWF 10H数据→30H巴塞尔公约框架4,5BSF 4,6;位6=1, 亿配芯城 位5=0选择BANK2。MOVWF 10H数据→50H从上面的例子中,我们可以看到,要在银行中读写寄存器,我们必须首先操作F4的银行地址位。在实际应用中,上电复位后,F4的位6和位5清0,指向BANK0,然后根据需要指向相应的主体。注意,在本例中,当向30H寄存器(BANK1)和50H寄存器(BANK2)写入数字时,指令“MOVWF 10H”中的寄存器地址被写入“10H”,而不是读者期望的“MOVWF 30H”和“MOVWF 50H”。为什么?让我们复习一下说明书。在所有与PIC16C5X寄存器相关的指令代码中,寄存器地址位仅占用5位:fffff,只能寻址32个(00H—1FH)寄存器。因此,需要定位80个寄存器,位PA1和PA0需要用两位定位。当我们将主体地址位PA1和PA0设置为指向一个存储体时,指令“MOVWF 10H”将w内容放入该存储体中相应的寄存器(10H、30H、50H或70H)。一些设计师对第一次接触的选址概念有不同的理解。下面是一个例子:示例2:(假设当前主体是BANK0)MOVLW 55HMOVWF 30H要更改55H→30H寄存器MOVLW 66HMOVWF 50H要更改66H→50H寄存器认为“莫夫夫30H”能把w放进30H,“莫夫夫50H”能把w放进50H是错误的。因为这两个指令的实际效果是“MOVWF 10H”,原因已经在上面解释过了。因此,实施例2中该过程的最终结果是F10H=66H,而实际的F30H和F50H没有被操作。建议:为了使网站选择过程清晰,建议使用名称定义器来编写过程,这是不容易混淆的。示例3:假设程序中使用了BANK0、BANK1和BANK2的几个寄存器,如下所示:EQU 10H;BANK0EQU 10H;银行1EQU 10H;银行2┋FSR·EQU 4第6位EQU 6第5位EQU 5数据EQU 55H┋移动数据MOVWF ABSF·FSR,第5位mov wf B;数据→F30HBCF FSR,第5位BSF·FSR,第6位莫夫谢斯;数据→F50H┋如果程序是以这种方式编写的,就不容易相信网站选择是错误的。13)跨页面程序跳转和调用以下描述了PIC16C5X程序存储区的页面概念,以及F3寄存器中页面地址位PA1和PA0的两个应用实例。(1)跨页面“转到”例如,假设当前程序在第0页(第0页),您想使用“GOTO”跳转到第1页的某个地方。钥匙(第1页).EQU状况3PA1 EQU 6PA0 EQU 5┋BSF地位,第0部分;PA0=1,选择页面页面转到键;跨页面跳转到第1页的键┋关键诺普;1页程序┋(2)跨页面“调用”例如,假设当前程序在第0页(第0页),现在我们想调用第1页(第1页)的子程序DELAY。┋BSF地位,第0部分;PA0=1,选择第1页呼叫延迟;跨页呼叫BCF状态,PA0还原0页地址┋延迟NOP1页子程序┋注意:程序已经为跨页调用设置了一个页面地址。从子程序返回后,必须恢复原始页面地址。(3)程序跨页跳转和调用的编译读者必须问:当我写源代码时。程序,我不注意每个指令的存储地址。我怎么知道这个GOTO是跨页的,那个调用是跨页的?的确,当你开始编写源程序时,你知道什么时候会发生跨页面跳转或调用,但是当你组装源程序时,它会自动给出。当装配结果显示:X X X(地址)“转到范围外”X X X(地址)“呼叫超出范围”这表明您的程序已经进行了跨页面跳转和调用,并且您的程序在这些跨页面GOTO和CALLs之前没有设置相应的页面地址。这时,你应该看看。程序集生成的LST文件,找到这些GOTO和CALL,并查看它们将跳转到哪个页面,然后返回到源程序(。进行必要的修改。直到您的源代码被编译和传递。(4)程序页面的连接应该在程序的4页连接处进行一些处理。一般建议使用以下格式:在进入另一页后,立即设置相应的页地址位(PA1,PA0)。页面处理是PIC16C5X编程中最麻烦的部分,但并不难。只要你做一个实际的编程练习,你就能掌握它。