PICC ME16 C简要说明书

2020-02-14来源: eefocus关键字:PICC  ME16  C  简要说明书

第一部分


为了对PIC单片机有更好的支持,PICC在标准C的基础上作了一些扩充:


www.1739.com_【官方首页】-澳门新葡京娱乐城定义I/O函数,以便在你的硬件系统中使用中定义的函数。

用C语言编写中断服务程序

用C语言编写I/O操作程序

C语言与汇编语言间的接口


1-1 与标准C的不同

PICC只在一处与标准C不同:函数的重入。

因为PIC单片机的寄存器及堆栈有限,所以PICC不支持可重入函数。


1-2 支持的PIC芯片

PICC 支持很多PIC单片机,支持PIC单片机的类型在LIB目录下的picinfo.ini 文件中有定义。


1-3 PICC 包含一些标准库


www.1739.com_【官方首页】-澳门新葡京娱乐城1-4 PICC 编译器可以输出一些格式的目标文件,缺省设置为输出Bytecraft的'COD' 格式和 Intel的'HEX'格式。你可以用以下中的命令来指定输出格式。


格式名称 描述 PICC 命令 文件类型

Motorola HEX S1/S9 type hex file -MOT .HEX

Intel HEX Intel style hex records(缺省) -INTEL .HEX

Binary Simple binary image -BIN .BIN

UBROF Universal Binary Image Relocatable Format -UBROF .UBR

Tektronix HEX Tektronix style hex records -TEK .HEX

American Hex format with symbols for American -AAHEX .HEX

Automation HEX Automation emulators

Bytecraft .COD Bytecraft code format(缺省) n/a(缺省) .COD

Library HI-TECH library file n/a .LIB



1-5 符号文件

PICC -G 命令用于生成符号文件,有了符号文件,你就可以进行源程序调试.

命令格式为: PICC -16F877 -G test.c

www.1739.com_【官方首页】-澳门新葡京娱乐城在使用仿真器时必须使用-G命令。


1-6 配置字

PIC单片机的配置字可以用__CONFIG命令来定义:


#i nclude

__CONFIG(x)

其中x是配置字,头文件中定义了相应的配置说明符,如:

__CONFIG(WDTDIS & XT & UNPROTECT);

这将关闭看门狗,设置XT振方式,程序不加密。注意:不同的配置符间用'&'相联,未定义的部分保留未编程状态。详细的情况请参考头文件及PIC数据手册。


1-7 ID 位置

有些PIC单片机在程序空间外还有ID空间,可用下面的方法来定义:

#i nclude

__IDLOC(x) 其中x是ID标示,如:

__IDLOC(15F0);

将ID的四个单元定义为:1, 5, 15, 0. ID的具体位置由所指定的PIC芯片自动设定。


1-8 EEPROM 数据

有些PIC单片机支持用外部编程器对内部的EEPROM进行编程。

__EEPROM_DATA()可以将用于初始化的数据放入HEX文件中,如:

__EEPROM_DATA(0, 1, 2, 3, 4, 5, 6, 7)

可将0-7八个数放入HEX文件中,在用外部的编程器进行编程时将 这八个数写入PIC单片机中。

__EEPROM_DATA不是用于运行时写入EEPROM数据的,在运行时请用 EEPROM_READ(), EEPROM_WRITE()。


1-9 位指令

只要有可能,PICC总是采用位指令。如:

int foo;

foo |= 0x40;

的编译结果为:bsf _foo, 6

为了方便可以定义如下宏:

#define bitset(var, bitno) ((var) |= (1 << (bitno)))

#defien bitclr(var, bitno) ((var) &= (1 << (bitno)))

上一条语句可写为:bitset(foo, 6);


1-10 支持的数据类型

PICC 支持1,2,4字节的基本类型。 所有的多字节类型都采用低有效位在前的格式, 表1-2列出了所有数据类型及它们所占空间大小。

表1-2

类型 大小(位) 数字类型 值

bit 1 逻辑类型 0 或 1

signed char 8 有符号字符 -128..+127

unsigned char 8 无符号字符 0..255

signed short 16 有符号整数 -32768..+32767

unsigned short 16 无符号整数 0..65535

signed int 16 有符号整数 -32768..+32767

unsigned int 16 无符号整数 0..65535

