PIC单片机汇编语言基础
IC8位单片机汇编语言常用指令的识读

PIC单片机指令集简介PIC 8位单片机共有三个级别,有相对应的指令集。
基本级PIC系列芯片共有指令33条,每条指令是12位字长;中级PIC系列芯片共有指令35条,每条指令是14位字长;高级PIC系列芯片共有指令58条,每条指令是16位字长。
其指令向下兼容。
一、PIC汇编语言指令格式PIC系列微控制器汇编语言指令与MCS-51系列单片机汇编语言一样,每条汇编语言指令由4个部分组成,其书写格式如下:标号操作码助记符操作数1,操作数2;注释指令格式说明如下:指令的4个部分之间由空格作隔离符,空格可以是1格或多格,以保证交叉汇编时,PC机能识别指令。
1与MCS-51系列单片机功能相同,标号代表指令的符号地址。
在程序汇编时,已赋以指令存储器地址的具体数值。
汇编语言中采用符号地址(即标号)是便于查看、修改,尤其是便于指令转移地址的表示。
标号是指令格式中的可选项,只有在被其它语句引用时才需派上标号。
在无标号的情况下,指令助记符前面必须保留一个或一个以上的空格再写指令助记符。
指令助记符不能占用标号的位置,否则该助记符会被汇编程序作标号误处理。
书写标号时,规定第一字符必须是字母或半角下划线“—”,它后面可以跟英文和数字字符、冒号(:)制符表等,并可任意组合。
再有标号不能用操作码助记符和寄存器的代号表示。
标号也可以单独占一行。
2该字段是指令的必选项。
该项可以是指令助记符,也可以由伪指令及宏命令组成,其作用是在交叉汇编时,“指令操作码助记符”与“操作码表”进行逐一比较,找出其相应的机器码一一代之。
3由操作数的数据值或以符号表示的数据或地址值组成。
若操作数有两个,则两个操作数之间用逗号(,)分开。
当操作数是常数时,常数可以是二进制、八进制、十进制或十六进制数。
还可以是被定义过的标号、字符串和ASCⅡ码等。
具体表示时,规定在二进制数前冠以字母“B”,例如B10011100;八进制数前冠以字母“O”,例如O257;十进制数前冠以字母“D”,例如D122;十六进制数前冠以“H”,例如H2F。
PIC单片机C语言编程入门

PICC 入门笔录PIC 单片机 C 语言编程入门笔录一、 C语言基础复习 --------没 C语言基础看起来可能有点困难。
C程序的语句语句名称一般形式说明表达式语句表达式;表达式语句由表达式加上分号“;”组成函数调用语函数名 ( 实质参数表 ) ;实质参数、形式参数二个看法要理解句控制语句附件 1控制语句用于控制程序的流程复合语句多个语句用括号 {} 括起空语句;只有分号“;”组成的语句称为空语句赋值语句变量 =( 变量 =表达式 );赋值表达式再加上分号组成的表达式语句数据输出语printf( “格式控制字符句串” )附件 1(1)条件判断语句if 语句, switch 语句(2)循环执行语句do while 语句, while 语句, for 语句(3)转向语句break 语句, goto语句, continue语句, return语句小于小于或等于关系运算符大于大于或等于等于不等于<<=>>===!=关系运算符都是双目运算符,其结合性均为左结合。
在六个关系运算符中,<,<=,>,>= 的优先级相同,高于 ==和 != ,==和!= 的优先级相同。
关系表达式的值是“真”和“假” ,用“ 1”和“ 0”表示。
与运算逻辑运算符或运算非运算&&||!&&和或运算符|| 均为双目运算符。
拥有左结合性。
非运算符”! ”为单目运算符,拥有右结合性 , 逻辑运算的值也为“真”和“假”两种,用“ 1”和“0 ”来表示。
单目运算符 >算术运算符 >关系运算符 >逻辑运算符 >赋值运算符第三章 :控制语句1.if语句C语言的 if语句有三种基本形式。
1、若是表达式的值为真,则执行此后的语句,否则不执行该语句。
if(表达式)语句;2、若是表达式的值为真,则执行语句1,否则执行语句 2 。
If( 表达式 )语句 1;else语句 2;3、依次判断表达式的值,当出现某个值为真时,则执行其对应的语句。
PIC8位单片机汇编语言常用指令的识读

