PIC单片机C语言使用手册.docx
《PIC单片机C语言使用手册.docx》由会员分享,可在线阅读,更多相关《PIC单片机C语言使用手册.docx(10页珍藏版)》请在冰豆网上搜索。
PIC单片机C语言使用手册
本手册分两部分:
第一部分HI-TECHPICCC的使用说明.这里我们只讲述了PICCC与标准C的不同,
它不是一本C语言的教程,并且我们假定你有C语言的基础.
第二部分在伟福集成环境下使用PICC.
讲述在伟福集成环境如可设置PICC,简单的调试步骤.更详细的说明请参阅
伟福仿真器使用手册.
关于如何在MPLAB下使用PICCC语言,请参阅Microchip相应的手册.
南京伟福实业有限公司
电话:
0253193973网址:
电子信箱:
wave-
PICCC编译器请向Microchip上海分公司购买,售价:
RMB599.
电话:
网址:
Hi-tech公司网址:
第一部分
为了对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-3PICC包含一些标准库
1-4PICC编译器可以输出一些格式的目标文件,缺省设置为输出Bytecraft的'COD'
格式和Intel的'HEX'格式。
你可以用表1-1中的命令来指定输出格式。
表1-1
格式名称
描述
PICC命令
文件类型
MotorolaHEX
S1/S9typehexfile
-MOT
.HEX
IntelHEX
Intelstylehexrecords(缺省)
-INTEL
.HEX
Binary
Simplebinaryimage
-BIN
.BIN
UBROF
UniversalBinaryImageRelocatableFormat
-UBROF
.UBR
TektronixHEX
Tektronixstylehexrecords
-TEK
.HEX
American
HexformatwithsymbolsforAmerican
-AAHEX
.HEX
AutomationHEX
Automationemulators
Bytecraft.COD
Bytecraftcodeformat(缺省)
n/a(缺省)
.COD
Library
HI-TECHlibraryfile
n/a
.LIB
1-5符号文件
PICC-G命令用于生成符号文件,有了符号文件,你就可以进行源程序调试.
命令格式为:
PICC-16F877-Gtest.c
在使用仿真器时必须使用-G命令。
1-6配置字
PIC单片机的配置字可以用__CONFIG命令来定义:
#include
__CONFIG(x)
其中x是配置字,头文件中定义了相应的配置说明符,如:
__CONFIG(WDTDIS&XT&UNPROTECT);
这将关闭看门狗,设置XT振方式,程序不加密。
注意:
不同的
配置符间用'&'相联,未定义的部分保留未编程状态。
详细的情况请参考
头文件及PIC数据手册。
1-7ID位置
有些PIC单片机在程序空间外还有ID空间,可用下面的方法来定义:
#include
__IDLOC(x)
其中x是ID标示,如:
__IDLOC(15F0);
将ID的四个单元定义为:
1,5,15,0.ID的具体位置由所指定的PIC
芯片自动设定。
1-8EEPROM数据
有些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总是采用位指令。
如:
intfoo;
foo|=0x40;
的编译结果为:
bsf_foo,6
为了方便可以定义如下宏:
#definebitset(var,bitno)((var)|=(1<<(bitno)))
#defienbitclr(var,bitno)((var)&=(1<<(bitno)))
上一条语句可写为:
bitset(foo,6);
1-10支持的数据类型
PICC支持1,2,4字节的基本类型。
所有的多字节类型都采用低有效位在前的格式,
表1-2列出了所有数据类型及它们所占空间大小。
表1-2
类型
大小(位)
数字类型
值
bit
1
逻辑类型
0或1
signedchar
8
有符号字符
-128..+127
unsignedchar
8
无符号字符
0..255
signedshort
16
有符号整数
-32768..+32767
unsignedshort
16
无符号整数
0..65535
signedint
16
有符号整数
-32768..+32767
unsignedint
16
无符号整数
0..65535
signedlong
32
有符号整数
-2147483648..+2147483647
unsignedlong
32
无符号整数
0..4294967295
float
24
浮点
double
24or32
浮点
由-D24,-D32决定
1-10-1常量及进制表示
PICC支持标准C的进制表示方法。
l或L后缀表明常量为long类型,u或U后缀表示常量为unsinged类型。
浮点数为double类型,可以用f或F指定浮点数为float类型。
字符型由单引号括起,如'a'.
字符串由双引号括起,如"Helloworld".
1-10-2位数据类型
PICC支持一位的变量,用bit来定义。
如:
staticbitinit_flag;
变量必须是全局的或静态的,它不能是自动变量或一个函数的参数,但可以作为
一个函数的返回类型。
位变量很象unsignedchar,但它只有0或1两个值,位变量占用空间少,且运算
速度快.所有的位变量在startup是被清0,请在程序开始处初始化它们。
如果将一个整型数赋给位变量,只是将最低位赋给位变量,如果你是想要将一个整型
变量是否为0赋值给一个位变量,请用:
bitvar=other_var!
=0;
如要你使用了PICC的-STRICT命令,bit将被视为非法命令。
1-10-2-1使用可位寻址的寄存器
位变量的定义可以与绝对地址的定义结合起来使用。
如:
为了访问STATUS中PowerDown位,先定义STATUS的绝对地址为3,然后再
定义一位变量绝对地址为27
staticunsignedcharSTATUS@0x03;
staticbitPD@(unsigned)&STATUS*8+3;
注意:
头文件中已定义所有的特殊功能寄存器及相应的位寄存器.
1-10-3
PICC浮点数使用IEEE75432位格式和IEEE754(截断)24位格式.
float类型使用24位格式,double使用24位或32位格式,由PICC命令控制,
-D24使用24位格式,-D32使用32位格式.
1-11绝对地址变量
一个全局的或静态的变量可以定位绝对地址,使用如下格式:
unsignedcharPortvar@0x06;
这里定义了一个名为'Portvar'的变量,地址为06h,注意,编译器并不保留任何
单元,仅仅是将一个变量分配在06h单元.它等价于汇编语言:
_PortvarEQU06h
编译器及连接器都不作任何检查,完全由程序员保证分配不会发生冲突.
1-12结构与联合
PICC支持struct及union,它们可以作为函数的参数及返回值,也可以作为指针
指向的目标.
1-12-1结构限定
PICC支持在结构上使用限定符,如果在一个结构上使用限定符,那么,这个结构的
所有成员都被限定. 如:
bank1struct{
intnumber;
int*ptr;
}
在这个结构里,number,ptr都被放在bank1寄存器内.
1-12-2结构中定义位成员
PICC支持在结构中定义位成员.
位成员按最低有效位在前的方式存储,位成员总是按8位字节方式存放,当当前
字节放满后再放下一个字节,位成员不会跨字节存放.如:
struct{
unsignedhi:
1;
unsigneddummy:
6;
unsignedlo:
1;
}foo@0x10;
结构foo占用10h单元,hi为10h单元的第0位,lo为10h单元的第7位,dummy为10h
单元的2-6位,(第6位为最高有效位)
不使用的位可用未命名的位成员来定义,如果我们不使用dummy,就可定义为:
struct{
unsignedhi:
1;
unsigned:
6;
unsignedlo:
1;
}foo@0x10;
1-13在ROM及RAM存放字符串.
一个未说明的字符串总是存放在ROM中,并且只能通过常量指针为访问.
#defineHELLO"Helloword"
SendBuff(HELLO);
一个非常量的数组被一个字符串初始化,如:
charfred[]='Helloworld";
将在RAM中保留一个数组,在startup时,用存放在ROM中的"Helloworld"来初始化.
如果要将一个常数字符串作为函数参数或将它赋给一个指针,必须定义一个常数指针.
如:
voidSendBuff(constchar*ptr)
1-14const,volatile类型限定符.
PICC支持标准C的const,volatile类型限定符
const类型限定符通知编译器一个目标含有的常量并且不会改变.一个常量被放
在ROM中,显然一个常量是不能被赋值的.如:
constintversion=3;
volatile类型限定符通知编译器,一个目标不能保证在连续的访问中不被改变.
这将禁止编译器对该目标的优化.所有的I/O口及在中断中使用的变量必须
有volatile类型限定符.如:
volatileunsignedcharP_A@0x05;
对volatile目标的访问与对non-volatile的访问是不同的,如对volatile目标置1是
先将该目标清0后加1,而对non-volatile目标置1是先将1放在W中后再将W
赋值到目标中.
1-14特别的类型限定符.
PICC支持一些特别的类型限定符:
persistent,bank1,bank2及bank3,
这些限定符不可用于自动变量.
1-14-1persistent
按C的标准,所有的C变量在startup时被清为0.但是在有些情况下,我们希望在
复位后仍保持一些变量的值.persistent类型限定符使被其限定的变量在
startup时不被清0,而保留原有的值.
1-14-2bank1,bank2及bank3类型限定符.
bank1,bank2及bank3类型限定符用于指定变量所在的寄存器页.如:
staticbank3unsignedcharfred;
bank3unsignedchar*ptrfred;
缺省页是bank0
1-15C语言中的中断处理
在PICCC语言中可以用"interrupt"限定符来编写中断服务程序.
一个中断服务函数必须用interruptvoid来定义,不能有参数,并且不能被C
语言直接调用.如:
longtick_count;
voidinterrupttc_int(void)
{
++tick_count;
}
1-15-1在中断中保存环境
PIC单片机硬件只保存PC,PICC编译器自动地保存其它可能用到的变量.但是
编译器无法确定inline中的汇编语言段使用变量的情况,你必须自已保护它们.
1-15-2开启中断
在PIC.H中定义了所有的中断位,di()关闭所有中断,ei()打开所有中断.如:
ADIE=1;//A/Dinterruptwillbeused
PEIE=1;//allperipheralinterruptsareenabled
ei(); //enableallinterrupts
di(); //disableallinterrupts
1-16在C中使用汇编语言#asm,#endasm,asm()
可以在C语言中直接使用汇编语言.#asm,#endasm用来加入一段汇编语言,
而asm()用来加入一条汇编语言.如:
#include
unsingedcharvar;
voidmain(void)
{
var=1;
#asm
rlf_var,1
rlf_var,1
#endasm
asm("rlf_var,1");
}
1-17函数调用变换
由于PIC5X只有两级堆栈,PICC编译器使用转移指令来调用函数,这样被套调用
层次增加,但调用速度下降,请在需要快速调用的函数前加fastcall来指定编译器
直接使用调用指令调用函数.
对于14位的PIC单片机,将永远使用调用指令调用.
1-18MPLAB使用的调试控制项
-FACKLOCAL命令用于在MPLAB下观察函数内的局部变量
-MPLAB_ICD命令用于使用ICD调试C语言.
第二部分
2-1安装PICC
将CD-ROM装入光驱,自动运行程序将自动启动,如果你已禁止自动运行功能,可以
直接运行:
cd_drive:
\compiler\install.exe
安装程序将指导你完成PICC的安装.
2-2设置伟福集成环境
在伟福集成环境中,将编译器路径指向PICC所在目录
将C命令行设置为:
-16F877–G–O–Zg-c
将连接命令行设置为:
-16F877–G–O-Zg
其中:
-16F877为芯片型号
–G–O-c为源程序调试设置项,不可修改
–Zg为打开优化
你可以在命令行中加入其它控制项
2-3调试C语言
在WAVE\SAMPLES目录下有一个PICC语言的例子程序:
PIC_C.PRJ.
1.打开PIC_C项目.
2.编译该项目(F9)
3.用F7,F8单步调试例子程序
4.打开观察窗口观察变量