signed long 32 有符号整数 -2147483648..+2147483647

unsigned long 32 无符号整数 0..4294967295

float 24 浮点

double 24 or 32 浮点 由-D24, -D32决定



1-10-1 常量及进制表示

PICC 支持标准C的进制表示方法。

l或L后缀表明常量为long类型, u或U后缀表示常量为unsinged类型。 浮点数为double类型,可以用f或F指定浮点数为float类型。

字符型由单引号括起,如'a'.

字符串由双引号括起,如"Hello world".


1-10-2 位数据类型

www.1739.com_【官方首页】-澳门新葡京娱乐城PICC 支持一位的变量,用bit来定义。如: static bit init_flag;

变量必须是全局的或静态的,它不能是自动变量或一个函数的参数,但可以作为 一个函数的返回类型。

位变量很象unsigned char,但它只有0或1两个值,位变量占用空间少,且运算 速度快. 所有的位变量在startup是被清0,请在程序开始处初始化它们。

如果将一个整型数赋给位变量,只是将最低位赋给位变量,如果你是想要将一个整型 变量是否为0赋值给一个位变量,请用: bitvar = other_var != 0;

www.1739.com_【官方首页】-澳门新葡京娱乐城如要你使用了PICC的-STRICT命令,bit将被视为非法命令。


1-10-2-1 使用可位寻址的寄存器

位变量的定义可以与绝对地址的定义结合起来使用。如: 为了访问STATUS中Power Down位,先定义STATUS的绝对地址为3,然后再 定义一位变量绝对地址为27

static unsigned char STATUS @ 0x03;

static bit PD @ (unsigned)&STATUS*8+3;

注意: 头文件中已定义所有的特殊功能寄存器及相应的位寄存器.


1-10-3 PICC浮点数使用IEEE754

32位格式和IEEE754(截断)24位格式.

float类型使用24位格式,double使用24位或32位格式, 由PICC命令控制, -D24使用24位格式, -D32使用32位格式.


1-11 绝对地址变量

一个全局的或静态的变量可以定位绝对地址, 使用如下格式:

unsigned char Portvar @ 0x06;

这里定义了一个名为'Portvar'的变量, 地址为06h,注意,编译器并不保留任何单元,仅仅是将一个变量分配在06h单元. 它等价于汇编语言: _Portvar EQU 06h编译器及连接器都不作任何检查, 完全由程序员保证分配不会发生冲突.


1-12 结构与联合

PICC 支持struct及union, 它们可以作为函数的参数及返回值, 也可以作为指针 指向的目标.


1-12-1 结构限定

PICC 支持在结构上使用限定符, 如果在一个结构上使用限定符, 那么, 这个结构的 所有成员都被限定.

如: bank1 struct { int number; int *ptr; }

在这个结构里,number, ptr 都被放在bank1寄存器内.


1-12-2 结构中定义位成员

PICC 支持在结构中定义位成员.

位成员按最低有效位在前的方式存储,位成员总是按8位字节方式存放, 当当前 字节放满后再放下一个字节,位成员不会跨字节存放. 如:

struct {

unsigned hi: 1;

unsigned dummy: 6;

unsigned lo: 1;

} foo @ 0x10;

结构foo占用10h单元, hi为10h单元的第0位, lo为10h单元的第7位, dummy为10h 单元的2-6位,(第6位为最高有效位)

不使用的位可用未命名的位成员来定义, 如果我们不使用dummy, 就可定义为:

struct {

unsigned hi: 1;

unsigned : 6;

unsigned lo: 1;

} foo @ 0x10;


1-13 在ROM及RAM存放字符串.

一个未说明的字符串总是存放在ROM中, 并且只能通过常量指针为访问.

#define HELLO "Hello word"

SendBuff(HELLO);

一个非常量的数组被一个字符串初始化, 如:

char fred[] = 'Hello world";

将在RAM中保留一个数组, 在startup时, 用存放在ROM中的"Hello world"来初始化.

如果要将一个常数字符串作为函数参数或将它赋给一个指针, 必须定义一个常数指针.

如: void SendBuff(const char * ptr)


1-14 const, volatile 类型限定符.

PICC 支持标准C的const, volatile 类型限定符