成都 史为
三、面向字节、常数与控制操作的指令
1传送立即数至工作寄存器W指令
指令格式:MOVLW k;k表示常数、立即数和标号
说明:MOVLW是Move Literal to w的缩写
实例:MOVL 0x1E;常数30送W
2I/O口控制寄存器TRIS设置指令
指令格式;TRIS f
说明;TRIS f是Load TRIS Register的缩写。其功能是把工作寄存器W的内容送入I/O口控制寄存器f。当W=0时,置对应I/O口为输出;W=1,置I/O口为输入。
(3) CLRF COUNT1;对计数器1清零
(4)LOOP INCFSZ COUNT1;计数器1加1计数器1加
1结果不为零,跳转循环 (5) Nhomakorabea GOTO LOOP ;
(6) DECTSZ CPUNT2 ;计数2减1计数器2减1
结果不为零,跳转循环重
复执行第4条指令
(7) GOTO LOOP ;
(8) RETLW 0 ;子程序执行结束返回
说明:程序中的注释已分别对每条指令的功能作了说明,补充说明1当执行第(4)条加1指令结果为零时,就间跳转到执行第(6)条指令。2当执行第(6)条减1指令结果为零时,就间跳转到第(8)条子程序返回,整个延时指令才算完成。3计数器1或2代表PIC中某个寄存器,该寄存器由程序开始的伪指令赋值决定(关于伪指令今后将作专门介绍)。
MOVWF W_TEMP ;将W内容存入到临时寄存器
PIC单片机汇编语言基础

P I C单片机汇编语言基础(总18页)--本页仅作为文档封面,使用时请直接删除即可----内页可以根据需求调整合适字体及大小--PIC单片机汇编语言基础1、程序的基本格式先介绍二条伪指令:EQU ——标号赋值伪指令ORG ——地址定义伪指令PIC16C5X在RESET后指令计算器PC被置为全“1”,所以PIC16C5X几种型号芯片的复位地址为:PIC16C54/55:1FFHPIC16C56:3FFHPIC16C57/58:7FFH一般来说,PIC的源程序并没有要求统一的格式,大家可以根据自己的风格来编写。
但这里我们推荐一种清晰明了的格式供参考。
TITLE This is …… ;程序标题;--------------------------------------;名称定义和变量定义;--------------------------------------F0 EQU 0RTCC EQU 1PC EQU 2STATUS EQU 3FSR EQU 4RA EQU 5RB EQU 6RC EQU 7┋PIC16C54 EQU 1FFH ;芯片复位地址PIC16C56 EQU 3FFHPIC16C57 EQU 7FFH;-----------------------------------------ORG PIC16C54 GOTO MAIN ;在复位地址处转入主程序ORG 0 ;在0000H开始存放程序;-----------------------------------------;子程序区;-----------------------------------------DELAY MOVLW 255┋RETLW 0;------------------------------------------;主程序区;------------------------------------------MAINMOVLW B‘00000000’TRIS RB ;RB已由伪指令定义为6,即B口┋LOOPBSF RB,7 CALL DELAYBCF RB,7 CALL DELAY┋GOTO LOOP;-------------------------------------------END ;程序结束注:MAIN标号一定要处在0页面内。
PIC单片机汇编语言学习(一)

