




已阅读5页,还剩109页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
* Down UpMainReturn * Down UpMainReturn 基于 PICC 编译环境编写 PIC 单片机C 程序的基本方式和标准 C 程序类似,程 序一般由以下几个主要部分组成: 在程序的最前面用#include 预处理指令 引用包含头文件,其中必须包含一个编 译器提供的“pic.h”文件,实现单片机内 特殊寄存器和其它特殊符号的声明; 2.1 PIC2.1 PIC单片机的单片机的C C语言源程序基本框架语言源程序基本框架 * Down UpMainReturn 用“_ _CONFIG”预处理指令定义芯片 的配置位; 声明本模块内被调用的所有函数的类 型,PICC 将对所调用的函数进行严格 的类型匹配检查; 定义全局变量或符号替换; 实现函数(子程序),特别注意 main 函数必须是一个没有返回的死循环。 * Down UpMainReturn 下面的例子为一个C源程序的范例: #include /包含单片机内部资源预定义 #include “pc68.h” /包含自定义头文件 _ _CONFIG (HS /定义芯片工作时的配置位 * Down UpMainReturn void SetSFR(void); void Clock(void); void KeyScan(void); void Measure(void); void LCD_Test(void); void LCD_Disp(unsigned char); /声明本模块中所调用的函数类型 * Down UpMainReturn unsigned char second, minute, hour; bit flag1,flag2; /定义变量 void main(void) /函数和子程序 SetSFR( ); PORTC = 0x00; TMR1H += TMR1H_CONST; LED1 = LED_OFF; LCD_Test( ); * Down UpMainReturn while(1) asm(“clrwdt”); /清看门狗 Clock(); /更新时钟 KeyScan(); /扫描键盘 Measure(); /数据测量 SetSFR(); /刷新特殊功能寄存器 / /程序工作主循环 * Down UpMainReturn 注意注意: PICC不支持C+,这对于习惯了C+ 的同学还得翻翻C 语言的书。 我们在源程序一开始使用了“#include”实 现了相关单片机的一些预定义符号的直 接引用,但没有具体指明是哪一个型号 。 * Down UpMainReturn 实际上,“pic.h”头文件是很多头文件的 集合,是一个简单的管理工具(条件判 别),它会按照MPLAB-IDE所选择的特 定型号的单片机,把真正对应的头文件 包含进来。 也就是说:C 编译器在pic.h 中根据你的 芯片自动载入相应的其它头文件,这点 比汇编好用。 * Down UpMainReturn 调用真正头文件 调用真正头文件 头文件 用记事本打开 * Down UpMainReturn 载入的头文件中其实是声明芯片的寄存 器和一些函数,摘抄一个片段:例如: static volatile unsigned char TMR0 0x01; static volatile unsigned char PCL 0x02; static volatile unsigned char STATUS 0x03; * Down UpMainReturn 可以看出和汇编的头文件中定义寄存器 是差不多的。如下: TMR0 EQU 0X01; PCL EQU 0X02; STATUS EQU 0X03; 都是把无聊的地址定义为大家公认的名 字。 * Down UpMainReturn 2.2.1 PICC 中的基本变量类型 PICC编辑器支持基本的1,2及4B数 据。所有多字节数据遵循Little-endian 标准,多字节变量的低字节放在存储 空间的低地址,高字节放在高地址 下表中列出了PICC支持的数据类型及 对应的大小和数学表达: 2.2 PICC2.2 PICC中的变量定义中的变量定义 * Down UpMainReturn Little-endian和Big-endian是表示计算机字 节顺序的两种格式。 简单的说,Little-endian把低字节存放在 内存的低位;而Big-endian将低字节存放 在内存的高位。 现在主流的CPU,Intel系列的是采用的 Little-endian的格式存放数据,而Motorola 系列的CPU采用的是Big-endian。 * Down UpMainReturn 表21 PICC 的基本变量类型 * Down UpMainReturn 2.2.2 PICC 中的高级变量 基于表2-1的基本变量,除了bit型位变量 外,PICC 完全支持数组、结构和联合等 复合型高级变量,这和标准的C语言所支 持的高级变量类型没有什么区别。 例如:联合:union int_Byte unsigned char c2; unsigned int i; ; * Down UpMainReturn 数组:unsigned int data10; 结构:struct commInData unsigned char inBuff8; unsigned char getPtr, putPtr; ; * Down UpMainReturn 为了使编译器产生最高效的机器码, PICC把单片机中数据寄存器的bank问 题交由编程员自己管理,因此在定义用 户变量时你必须自己决定这些变量具体 放在哪一个bank中。 2.2.3 2.2.3 PICCPICC对数据寄存器对数据寄存器bankbank的管理的管理 * Down UpMainReturn 如果没有特别指明,所定义的变量将 被定位在bank0,例如下面所定义的这 些变量: unsigned char buffer32; bit flag1,flag2; float val8; * Down UpMainReturn 除了bank0内的变量声明时不需特殊处 理外,定义在其它bank内的变量前面必 须加上相应的bank序号,例如: bank1 unsigned char buffer32; /变量定位在bank1中 bank2 bit flag1,flag2; /变量定位在bank2中 bank3 bit float val8; /变量定位在bank3中 * Down UpMainReturn 注意事项:注意事项: 中档系列PIC单片机数据寄存器的一个 bank大小为128字节,刨去前面若干字节 的特殊功能寄存器区域,在C语言中某一 bank内定义的变量字节总数不能超过可 用RAM字节数。 如果超过bank容量,在最后链接时会报 错,大致信息如下: * Down UpMainReturn * Down UpMainReturn Error000 : Cant find 0x12C words for psect rbss_1 in segment BANK1 链接器告诉你总共有0x12C(300)个字 节准备放到bank1中但bank1容量不够。 显然,只有把一部分原本定位在bank1 中的变量改放到其它bank中才能解决此 问题。 * Down UpMainReturn 虽然变量所在的bank定位必须由编程 员自己决定,但在编写源程序时进行变 量存取操作前无需再特意编写设定bank 的指令,C编译器会根据所操作的对象 自动生成对应bank设定的汇编指令; 为避免频繁的bank切换以提高代码效 率,尽量把实现同一任务的变量定位在 同一个bank内; * Down UpMainReturn 数据寄存器怎么附值?数据寄存器怎么附值? 如对 TMR0 附值,汇编中: MOVLW 200; MOVWF TMR0; 当然得保证当前bank在0或2,不然会出 错(如在bank1或3)。 * Down UpMainReturn C语言中: TMR0=200; 无论在任何bank都不会出错,可以看出 来C是很直接了当的。并且最大好处是操 作一个寄存器时候,不用考虑bank的问 题,一切由C编译器自动完成。 * Down UpMainReturn 2.2.4 PICC 2.2.4 PICC 中的局部变量中的局部变量 PICC把所有函数内部定义的auto型局 部变量放在bank0。为节约宝贵的存储 空间,它采用了一种被叫做“静态覆盖” 的技术来实现局部变量的地址分配。 * Down UpMainReturn 其大致的原理是:在编译器编译源代 码时扫描整个程序中函数调用的嵌套 关系和层次,算出每个函数中的局部 变量字节数; 然后为每个局部变量分配一个固定的 地址,且按调用嵌套的层次关系各变 量的地址可以相互重叠。 * Down UpMainReturn 利用这一技术后所有的动态局部变量都 可以按已知的固定地址进行直接寻址, 但这时不能出现函数递归调用。PICC在 编译时会严格检查递归调用问题并认为 这是一个严重错误而立即终止编译过程 。 所有的局部变量将占用bank0的存储空 间,因此用户自己定位在bank0内的变 量字节数将受到一定的限制,在实际使 用时需注意。 * Down UpMainReturn 2.2.5 PICC2.2.5 PICC中的位变量中的位变量 bit型位变量只能是全局的或静态的。 PICC将把定位在同一bank内的8个位变 量合并成一个字节存放于一个固定地址。 PIC单片机的位操作指令是非常高效的。 因此,PICC在编译源代码时只要有可能 ,对普通变量的操作也将以最简单的位操 作指令来实现。 * Down UpMainReturn 假设一个字节变量tmp最后被定位在 地址 0x20,那么: tmp=0x80 =bsf 0x20,7 tmp unsigned b1: 1; unsigned b2: 1; unsigned b3: 1; unsigned b4: 1; unsigned b5: 1; unsigned : 2; /最高两位保留 oneBit; unsigned char allBits; myFlag; * Down UpMainReturn 需要存取其中某一位时可以: myFlag.oneBit.b3=1; /b3 位置 1 一次性将全部位清零时可以 : myFlag.allBits=0; /全部位变量清 0 * Down UpMainReturn 如何进行位操作?如何进行位操作? 汇编中的位操作是很容易的。在PICC 中更简单。C的头文件中已经对所有可 能需要位操作的寄存器的每一位都有定 义名称: 如:PORTA的每一个I/O口定义为: RA0、RA1、RA2、RA3、RA4、 RA5 、RA6 、RA7 。 * Down UpMainReturn 可以对其直接进行运算和附值。如: RA0=0; RA2=1; 在汇编中是: BCF PORTA,0; BSF PORTA,2; 可以看出两者是大同小异的,只是C中 不需要考虑bank的问题。 * Down UpMainReturn PICC中描述浮点数是以IEEE-754标准 格式实现的。此标准下定义的浮点数为 32位长,在单片机中要用4个字节存储 。 为了节约单片机的数据空间和程序空 间,PICC专门提供了一种长度为24位 的截短型浮点数,它损失了浮点数的一 点精度,但浮点运算的效率得以提高。 2.2.6 PICC2.2.6 PICC中的浮点数中的浮点数 * Down UpMainReturn 在程序中定义的float型标准浮点数的 长度固定为24位,双精度double型浮点 数一般也是24位长,但可以在程序编译 选项中选择double型浮点数为32位,以 提高计算的精度。 一般控制系统中关心的是单片机的运 行效率,因此在精度能够满足的前提下 尽量选择24 位的浮点数运算。 * Down UpMainReturn 首先必须强调,在用C语言写程序时变 量一般由编译器和链接器最后定位,在 写程序之时无需知道所定义的变量具体 被放在哪个地址; 除了bank必须声明,真正需要绝对定位 的只是单片机中那些特殊功能寄存器; 2.2.7 PICC 2.2.7 PICC 中变量的绝对定位中变量的绝对定位 * Down UpMainReturn 而这些寄存器的地址定位在PICC编译环 境所提供的头文件中已经实现,无需用 户操心。 编程员所要了解的只是PICC是如何定义 这些特殊功能寄存器和其中的相关控制 位的名称。 * Down UpMainReturn 好在PICC的定义标准基本上按照芯片 的数据手册中的名称描述进行,这样 就秉承了变量命名的一贯性。 一个变量绝对定位的例子如下: unsigned char tmpData 0x20; /tmpData定位在地址0x20 * Down UpMainReturn 千万注意:千万注意: PICC对绝对定位的变量不保留地址空 间。 换句话说,上面变量tmpData的地址是 0x20,但最后0x20处完全有可能又被分 配给了其它变量使用,这样就发生了地 址冲突。因此针对变量的绝对定位要特 别小心。 * Down UpMainReturn 由此可见,在一般的程序设计中用户 自定义的变量实在是没有绝对定位的 必要。 如果需要,位变量也可以绝对定位。 但必须遵循上面介绍的位变量编址的 方式。 * Down UpMainReturn 如果一个普通变量已经被绝对定位,那 么此变量中的每个数据位就可以用下面 的计算方式实现位变量指派: unsigned char tmpData 0x20; /tmpData定位在地址0x20 tmpData必须先被绝对定位,然后才能 用下面的位变量定位方式: * Down UpMainReturn bit tmpBit0 tmpData*8+0; /tmpBit0对应于tmpData第0位 bit tmpBit1 tmpData*8+1; /tmpBit1对应于tmpData第1位 bit tmpBit2 tmpData*8+2; /tmpBit2对应于tmpData第2位 * Down UpMainReturn extern 外部变量声明 如果在一个C程序文件中要使用一些变 量但其原型定义写在另外的文件中,那 么在本文件中必须将这些变量声明成 “extern”外部类型。 2.2.8 PICC 2.2.8 PICC 的其它变量修饰关键词的其它变量修饰关键词 * Down UpMainReturn 例如程序文件 code1.c 中有如下定义: bank1 unsigned char var1, var2; /定义了 bank1 中的两个变量 在另外一个程序文件code2.c中要对上面 定义的变量进行操作,则必须在程序的 开头定义: extern bank1 unsigned char var1, var2; /声明位于 bank1 的外部变量 * Down UpMainReturn volatile 易变型变量声明 PICC中还有一个变量修饰词在普通的 C语言介绍中一般是看不到的,这就是 关键词“volatile”。 顾名思义,它说明了一个变量的值是 会随机变化的,即使程序没有刻意对 它进行任何赋值操作。 * Down UpMainReturn 在单片机中,作为输入的I/O端口其内 容将是随意变化的; 在中断内被修改的变量相对主程序流程 来讲也是随意变化的; 很多特殊功能寄存器的值也将随着指令 的运行而动态改变。 * Down UpMainReturn 所有这种类型的变量必须将它们明确 定义成“volatile”类型。 例如: volatile unsigned char STATUS 0x03; volatile bit commFlag; * Down UpMainReturn 千万注意:千万注意: “volatile”类型定义在单片机的C语言编 程中是如此的重要,是因为它可以告诉 编译器的优化处理器这些变量是实实在 在存在的,在优化过程中不能无故消除 。 * Down UpMainReturn 假定你的程序定义了一个变量并对其 作了一次赋值,但随后就再也没有对 其进行任何读写操作,如果是非 volatile型变量,优化后的结果是这个 变量将有可能被彻底删除以节约存储 空间。 * Down UpMainReturn 另外一种情形是在使用某一个变量进行 连续的运算操作时,这个变量的值将在 第一次操作时被复制到中间临时变量中 , 如果它是非volatile型变量,则紧接其后 的其它操作将有可能直接从临时变量中 取数以提高运行效率。 * Down UpMainReturn 显然这样做后对于那些随机变化的参 数就会出问题。 只要将其定义成volatile类型后,编译 后的代码就可以保证每次操作时直接 从变量地址处取数。 * Down UpMainReturn const 常数型变量声明 如果变量定义前冠以“const”类型修饰 ,那么所有这些变量就成为常数,程 序运行过程中不能对其修改。 除了位变量,其它所有基本类型的变 量或高级组合变量都将被存放在程序 空间(ROM区)以节约数据存储空间 。 * Down UpMainReturn 显然,被定义在 ROM区的变量是不 能再在程序中对其进行赋值修改的, 这也是“const”的本来意义。 实际上这些数据最终都将以“retlw”的 指令形式存放在程序空间,但PICC会 自动编译生成相关的附加代码从程序 空间读取这些常数,编程员无需太多 操心。 * Down UpMainReturn 例如: const unsigned char name =“This is a demo”; /定义一个常量字符串 * Down UpMainReturn persistent 非初始化变量声明 按照标准C语言的做法,程序在开始 运行前首先要把所有定义的但没有预 置初值的变量全部清零。 PICC会在最后生成的机器码中加入一 小段初始化代码来实现这一变量清零 操作,且这一操作将在main函数被调 用之前执行。 * Down UpMainReturn 事实上一个单片机的控制系统有很多 变量是不允许在程序复位后被清零的 。为了达到这一目的,PICC提供了 “persistent”修饰词以声明此类变量无 需在复位时自动清零; 编程员应该自己决定程序中的哪些变 量是必须声明成“persistent”类型,而 且须自己判断什么时候需要对其进行 初始化赋值。 * Down UpMainReturn 例如: persistent unsigned char hour,minute,second; /定义时分秒变量 * Down UpMainReturn PICC中指针的基本概念和标准C语法 没有太多的差别。但是在PIC单片机这 一特定的架构上,指针的定义方式还 是有几点需要特别注意: 2.2.9 PICC 2.2.9 PICC 中的指针中的指针 * Down UpMainReturn 指向 RAM 的指针 指向 ROM 常数的指针 指向函数的指针 指针的类型修饰 * Down UpMainReturn 指向 RAM 的指针 如果是汇编语言编程,实现指针寻址 的方法肯定就是用FSR寄存器,PICC 也不例外。 为了生成高效的代码,PICC在编译C 源程序时将指向RAM的指针操作最终 用FSR来实现间接寻址。 * Down UpMainReturn 这样就势必产生一个问题:FSR能够 直接连续寻址的范围是256字节( bank0/1或bank2/3),要覆盖最大 512 字节的内部数据存储空间,又该如何 定义指针? PICC还是将这一问题留给编程员自己 解决:在定义指针时必须明确指定该 指针所适用的寻址区域。 * Down UpMainReturn 例如: unsigned char *ptr0; /定义覆盖 bank0/1的指针 bank2 unsigned char *ptr1; /定义覆盖 bank2/3的指针 bank3 unsigned char *ptr2; /定义覆盖 bank2/3的指针 * Down UpMainReturn 上面定义了三个指针变量,其中指 针没有任何bank限定,缺省就是指向 bank0和bank1; 和一个指明了bank2,另一个指明 了bank3,但实际上两者是一样的,因 为一个指针可以同时覆盖两个bank的 存储区域。 * Down UpMainReturn 既然定义的指针有明确的bank适用区域 ,在对指针变量赋值时就必须实现类型 匹配,下面的指针赋值将产生致命错误 : unsigned char *ptr0; /定义指向bank0/1的指针 bank2 unsigned char buff8; /定义bank2的一个缓冲区 * Down UpMainReturn 程序语句:ptr0 = buff; /错误!试图将bank2内的变量 地址赋给指向bank0/1的指针 若出现上述错误的指针操作,PICC 在 最后链接时会告知类似于下面的信息: Fixup overflow in expression (.) * Down UpMainReturn 提示:提示: 根据以往的编程经验,如果你看到了 “Fixup overflow”的错误指示,几乎 可以肯定是指针类型不匹配的赋值所 至。请重点检查程序中有关指针的操 作。 * Down UpMainReturn 指向 ROM 常数的指针 如果一组变量是已经被定义在ROM区的 常数,那么指向它的指针可以这样定义 : * Down UpMainReturn const unsigned char company = “Microchip”; /定义ROM中的常数 const unsigned char *romPtr; /定义指向ROM的指针 * Down UpMainReturn 程序中可以对上面的指针变量赋值和 实现取数操作: romPtr company; /指针赋初值 data = *romPtr+; /取指针指向的一个数, 然后指针加 1 * Down UpMainReturn 反过来,下面的操作将是一个错误, 因为该指针指向的是常数型变量,不 能赋值。 *romPtr data; /往指针指向的地址写一个数 * Down UpMainReturn 指向函数的指针 单片机编程时函数指针的应用相对较少 ,但作为标准C语法的一部分,PICC同 样支持函数指针调用。 如果你对编译原理有一定的了解,就应 该明白在PIC单片机这一特定的架构上 实现函数指针调用的效率是不高的: * Down UpMainReturn PICC将在RAM中建立一个调用返回 表,真正的调用和返回过程是靠直接 修改 PC 指针来实现的。 因此,除非特殊算法的需要,建议大 家尽量不要使用函数指针。 * Down UpMainReturn 指针的类型修饰 前面介绍的指针定义都是最基本的形 式。和普通变量一样,指针定义也可 以在前面加上特殊类型的修饰关键词 ,例如“persistent”、“volatile”等。 * Down UpMainReturn bank 修饰词的位置含义 前面介绍的一些指针有的作用于 bank0/1,有的作用于bank2/3,但它 们本身的存放位置全部在 bank0。 * Down UpMainReturn 显然,在一个程序设计中指针变量将有 可能被定位在任何可用的地址空间,这 时,bank修饰词出现的位置就是一个关 键,看下面的例子: unsigned char *ptr0; /定义指向bank0/1的指针, 指针变量位于bank0中 * Down UpMainReturn bank2 unsigned char *ptr0; /定义指向bank2/3的指针, 指针变量位于 bank0 中 bank2 unsigned char * bank1 ptr0; /定义指向bank2/3的指针, 指针变量位于bank1中 * Down UpMainReturn 从中可以看出规律: 前面的bank修饰词指明了此指针的作 用域;后面的bank修饰词定义了此指 针变量自身的存放位置。 只要掌握了这一法则,你就可以定义 任何作用域的指针且可以将指针变量 放于任何bank中。 * Down UpMainReturn volatile、persistent和const修饰词 的位置含义 如果能理解上面介绍的bank修饰词的 位置含义,实际上volatile、persistent 和const这些关键词出现在前后不同位 置上的含义规律是和bank一词相一致 的。例如: * Down UpMainReturn volatile unsigned char *ptr0; /定义指向bank0/1易变型字符变 量的指针,指针变量位于bank0中且自 身为非易变型 。 * Down UpMainReturn bank2 unsigned char * volatile bank1 ptr0; /定义指向bank2/3非易变型字 符变量的指针,指针变量位于bank1中 且自身为易变型 * Down UpMainReturn const unsigned char * const ptr0; /定义指向ROM区的指针,指 针变量本身也是存放于ROM区的常数 。 通过以上三个例子可以知道:出现在 前面的修饰词其作用对象是指针所指 向的变量;出现在后面的修饰词其作 用对象就是指针变量自己。 * Down UpMainReturn 中档系列PIC单片机的程序空间有分页 的概念,但用C语言编程时基本不用太关 心代码的分页问题。 因为所有函数或子程序调用时的页面设 定(如果代码超过一个页面)都由编译 器自动生成的指令实现。 2.3 PICC2.3 PICC中的子程序和函数中的子程序和函数 * Down UpMainReturn PICC决定了C源程序中的一个函数经 编译后生成的机器码一定会放在同一个 程序页面内。 中档系列的PIC单片机其一个程序页面 的长度是2K字,换句话说,用C语言编 写的任何一个函数最后生成的代码不能 超过2K字。 2.3.1 2.3.1 函数的代码长度限制函数的代码长度限制 * Down UpMainReturn 一个良好的程序设计应该有一个清晰 的组织结构,把不同的功能用不同的函 数实现是最好的方法; 因此一个函数2K字长的限制一般不会 对程序代码的编写产生太多影响。 * Down UpMainReturn 如果为实现特定的功能确实要连续编 写很长的程序,这时就必须把这些连 续的代码拆分成若干函数,以保证每 个函数最后编译出的代码不超过一个 页面空间(2K)。 * Down UpMainReturn PICC在编译时将严格进行函数调用时 的类型检查。一个良好的习惯是在编写 程序代码前先声明所有用到的函数类型 。例如: void Task(void); unsigned char Temperature(void); 2.3.2 2.3.2 函数类型声明函数类型声明 * Down UpMainReturn void BIN2BCD(unsigned char); void TimeDisplay(unsigned char, unsigned char); 这些类型声明确定了函数的入口参数 和返回值类型,这样编译器在编译代 码时就能保证生成正确的机器码。 * Down UpMainReturn 提示:提示: 在实际编程中有时碰到一些用户声称 发现C编译器生成了错误的代码,最后 究其原因就是因为没有事先声明函数 类型所致。 * Down UpMainReturn 建议大家在编写一个函数的源代码时 ,立即将此函数的类型声明复制到源 文件的起始处,见本章的第一个例子 ; 或是复制到专门的包含头文件中,再 在每个源程序模块中引用。 * Down UpMainReturn PICC可以实现C语言的中断服务程序。 中断服务程序有一个特殊的定义方法: void interrupt ISR(void); 2.3.3 2.3.3 中断函数的实现中断函数的实现 * Down UpMainReturn 其中的函数名“ISR”可以改成任意合 法的字母或数字组合; 其入口参数和返回参数类型必须是 “void”型,亦即没有入口参数和返回 参数; 中间必须有一个关键词“interrupt”。 * Down UpMainReturn 中断函数可以被放置在源程序的任意 位置,因为已有关键词“interrupt”声 明。 PICC在最后进行代码链接时会自动将 其定位到0004H中断入口处,实现中断 服务响应。 编译器也会实现中断函数的返回指令 “RETFIE”。 * Down UpMainReturn 一个简单的中断服务示范函数如下: void interrupt ISR(void) /中断服务程序 if (T0IE /清除TMR0中断标志 /在此加入TMR0 中断服务 * Down UpMainReturn if (TMR1IE /清除 TMR1 中断标志 /在此加入TMR1中断服务 /中断结束并返回 * Down UpMainReturn 提示:提示: PICC会自动加入代码实现中断现场的 保护,并在中断结束时自动恢复现场, 所以编程员无需象编写汇编程序那样加 入中断现场保护和恢复的额外指令语句 。 但如果在中断服务程序中需要修改某些 全局变量时,是否需要保护这些变量的 初值将由编程员自己决定和实施。 * Down UpMainReturn 用C语言编写中断服务程序必须遵循高 效的原则: 代码尽量简短,中断服务强调的是一 个“快”字; 中档系列PIC单片机的中断入口只有一 个,因此整个程序中只能有一个中断服 务函数。 * Down UpMainReturn 避免在中断内使用函数调用。虽然 PICC允许在中断里调用其它函数,但 为了解决递归调用的问题,此函数必 须为中断服务独家专用。 既如此,不妨把原本要写在其它函数 内的代码直接写在中断服务程序中。 * Down UpMainReturn 避免在中断内进行数学运算。 数学运算将很有可能用到库函数和许 多中间变量,就算不出现递归调用的 问题,光在中断入口和出口处为了保 护和恢复这些中间临时变量就需要大 量的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 纸浆纳米纤维素制备新方法-洞察及研究
- 部队地雷使用课件
- 部队作风纪律课件
- 湖北省黄冈市团风县2024-2025学年八年级下学期期末测试物理试题(含解析)
- 安徽省黄山市2024-2025学年高二上学期期末质量检测地理试卷(含答案)
- 20xx广州市劳动合同样本
- 部门安全培训课件强化
- 遨游汉字王国猜字谜课件
- 2025年广东省广州市中考物理三轮冲刺《物态变化》
- 基于差分隐私的前端数据扰动梯度传播优化研究
- 《节水型高校评价标准》
- GB/T 31771-2024家政服务母婴护理服务质量规范
- 金融机构概况
- 2024-2025学年地质版体育与健康一年级全一册教案
- 成人常见传染病预防方法
- 《干部履历表》(1999版电子版)
- ICU常见护理问题及措施
- DB11T 1102-2014 城市轨道交通工程规划核验测量规程
- 感冒(中医内科学)
- 初中体育与健康八年级 第十一章 民族民间体育-三人板鞋 教案
- 财政投资项目评审服务投标方案(技术方案)
评论
0/150
提交评论