IC单片机指令系统.ppt

上传人:牧羊曲112 文档编号:5575292 上传时间:2023-07-29 格式:PPT 页数:46 大小:1.30MB
返回 下载 相关 举报
IC单片机指令系统.ppt_第1页
第1页 / 共46页
IC单片机指令系统.ppt_第2页
第2页 / 共46页
IC单片机指令系统.ppt_第3页
第3页 / 共46页
IC单片机指令系统.ppt_第4页
第4页 / 共46页
IC单片机指令系统.ppt_第5页
第5页 / 共46页
点击查看更多>>
资源描述

《IC单片机指令系统.ppt》由会员分享,可在线阅读,更多相关《IC单片机指令系统.ppt(46页珍藏版)》请在三一办公上搜索。

1、单片机原理与应用,童亮,联系电话:,北京信息科技大学机电工程学院车辆工程教研室,PIC单片机指令系统及编程技术,指令系统概述汇编语言程序设计PIC 汇编语言的伪指令PIC C语言编程,一、指令系统概述,1机器指令的表示方法指令用于规定计算机的基本操作。一台计算机所能执行的指令集合就是它的指令系统。指令共有两种表示方法,分别是机器语言表示方法和汇编语言表示方法。不同种类的单片机有不同的一套命令(即所谓“指令系统”)。,2汇编语言的表示方法 汇编语言是对机器语言的改进,它采用便于人们记忆的一些符号(例如简化的英文单词)来表示操作码、操作数和地址码等。通常把表示指令的符号称之为助记符。001 MOV

2、F 20H,0;将20H寄存器内容送到W寄存器(d=0)或F寄存器(d=1)002 ANDLW 0FH;将立即数0FH与W中内容相与,结果送W 003 MOVWF 21H;将W中的内容送F寄存器 004 ADDLW 35H;W中的值与立即数35H相加后送W寄存器,一、指令系统概述,一、指令系统概述,3、PIC16F87X单片机指令 PIC16F87X单片机采用精简指令集(RISC)结构,指令效率高,功能强。它的指令为单字的宽字位(14)指令,由此生成的程序代码短。指令条数少,仅有35条。(1)面向字节操作类(2)面向位操作类(3)常数操作和控制类操作。,PIC单片机指令的寻址方式,1寄存器间接

3、寻址 所谓寄存器间接寻址指的是通过寄存器F0、F4来实现。实际的寄存器地址放在F4的低5位中,通过F0来进行间接寻址。INDF不是物理上实际存在的寄存器,而任何寻址INDF的指令都是以FSR寄存器内容为地址的RAM单元中存放着参加运算或操作的数据。,2立即数寻址,所谓立即寻址就是操作数在指令中直接给出。通常把出现在指令中的操作数称之为立即数,因此就把这种寻址方式称之为立即寻址。,PIC单片机指令的寻址方式,3.直接寻址,指令中操作数以其所在存储单元地址的形式给出,就称之为直接寻址。这种方式是对任何一寄存器直接寻址访问。,PIC单片机指令的寻址方式,4.位寻址,这种寻址方式是对寄存器中的任一位(

4、bit)进行操作,PIC单片机指令的寻址方式,1、PIC汇编语言指令格式PIC系列微控制器汇编语言指令与MCS51系列单片机汇编语言一样,每条汇编语言指令由4个部分组成,其书写格式如下:标号 操作码助记符 操作数1,操作数2;注释001 MOVF 20H,0;将20H寄存器内容送到W寄存器(d=0)或F寄存器(d=1)002 ANDLW 0FH;将立即数0FH与W中内容相与,结果送W003 MOVWF 21H;将W中的内容送F寄存器004 ADDLW 35H;W中的值与立即数35H相加后送W寄存器,一、指令系统概述,一、指令系统概述,2.指令符号的意义说明在PIC系列单片机指令中常把数据存储器

5、RAM当作寄存器来使用(处理)并用字母f(或F)表示。d代表操作数的目标选择,定义d=0,结果存入W;d=1结果存入(文件)寄存器f,当使用汇编程序指令d缺省时,默认d=1。b代表(文件)寄存器(8位)的位地址(07取值)。如寄存器的8位为b7、b6b1、b0,若b=1代表寄存器的第b1位。字母符号k代表立即数、常数和数据标号。,一、指令系统概述,二、汇编语言程序设计,1汇编语言源程序的结构 汇编语言提供了一种不涉及实际存储器地址和机器指令编码的编写源程序的有效方法。需要掌握的是:汇编语言的程序格式、语句格式、助记符、伪指令。程序的4种基本结构:顺序、分支、循环和子程序。,二、汇编语言程序设计

6、,2PIC 汇编语言的程序流程图,三、PIC 汇编语言的伪指令,用来编写汇编语言源程序的语句,主要是指令助记符,其次就是伪指令。所谓伪指令就是“假”指令的意思,不是单片机的指令系统中的真实指令。伪指令与指令系统中的助记符的不同之处是没有机器码与它对应。,三、PIC 汇编语言的伪指令,1.INCLUDE 功能:读入外部源文件格式:INCLUDE 说明:用于把指定文件读入源程序中作为源程序代码的一部分。文件名必须用双引号或尖括号给出,如果被指定文件非当前工作目录下,则需要指令完整的路径。#INCLUDE“P16f877A.INC”#INCLUDE,三、PIC 汇编语言的伪指令,2.EQU 功能:对