PIC单⽚机汇编语⾔学习(⼀)1、汇编语⾔的语句格式:标号操作码(指令助记符)操作数 ;注释(label) (opcode) (operand) (comment)2、常⽤伪指令a.EQU——符号名赋值伪指令格式:符号名 EQU nn——程序起始地址定义伪指令格式:ORG nnnnc.END——程序结束伪指令格式:ENDd.LIST——列表选项伪指令格式:LIST [可选项,可选项,......]e.INCLUDE:调⼊外部程序⽂件伪指令格式:INCLUDE "⽂件名"2、分⽀程序结构——对于程序中的指令运⽤作⼏点说明:(1)凡是需要2个数参与的逻辑运算(与、或、异或)和算术运算(加、减),都需要事先将其中⼀个操作数放⼊W中。
对于在此使⽤的减法指令更要格外关注,应预先把减数放⼈W中,或者说,预先放⼊W中的数,在运算中是当做减数,⽽寄存器中的数当做了被减数。
(2)⼀条条件跳转指令往往需要跟随⼀条⽆条件跳转指令,才能实现长距离的转移和程序的分⽀。
(3)PIC单⽚机的指令系统中没有设置专⽤的停机指令,可以⽤⼀条跳转到⾃⾝的⽆条件跳转指令GOTO来实现。
3、PIC单⽚机指令由3种基本类型指令组成:a.字节操作类指令b.位操作类指令c.⽴即数和控制操作类指令对于字节操作指令,f——>⽂件寄存器标识符,d——>⽬标寄存器标识符说明:⽬标标识符指定了操作结果的存放位置:d=0 操作结果存⼊W寄存器d=1 操作结果存⼊指定的⽂件寄存器,d默认值为14、指令集5、例⼦1 ;--------------------------------------------------------23 ;顺序程序结构4 ;将20H单元低4位取出存⼊21H,⾼四位取出存⼊22H5 ;要点:ANDLW和SWAPF67 ;---------------------------------------------------------8 MOVF 20H,0 ;将20H单元的内容送⼈W9 ANDLW 0FH ;W⾼四位清零低4位保持不变10 MOVWF 21H ;将拆分后的低4位送21H11 SWAPF 20H,0 ;将20H单元内容⾼、低半字节换位后送W1213 ANDLW 0FH ;再将W⾼四位清0低四位保持不变14 MOVWF 22H ;将拆分后的⾼四位送22H单元151617 ;--------------------------------------------------------1819 ;分⽀程序结构20 ;RAM中20H和21H单元存放2个数,找出⼤着存⼊22H单元21 ;要点:两数做减法,判断标志位C的值2223 ;---------------------------------------------------------24 STATUS EQU 03H ;定义STATUS寄存器地址为03H25 C EQU 0 ;定义进位/借位标志C在STATUS中得地址为026 MOVF 20H 0 ;将20H单元的内容送⼈W27 SUBWF 21H 0 ;⽤21H单元的内容减去W中的内容,结果存在W中28 BTFSS STATUS,C;若C=1,没借位,则21H单元中的数⼤,跳到F21BIG29 GOTO F20BIG ;若C=0,有借位,20H单元中得数较⼤,则跳⾄F20BIG 3031 F21BIG MOVF 21H,0 ;将21H中的内容存⼊W寄存器32 MOVWF 22H ;再将它转存到22H单元33 GOTO STOP ;跳过下⾯两条指令到程序末尾3435 F20BIG MOVF 20H,0 ;将20H中的内容存⼊W寄存器36 MOVWF 22H ;再将它转存到22H单元3738 STOP GOTO STOP ;任务完成,停机,原地踏步394041 ;--------------------------------------------------------4243 ;循环程序结构44 ;数据存储器中,从地址30H开始的50个单元全部写⼊00H45 ;要点:间接寻址寄存器FSR当做地址指针4647 ;---------------------------------------------------------48 COUNT EQU 20H ;指定20H单元作为循坏次数计数器(即循环变量)49 FSR EQU 04H ;定义FSR寄存器地址为04H50 INDF EQU 00H ;设定INDF寄存器地址为00H51 MOVLW D50 ;把计数器初值50送⼊W52 MOVWF COUNT ;再把50转⼊计数器(作为循环变量的操作值)53 MOVLW 30H ;把30H(起始地址)送⼊W54 MOVWF FSR ;再把30H转⼊寄存器FSR(⽤作地址指针)5556 NEXT CLRF INDF ;把以FSR内容为地址所指定的单元清057 INCF FSR,1 ;地址指针内容加1,指向下⼀单元58 DECFSZ COUNT,1 ;计数值减1,结果为0就跳过到下⼀条指令到STOP处59 GOTO NEXT ;跳转回去并执⾏下⼀次循环60 STOP GOTO STOP ;循环结束之后执⾏该语句,实现停机6162 ;--------------------------------------------------------6364 ;⼦程序结构65 ;3个数最⼤者放⼊40H单元6667 ;---------------------------------------------------------68 STATUS EQU 03H69 C EQU 00H70 X EQU 20H71 Y EQU 21H72 Z EQU 22H73 ;--------------------------------------------------------7475 ;主程序7677 ;---------------------------------------------------------7879 MAIN MOVF 30H,080 MOVWF X81 MOVF 21H,082 MOVWF Y83 CALL SUB84 MOVF Z,085 MOVWF X86 MOVF 32H,087 MOVWF Y88 CALL SUB89 MOVF Z,090 MOVWF 40H91 STOP GOTO STOP92 ;--------------------------------------------------------9394 ;⼦程序:(⼊⼝参数:X和Y,出⼝参数:Z)9596 ;---------------------------------------------------------97 SUB MOVF X,0 ;将X内容送⼈W98 SUBWF Y,0 ;Y内容减去W内容,结果存⼊W99 BTFSS STATUS,C;若C=1,没有发⽣借位,执⾏下⼀条,否则跳转100 GOTO X_BIG101102 Y_BIG MOVF Y,0 ;将Y中的数据送⼊W103 MOVWF Z ;再将它转存到Z104 GOTO THEEND ;跳过下⾯两条到末尾105106 X_BIG MOVF X,0 ;将X中的数据送⼊W107 MOVWF Z ;再将它转存到Z108 THEEND RETURN ;⼦程序返回。
PIC汇编语言程序设计基础

