视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
PIC C语言使用简要说明
2025-09-29 00:22:20 责编:小OO
文档
第一部分

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

• 定义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 包含一些标准库

1-4 PICC 编译器可以输出一些格式的目标文件,缺省设置为输出Bytecraft的'COD' 格式和 Intel的'HEX'格式。你可以用表1-1中的命令来指定输出格式。

表1-1格式名称描述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

在使用仿真器时必须使用-G命令。

1-6 配置字

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

#include

__CONFIG(x)

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

__CONFIG(WDTDIS & XT & UNPROTECT);

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

1-7 ID 位置

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

#include

__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 有符号整数-21474838..+21474837

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

float 24 浮点

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

1-10-2 位数据类型

PICC 支持一位的变量,用bit来定义。如:static bit init_flag;

变量必须是全局的或静态的,它不能是自动变量或一个函数的参数,但可以作为一个函数的返回类型。位变量很象unsigned char,但它只有0或1两个值,位变量占用空间少,且运算速度快. 所有的位变量在startup是被清0,请在程序开始处初始化它们。

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

如要你使用了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()用来加入一条汇编语言. 如:

#include

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 命令用于使用ICD调试C语言.

PICC ME16 C简要说明书

第二部分

2-1

安装PICC

将CD-ROM装入光驱, 自动运行程序将自动启动, 如果你已禁止自动运行功能, 可以直接运行: cd_drive:\\compiler\\install.exe

安装程序将指导你完成PICC的安装.

2-2

MPLAB下使用PICC C语言, 请参阅Microchip相应的手册.

7下载本文

显示全文
专题