const类型限定符通知编译器一个目标含有的常量并且不会改变. 一个常量被放在ROM中, 显然一个常量是不能被赋值的. 如:

const int version = 3;

volatile 类型限定符通知编译器, 一个目标不能保证在连续的访问中不被改变. 这将禁止编译器对该目标的优化. 所有的I/O口及在中断中使用的变量必须 有volatile 类型限定符.

如: volatile unsigned char P_A @ 0x05;

对volatile目标的访问与对non-volatile的访问是不同的, 如对volatile目标置1是 先将该目标清0后加1, 而对non-volatile目标置1是先将1放在W中后再将W 赋值到目标中.


1-14 特别的类型限定符.

PICC 支持一些特别的类型限定符: persistent, bank1, bank2及bank3,这些限定符不可用于自动变量.


1-14-1 persistent

按C的标准, 所有的C变量在startup时被清为0. 但是在有些情况下, 我们希望在 复位后仍保持一些变量的值. persistent类型限定符使被其限定的变量在 startup时不被清0, 而保留原有的值.


1-14-2 bank1, bank2及bank3类型限定符.

bank1, bank2及bank3类型限定符用于指定变量所在的寄存器页. 如:

static bank3 unsigned char fred;

bank3 unsigned char *ptrfred;

缺省页是 bank0


1-15 C语言中的中断处理

在PICC C语言中可以用"interrupt"限定符来编写中断服务程序.

一个中断服务函数必须用 interrupt void 来定义, 不能有参数, 并且不能被C语言直接调用. 如:

long tick_count;

void interrupt tc_int(void)

{ ++tick_count; }


1-15-1 在中断中保存环境

PIC单片机硬件只保存PC, PICC 编译器自动地保存其它可能用到的变量. 但是编译器无法确定inline中的汇编语言段使用变量的情况, 你必须自已保护它们.


1-15-2 开启中断

在PIC.H中定义了所有的中断位, di()关闭所有中断, ei()打开所有中断. 如:

ADIE = 1; // A/D interrupt will be used

PEIE = 1; // all peripheral interrupts are enabled

ei(); // enable all interrupts

di(); // disable all interrupts


1-16 在C中使用汇编语言 #asm, #endasm, asm()

可以在C语言中直接使用汇编语言. #asm, #endasm用来加入一段汇编语言, 而asm()用来加入一条汇编语言. 如:

#i nclude

unsinged char var;

void main(void)

{ var = 1;

#asm

rlf _var, 1

rlf _var, 1

#endasm

asm("rlf _var, 1");

}


1-17 函数调用变换

由于PIC5X只有两级堆栈, PICC 编译器使用转移指令来调用函数, 这样被套调用 层次增加, 但调用速度下降, 请在需要快速调用的函数前加fastcall来指定编译器 直接使用调用指令调用函数.

对于14位的PIC单片机, 将永远使用调用指令调用.


1-18 MPLAB使用的调试控制项

-FACKLOCAL 命令用于在MPLAB下观察函数内的局部变量

-MPLAB_ICD 命令用于

[1] [2]
关键字:PICC  ME16  C  简要说明书 编辑:什么鱼 引用地址:http://news.kanmaya.com/mcu/ic488250.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:PICC——嵌入汇编
下一篇:使用带A/D的PIC芯片时,怎样才能提高A/D转换的精度?

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