PIC汇编语言程序设计基础汇编语言是一种底层的计算机语言,可以直接操作计算机的硬件。
PIC汇编语言是一种常用于单片机(microcontroller)的汇编语言,主要用于编写控制程序。
本文将介绍PIC汇编语言的基本概念和学习方法。
首先,了解一些关于单片机的基本知识是很有帮助的。
单片机是一种集成电路,它包含了处理器、内存和输入输出接口等功能。
常用的单片机系列有PIC、AVR和8051等。
其中,PIC是由美国Microchip公司开发的一系列单片机。
学习PIC汇编语言的基础知识包括以下几个方面:1.计算机系统的基本概念:了解计算机系统的组成,包括处理器、内存和输入输出设备等。
了解汇编语言是如何运行在计算机系统上的。
2.汇编语言的基本知识:了解汇编语言的语法和指令集。
汇编语言是一种低级语言,使用符号代表具体的机器指令。
掌握汇编语言的基本语法,如变量声明、标号、指令和操作数等。
3.PIC汇编语言的特点:了解PIC单片机的特点和架构。
掌握PIC汇编语言的指令集和寄存器的使用方法。
了解数据存储器、程序存储器和特殊功能寄存器等的地址和用途。
4.单片机的编程方法:学习如何编写控制程序,包括输入输出控制、中断处理和定时器等。
了解控制程序的基本结构,如初始化、主循环和中断处理程序等。
在学习PIC汇编语言时,可以通过以下几种途径进行:1. 理论学习:可以通过阅读相关的教材和参考书籍了解PIC汇编语言的基本概念和语法。
可以参考Microchip官方提供的PIC汇编语言手册。
2. 实验实践:可以通过实验和实践的方式学习。
可以利用单片机开发板进行实验,通过编写控制程序来实现一些简单的功能。
可以使用Microchip官方提供的开发环境和仿真器。
3.网上资源:可以利用互联网上的资源进行学习。
有很多相关的教程和视频可以参考。
可以加入一些技术论坛和交流群组,与其他学习者进行交流和探讨。
在学习和实践过程中1.理解问题:首先要明确需要解决的问题,确定需要设计和实现的功能。
PIC汇编语言程序设计基础