7、标号赋值格式:EQU 说明:使EQU 两端的8位值相等,即给标号赋予一个特定值或者说是给标号定义一个数值。BCD EQU 20HBIN EQU 21H,三、PIC 汇编语言的伪指令,3.#DEFINE 功能:定义文本替换标号格式:#DEFINE说明:用于定义文本替换标号,在汇编时把源代码中的替换成。DEFINE TL Tongliang,三、PIC 汇编语言的伪指令,4.ORG 功能:存放程序单元的起始地址格式:标号 ORG 说明:用于指定该伪指令后面的源程序存放的起始地址,也就是汇编后的机器码目标程序在单片机的程序存储器中开始存放的首地址。ORG 0 x00ORG 04H,三、PIC 汇编语

8、言的伪指令,5.END 功能:程序结束伪指令格式:END 说明:这条伪指令通知汇编器MPASM结束对源程序(.ASM)的汇编,即使在后面还有语句,也将不予继续汇编。,例子:点亮RC0口的一个LED,status equ 3h;定义状态寄存器地址 portc equ 7h;定义端口C的数据寄存器地址 trisc equ 87h;定义端口C的方向控制寄存器地址;*org 0 x00h;定义程序存放区域的起始地址 nop;放置一条ICD必须的空操用指令 org 0 x10;重新定位 goto main;转向执行程序main bsf status,5;设置文件寄存器的体1 movlw 00h;对端口C

9、的方向控制码00H先送W movwf trisc;再由W转移到方向控制寄存器 bcf status,5;恢复到文件寄存器体0 movlw 01h;将00000001B先送W movwf portc;再由W转移到数据寄存器 送RC0口高电平,点亮LED goto$;让程序在本指令循环 end,C语言,#include main()TRISC=0X00;/*TRISC寄存器被赋值,PORTC每一位都为输出*/while(1);/*循环执行点亮发光二极管的语句*/PORTC=0X01;/*向PORTC送数据,点亮LED*/,点亮一个LED并持续3秒后熄灭,status equ 3h;定义状态寄存器地

10、址 portc equ 7h;定义端口C的数据寄存器地址 trisc equ 87h;定义端口C的方向控制寄存器地址;*org 000h;定义程序存放区域的起始地址 nop;放置一条ICD必须的空操用指令 org 0 x10;goto main;main bsf status,5;设置文件寄存器的体1 movlw 00h;对端口C的方向控制码00H先送W movwf trisc;再由W转移到方向控制寄存器 bcf status,5;恢复到文件寄存器体0 movlw 01h;将00000001B先送W movwf portc;再由W转移到数据寄存器,让RC0输出高电平点亮LED call del

11、ay;调用廷时子程序 bcf portc,0;熄灭LED goto$;原地循环,3秒钟循环点亮和熄灭如何操作,?,;-廷时子程序-delay;子程序名,也是子程序入口地址 movlw 0fh;将外层循环参数值FFH经过W movwf 20h;送入用作外循环变量的20H单元lp0 movlw 0ffh;将第二层循环参数值FFH经过W movwf 21h;送入用作内循环变量的21H单元lp1 movlw 0ffh;将内层循环参数值FFH经过W movwf 22h;送入用作内循环变量的22H单元 lp2 decfsz 22h,1;变量22H内容递减,若为0跳跃 goto lp2;跳转到LP2处 de

12、cfsz 21h,1;变量21H内容递减,若为0跳跃 goto lp1;跳跃到LP1处 decfsz 20h,1;变量20H内容递减,若为0跳跃 goto lp0;跳跃到LP0处 retlw 0;返回主程序 end;源程序结束,C语言,四、PIC C语言编程,Hitech-PICC:IAR:CCS:ByteCraft:,PIC 单片机的C 语言原程序基本框架,在程序的最前面用#include 预处理指令引用包含头文件,其中必须包含一个编译器提供的“pic.h”文件,实现单片机内特殊寄存器和其它特殊符号的声明;用“_CONFIG”预处理指令定义芯片的配置位;声明本模块内被调用的所有函数的类型,P

13、ICC 将对所调用的函数进行严格的类型匹配检查;定义全局变量或符号替换;实现函数(子程序),特别注意main 函数必须是一个没有返回的死循环。,C 语言编程实例,#include/包含单片机内部资源预定义#include“pic1687xa.h”/包含自定义头文件/定义芯片工作时的配置位_CONFIG(HS,C 语言编程实例,/函数和子程序void main(void)SetSFR();PORTC=0 x00;TMR1H+=TMR1H_CONST;LED1=LED_OFF;LCD_Test();/程序工作主循环while(1)asm(“clrwdt”);/清看门狗Clock();/更新时钟Ke