PICC环境写PIC单片机程序的探讨
简介:一般C语言产生的代码是比较繁琐的,所以要写出高质量、实用的C语言程序,就必须对单片机体系结构和硬件资源作详尽的了解.目前,Microchip公司生产的PIC系列单片机以其低成本、低功耗、高性能、开发速度快且一次性用户可编程等优点迅速占领了国内市场,成为国内销售量最大的单片机.但国内介绍其C语言开发工具的书籍和文章却比较少,在开发过程中给广大程序员带来了许多困难和不便.Microchip公司没有针对中低档系列PIC单片机的C语言编译器,但很多专业的第三方公司提供众多支持PIC单片机的C语言编译器,常见的有Hitech、CCS、IAR以及Bytecraft等公司.Hitech公司的PICC编译器稳定可靠,编译生成的代码效率高
发表于 2020-02-18
PICC——嵌入汇编
www.1739.com_【官方首页】-澳门新葡京娱乐城的方法在 C 原程序中直接嵌入汇编指令是最直接最容易的方法。如果只需要嵌入少量几条的汇编指令,PICC 提供了一个类似于函数的语句:asm("clrwdt")双引号中可以编写任何一条 PIC 的标准汇编指令。www.1739.com_【官方首页】-澳门新葡京娱乐城例如:for (;;) {asm("clrwdt"); //清看门狗Task();ClockRun();asm("sleep"); //休眠asm("nop"); //空操作延时}如果需要编写一段连续的汇编指令,PICC 支持另外一种语法描述:用“#asm”开始汇编指令段,用“#endasm”结束。例如下面的一段嵌入汇编指令实现了将 0x20~0x7F 间的
发表于 2020-02-14
PICC——基本知识(变量)
利用这一技术后所有的动态局部变量都可以按已知的固定地址地进行直接寻址,用 PIC 汇编指令实现的效率最高,但这时不能出现函数递归调用。PICC 在编译时会严格检查递归调用的问题并认为这是一个严重错误而立即终止编译过程。为了使编译器产生最高效的机器码,PICC 把单片机中数据寄存器的 bank问题交由编程员自己管理,因此在定义用户变量时你必须自己决定这些变量具体放在哪一个 bank 中。如果没有特别指明,所定义的变量将被定位在 bank0,除了 bank0 内的变量声明时不需特殊处理外,定义在其它 bank 内的变量前面必须加上相应的 bank序号中档系列 PIC 单片机数据寄存器的一个 bank 大小为 128 字节,刨去前面若干
发表于 2020-02-14
PICC编译指针详解
指向 RAM 的指针如果是汇编语言编程,实现指针寻址的方法肯定就是用 FSR 寄存器,PICC 也不例外。为了生成高效的代码,PICC 在编译C原程序时将指向 RAM 的指针操作最终用 FSR 来实现间接寻址。这样就势必产生一个问题:FSR 能够直接连续寻址的范围是 256 字节(bank0/1或 bank2/3),要覆盖最大 512 字节的内部数据存储空间,又该如何让定义指针?PICC 还是将这一问题留给编程员自己解决:在定义指针时必须明确指定该指针所适用的寻址区域,例如:unsigned char *ptr0; //①定义覆盖bank0/1的指针bank2 unsigned char *ptr1; //②定义覆盖bank2
发表于 2020-02-14
PICC ---- 函数
简介:一个良好的程序设计应该有一个清晰的组织结构,把不同的功能用不同的函数实现是最好的方法,因此一个函数 2K字长的限制一般不会对程序代码的编写产生太多影响。函数的代码长度限制PICC决定了C原程序中的一个函数经编译后生成的机器码一定会放在同一个程序页面内。中档系列的 PIC 单片机其一个程序页面的长度是 2K字,换句话说,用 C 语言编写的任何一个函数最后生成的代码不能超过 2K字。一个良好的程序设计应该有一个清晰的组织结构,把不同的功能用不同的函数实现是最好的方法,因此一个函数 2K字长的限制一般不会对程序代码的编写产生太多影响。如果为实现特定的功能确实要连续编写很长的程序,这时就必须把这些连续的代码拆分成若干函数,以保证每个
发表于 2020-02-13
奔驰EQC可提前控制车内气候 具优化导航/便利充电等功能
梅赛德斯-奔驰技术品牌EQ配备了Mercedes me服务之后,为当今和未来的电动出行方式提供了更加全面的服务。而EQC车型最重要的服务和功能包括进入车内前控制车内气候、优化导航功能和Mercedes me充电功能(Mercedes me Charge)。EQC优化导航功能可以让奔驰顾客很快找到公共充电站,通过Mercedes me Charge功能可以便利地访问欧洲快充网络IONITY等各个供应商的充电桩,并具备集成式付款功能,发放简单发票,目的是为顾客提供轻松、简单的旅行,同时具备透明性以及规划确定性。有了Mercedes me Charge功能,奔驰EQC或配备最新信息娱乐系统MBUX(奔驰用户体验)的插电式混合车型的驾驶员
发表于 2020-01-20
奔驰EQC可提前控制车内气候 具优化导航/便利充电等功能
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 kanmaya.com, Inc. All rights reserved

页面底部区域 foot.htm