3. 4.
(三)操作数
• 操作数是指令操作的对象,是数据或数据的地址。它们 可以使用数值或标号形式表示。 • 其中,数值可以使用二进制、八进制、十进制和十六进 制或ASCII字符值(参见讲义88页表4.2);而标号可以 是在此前定义或赋值的代表数字或地址标号或字符串。 • 如果操作数有两个,中间应由逗号隔开。
(二)ORG --- 程序起始地址定义伪指令
• 格式:
ORG nnnn
• 说明:用于指定该伪指令后面的源程序在ROM中存放 的起始地址。 • nnnn 为13位长的地址参数。
• 举例: ORG 0005H MAIN CLRW CALL SUB
:
MAIN是标号,也就是本行指令的符号地址。ORG伪指 令又将该符号地址定义为单片机内部RAM的0005H单 元,即CLRW的机器码存储在程序存储器ROM的0005H 开始的单元中。
( label ) ( opcode ) ( operand ) (commend)
1. 2.
标号必须从左面第1列开始,后面至少用1个空格与操 作码隔离(注意:标号后面没有冒号); 在无标号时,操作码前至少要保留一个或一个以 上的空格(建议使用“Tab”键分割标号列);
3.
操作码与操作数之间至少要保留一个或一个以上的 空格,如果有两个操作数时两者之间要由逗号(半 角)隔开(建议使用“Tab”键分割) ; 注释由分号(英文半角)引导,在标号、操作码和 操作数之后。标号也可以单独占一行单必需由分号 引导。
指令的可选项共有十余种,这里仅介绍2种。
① P=〈设定单片机型号〉。 例如:P = 16F877
② R=〈定义默认的数值进制〉。例如:R=DEC(十进制) 或:R=HEX(十六进制)
PIC单片机指令系统和汇编语言程序设计