14、yScan();/扫描键盘Measure();/数据测量SetSFR();/刷新特殊功能寄存器,PICC 中的基本变量类型,PICC 中的高级变量,数组:unsigned int data10;结构:struct commInData unsigned char inBuff8;unsigned char getPtr;unsigned putPtr;联合:union int_Byte unsigned char c2;unsigned int i;,PICC位操作,汇编中的位操作是很容易的。在C 中更简单。C 的头文件中已经对所有可能需要位操作的寄存器的每一位都有定义名称:如:PORTA 的

15、每一个I/O 口定义为:RA0、RA1、RA2。RA7。OPTION 的每一位定义为:PS0、PS1、PS2、PSA、T0SE、T0CS、INTEDG、RBPU。可以对其直接进行运算和附值。,PICC位操作,char x;x=x|0B00001000;/*对X 的4 位置1。*/char x;x=x bitclr(x,5),数据寄存器bank 的管理,为了使编译器产生最高效的机器码,PICC 把单片机中数据寄存器的bank 问题交由编程员自己管理,因此在定义用户变量时你必须自己决定这些变量具体放在哪一个bank 中。如果没有特别指明,所定义的变量将被定位在bank0。bank1 unsigne

16、d char buffer32;/变量定位在bank1中bank2 bit flag1,flag2;/变量定位在bank2中bank3 float val8;/变量定位在bank3 中 unsigned char buffer32;bit flag1,flag2;float val8;,无BANK声明则在BANK0,点亮RC0口的一个LED,status equ 3h;定义状态寄存器地址 portc equ 7h;定义端口C的数据寄存器地址trisc equ 87h;定义端口C的方向控制寄存器地址;*org 000h;定义程序存放区域的起始地址 nop;放置一条ICD必须的空操用指令org 0

17、 x10;重新定位goto main;转向执行程序main bsf status,5;设置文件寄存器的体1 movlw 00h;端口C的方向控制码00H先送W movwf trisc;再由W转移到方向控制寄存器 bcf status,5;恢复到文件寄存器体0 movlw 01h;将00000001B先送W movwf portc;再由W转移到数据寄存器 送 RC0口高电平,点亮LED goto$;让程序在本指令循环end,#include;#include pic168xa.h/定义所用单片机的头文件void main()TRISC=0X00;WHILE(1)PORTC=0 x01;,点亮一个

18、LED并持续3秒后熄灭,status equ 3h;定义状态寄存器地址 portc equ 7h;定义端口C数据寄存器地址 trisc equ 87h;定义端口C的方向控制寄存器地址;*org 000h;定义程序存放区域的起始地址 nop;放置一条ICD必须的空操用指令org 0 x10;goto main;main bsf status,5;设置文件寄存器体1 movlw 00h;端口C方向控制码00H先送W movwf trisc;由W转移到方向控制寄存器 bcf status,5;恢复到文件寄存器体0 movlw 01h;将00000001B先送W movwf portc;再由W转移到数

19、据寄存器,让 RC0输出高电平点亮LED call delay;调用廷时子程序 bcf portc,0;熄灭LED goto$;原地循环,;-廷时子程序-delay;子程序名,也是子程序入口地址 movlw 0fh;将外层循环参数值FFH经过W movwf 20h;送入用作外循环变量20H单元lp0 movlw 0ffh;将第二层循环参数值 FFH经过W movwf 21h;送入用作内循环变量21H单元lp1 movlw 0ffh;内层循环参数值FFH过Wmovwf 22h;送入用作内循环变量22H单元 lp2 decfsz 22h,1;变量22H内容递减,若 为0跳跃 goto lp2;跳转

20、到LP2处 decfsz 21h,1;变量21H内容递减为0跳跃 goto lp1;跳跃到LP1处 decfsz 20h,1;变量20H内容递减为0跳跃 goto lp0;跳跃到LP0处 retlw 0;返回主程序 end;源程序结束,#include;#include pic168xa.h/定义所用单片机的头文件void main()TRISC=0X00;WHILE(1)PORTC=0 x01;#asmmovlw 0fh;将外层循环参数值FFH经过W movwf 20h;送入用作外循环变量的20H单元lp0 movlw 0ffh;将第二层循环参数值FFH经W movwf 21h;送入用作内循

21、环变量的21H单元lp1 movlw 0ffh;将内层循环参数值FFH经过W movwf 22h;送入用作内循环变量的22H单元 lp2 decfsz 22h,1;变量22H内容递减,若为0跳跃 goto lp2;跳转到LP2处 decfsz 21h,1;变量21H内容递减,若为0跳跃 goto lp1;跳跃到LP1处 decfsz 20h,1;变量20H内容递减,若为0跳跃 goto lp0#endasmPORTC=0 x00;,C语言,用于令与PORTC口相连的8个发光二极管前4个点亮,后4个熄灭。PORTC输出#includemain()TRISC=0X00;/*TRISD寄存器被赋值,PORTC/每一位都为输出while(1)/循环执行点亮发光二极管的语句PORTC=0XF0;/向PORTC送数据,点亮/LED,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号