PIC单片机指令系统和汇编语言程序设计PIC(Peripheral Interface Controller)单片机是一种微控制器,它由微芯科技公司推出,广泛应用于嵌入式系统中。
PIC单片机的指令系统是它的核心,它定义了单片机可以执行的操作和命令。
汇编语言程序设计是使用汇编语言编写的PIC单片机程序的过程。
PIC单片机的指令系统包含了多个指令,每个指令都对应着一条特定的操作。
这些操作可以是算术运算、逻辑运算、数据传输、位操作等。
指令系统的设计考虑了单片机的资源限制,以使其能够在有限的资源条件下完成各种任务。
汇编语言是一种低级语言,它与机器语言相似,但更具可读性。
在PIC单片机编程中,汇编语言常用于编写程序。
汇编语言程序设计包括了以下几个方面:1.汇编语言的语法:汇编语言有自己的语法规则,包括指令的书写方式、注释的使用、标号的定义等。
了解汇编语言的语法对于编写正确的程序至关重要。
2.寄存器的使用:PIC单片机有多个寄存器用于存储数据和指令。
在汇编语言程序中,需要了解不同寄存器的功能和使用方法,以便正确地读写数据。
3.指令的编写:编写汇编语言程序需要了解不同指令的功能、操作数的使用和指令的影响。
不同的指令可以实现不同的操作,如加法、逻辑运算、数据传输等。
4.程序的逻辑结构:汇编语言程序需要按照一定的逻辑结构编写,包括初始化程序、主循环、中断处理等。
了解如何组织程序结构对于编写清晰、可读性强的程序至关重要。
5.调试和优化:在编写汇编语言程序时,常常需要进行调试和优化,以确保程序能够正确地运行。
了解如何使用调试工具和优化技巧对于提高程序的效率和稳定性至关重要。
总之,PIC单片机的指令系统和汇编语言程序设计是使用PIC单片机进行编程的基础。
掌握了这些知识,可以编写高效、可靠的PIC单片机程序,实现各种嵌入式系统的功能。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
PIC单片机汇编语言基础1、程序的基本格式先介绍二条伪指令:EQU ——标号赋值伪指令ORG ——地址定义伪指令PIC16C5X在RESET后指令计算器PC被置为全“1”,所以PIC16C5X几种型号芯片的复位地址为:PIC16C54/55:1FFHPIC16C56:3FFHPIC16C57/58:7FFH一般来说,PIC的源程序并没有要求统一的格式,大家可以根据自己的风格来编写。
但这里我们推荐一种清晰明了的格式供参考。
TITLE This is …… ;程序标题;--------------------------------------;名称定义和变量定义;--------------------------------------F0 EQU 0RTCC EQU 1PC EQU 2STATUS EQU 3FSR EQU 4RA EQU 5RB EQU 6RC EQU 7┋PIC16C54 EQU 1FFH ;芯片复位地址PIC16C56 EQU 3FFHPIC16C57 EQU 7FFH;-----------------------------------------ORG PIC16C54 GOTO MAIN ;在复位地址处转入主程序ORG 0 ;在0000H开始存放程序;-----------------------------------------;子程序区;-----------------------------------------DELAY MOVLW 255┋RETLW 0;------------------------------------------;主程序区;------------------------------------------MAINMOVLW B‘00000000’TRIS RB ;RB已由伪指令定义为6,即B口┋LOOPBSF RB,7 CALL DELAYBCF RB,7 CALL DELAY┋GOTO LOOP;-------------------------------------------END ;程序结束注:MAIN标号一定要处在0页面内。
2、程序设计基础1) 设置 I/O 口的输入/输出方向PIC16C5X的I/O 口皆为双向可编程,即每一根I/O 端线都可分别单独地由程序设置为输入或输出。
这个过程由写I/O 控制寄存器TRIS f来实现,写入值为“1”,则为输入;写入值为“0”,则为输出。
MOVLW 0FH ;0000 1111(0FH)输入输出TRIS 6 ;将W中的0FH写入B口控制器,;B口高4位为输出,低4位为输入。
MOVLW 0C0H ; 11 000000(0C0H)RB4,RB5输出0 RB6,RB7输出12) 检查寄存器是否为零如果要判断一个寄存器内容是否为零,很简单,现以寄存器F10为例:MOVF 10,1 ;F10→F10,结果影响零标记状态位ZBTFSS STATUS,Z ;F10为零则跳GOTO NZ ;Z=0即F10不为零转入标号NZ处程序┋;Z=1即F10=0处理程序3) 比较二个寄存器的大小要比较二个寄存器的大小,可以将它们做减法运算,然后根据状态位C来判断。
注意,相减的结果放入W,则不会影响二寄存器原有的值。
例如F8和F9二个寄存器要比较大小:MOVF 8,0 ;F8→WSUBWF 9,0 ;F9—W(F8)→WBTFSC STATUS,Z ;判断F8=F9否GOTO F8=F9BTFSC STATUS,C ;C=0则跳GOTO F9>F8 ;C=1相减结果为正,F9>F8GOTO F9<F9 ;C=0相减结果为负,F9<F8┋4) 循环n次的程序如果要使某段程序循环执行n次,可以用一个寄存器作计数器。
下例以F10做计数器,使程序循环8次。
COUNT EQU 10 ;定义F10名称为COUNT(计数器)┋MOVLW 8MOVWF COUNT LOOP ;循环体LOOP┋DECFSZ COUNT,1 ;COUNT减1,结果为零则跳GOTO LOOP ;结果不为零,继续循环┋;结果为零,跳出循环5)“IF……THEN……”格式的程序下面以“IF X=Y THEN GOTO NEXT”格式为例。
MOVF X,0 ;X→WSUBWF Y,0 ;Y—W(X)→WBTFSC STATUS,Z ;X=Y 否GOTO NEXT ;X=Y,跳到NEXT去执行。
┋;X≠Y6)“FOR……NEXT”格式的程序“FOR……NEXT”程序使循环在某个范围内进行。
下例是“FOR X=0 TO 5”格式的程序。
F10放X的初值,F11放X的终值。
START EQU 10DAEND EQU 11┋MOVLW 0MOVWF START ;0→START(F10)MOVLW 5MOVWF DAEND ;5→DAEND(F11)LOOP┋INCF START,1 ;START值加1MOVF START,0SUBWF DAEND,0 ;START=DAEND ?(X=5否)BTFSS STATUS,ZGOTO LOOP ;X<5,继续循环┋;X=5,结束循环 7)“DO WHILE……END”格式的程序“DO WHILE……END”程序是在符合条件下执行循环。
下例是“DO WHILE X=1”格式的程序。
F10放X的值。
X EQU 10┋MOVLW 1MOVWF X ;1→X(F10),作为初值 LOOP┋MOVLW 1SUBWF X,0BTFSS STATUS,Z ;X=1否?GOTO LOOP ;X=1继续循环┋;X≠1跳出循环8) 查表程序查表是程序中经常用到的一种操作。
下例是将十进制0~9转换成7段LED数字显示值。
若以B口的RB0~RB6来驱动LED的a~g线段,则有如下关系:设LED为共阳,则0~9数字对应的线段值如下表:十进数线段值十进数线段值0 C0H 5 92H1 C9H 6 82H2 A4H 7 F8H3 B0H 8 80H4 99H 9 90HPIC的查表程序可以利用子程序带值返回的特点来实现。
具体是在主程序中先取表数据地址放入W,接着调用子程序,子程序的第一条指令将W置入PC,则程序跳到数据地址的地方,再由“RETLW”指令将数据放入W返回到主程序。
下面程序以F10放表头地址。
MOVLW TABLE ;表头地址→F10MOVWF 10┋MOVLW 1 ;1→W,准备取“1”的线段值ADDWF 10,1 ;F10+W =“1”的数据地址CALL CONVERTMOVWF 6 ;线段值置到B口,点亮LED┋CONVERT MOVWF 2 ;W→PC TABLERETLW 0C0H ;“0”线段值RETLW 0F9H ;“1”线段值┋RETLW 90H ;“9”线段值9)“READ……DATA,RESTORE”格式程序“READ……DATA”程序是每次读取数据表的一个数据,然后将数据指针加1,准备取下一个数据。
下例程序中以F10为数据表起始地址,F11做数据指针。
POINTER EQU 11 ;定义F11名称为POINTER┋MOVLW DATAMOVWF 10 ;数据表头地址→F10CLRF POINTER ;数据指针清零┋MOVF POINTER,0ADDWF 10,0 ;W =F10+POINTER┋INCF POINTER,1 ;指针加1CALL CONVERT ;调子程序,取表格数据┋CONVERT MOVWF 2 ;数据地址→PCDATA RETLW 20H ;数据┋RETLW 15H ;数据如果要执行“RESTORE”,只要执行一条“CLRF POINTER”即可。
10) 延时程序如果延时时间较短,可以让程序简单地连续执行几条空操作指令“NOP”。
如果延时时间长,可以用循环来实现。
下例以F10计算,使循环重复执行100次。
MOVLW D‘100’MOVWF 10LOOP DECFSZ 10,1 ;F10—1→F10,结果为零则跳 GOTO LOOP┋延时程序中计算指令执行的时间和即为延时时间。
如果使用4MHz 振荡,则每个指令周期为1μS。
所以单周期指令时间为1μS,双周期指令时间为2μS。
在上例的LOOP循环延时时间即为:(1+2)*100+2=302(μS)。
在循环中插入空操作指令即可延长延时时间:MOVLW D‘100’MOVWF 10LOOP NOPNOPNOPDECFSZ 10,1GOTO LOOP┋延时时间=(1+1+1+1+2)*100+2=602(μS)。
用几个循环嵌套的方式可以大大延长延时时间。
下例用2个循环来做延时:MOVLW D‘100’MOVWF 10LOOP MOVLW D‘16’MOVWF 11LOOP1 DECFSZ 11,1GOTO LOOP1DECFSZ 10,1GOTO LOOP┋延时时间=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 07HOPTION ;选择预设倍数1:256→RTCC LOOP MOVLW 255 ;RTCC计数终值SUBWF RTCC,0BTFSS STATUS,Z ;RTCC=255?GOTO LOOP┋这个延时程序中,每过256个指令周期RTCC寄存器增1(分频比=1:256),设芯片使用4MHz振荡,则:延时时间=256*256=65536(μS)RTCC是自振式的,在它计数时,程序可以去做别的事情,只要隔一段时间去读取它,检测它的计数值即可。
12) 寄存器体(BANK)的寻址对于PIC16C54/55/56,寄存器有32个,只有一个体(BANK),故不存在体寻址问题,对于PIC16C57/58来说,寄存器则有80个,分为4个体(BANK0-BANK3)。
在对F4(FSR)的说明中可知,F4的bit6和bit5是寄存器体寻址位,其对应关系如下:Bit6 Bit5 BANK 物理地址0 0 BANK0 10H~1FH0 1 BANK1 30H~3FH1 0 BANK2 50H~5FH1 1 BANK3 70H~7FH当芯片上电RESET后,F4的bit6,bit5是随机的,非上电的RESET 则保持原先状态不变。