微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > PIC单片机 C编程技巧

PIC单片机 C编程技巧

时间:11-13 来源:互联网 点击:
1、PICC和MPLAB集成

PICC和MPLAB集成:
PICC有自己的文本编辑器,不过是DOS风格的,看来PICC的工程师 要专业冷到酷底了...
大家大可不必用它,如果你没什么癖好的话,你不会不用UltraEdit 吧?
1:建立你的工作目录:
建 议在C盘根目录下建立一个以A开头的文件夹做为工作目录.因为你会发现它总是在你查找文件时候第
一个跳入你眼中.
2:MPLAB调用 PICC.(以MPLAB5.7版本为例子)
启动MPLAB.在Project-->Install Language Tool:
Language Suite----->hi-tech picc
Tool Name ---->PICC Compiler
Executable ---->c:hi-picinpicc.exe (假如你的PICC是默认安装的)
选Command-line
最后OK.
上 面这步只需要设定一次,除非你重新安装了MPLAB.
3:创建你的项目文件:(假如你实现用EDIT编辑好了一个叫AA.C的C代码文件)
Project-->New Project-->File Name--->myc (假如我们把项目文件取名字叫MYC.PJT)
右边窗口当然要选择中你的 工作目录.然后OK.
4:设定你的PICC工作参数:
Project-->Edit Project
上面4个栏目就用默认 的,空的也就让它空着,无所谓的.
需要修改的是:
Development Mode---->选择你的PIC型号.当然要选择Mplab SIM Simulator
让你可以用软件仿真.
Language Tool Suite--->HI-TECH PICC
上面的步骤,你可能会遇见多个提示条,不要管它,一路确定.
下面是 PICC编译器的选择项:
双击Project Files 窗口里面的MYC.HEX,出现一个选择拦目.命令很多,大家可以看PICC文本编
辑 器里面的HELP,里面有详细说明.
下面就推荐几个常用也是建议用的:
Generate debug info 以及下面的2项.
Produce assembler list file
就在它们后面打勾即可,其它的不要管,除非你有特殊要求.
5:添加你的C代码文件:
当 进行了前面几步后,按Add Node 找到AA.C文件就OK了.
6:编译C代码:
最简单的一步:直接按下F10.
编译完后, 会出现各种调试信息.C代码对应的汇编代码就是工作目录里面的AA.IST,用EDIT
打开可以看见详细的对比.
7:其它,要是一切都没 问题,那么你就可以调试和烧片了,和以往操作无异.
2、如何从汇编转向PICC
首先要求你要有C 语言的基础。PICC 不支持C++,这对于习惯了C++的朋友还得翻翻C 语言的书。C
代码的头文件一定要有#i nclude,它是很多头文件的集合,C 编译器在pic.h 中根据你的芯片自动栽
入相应的其它头文件。这点比汇编 好用。载入的头文件中其实是声明芯片的寄存器和一些函数。顺便摘抄
一个片段:
static volatile unsigned char TMR0 @ 0x01;
static volatile unsigned char PCL @ 0x02;
static volatile unsigned char STATUS @ 0x03;
可以看出和汇编的头文件中定义寄存器是差不多的。如下:
TMR0 EQU 0X01;
PCL EQU 0X02;
STATUS EQU 0X03;
都是把无聊的地址定义为大家公认的名字。
一: 怎么附值?
如对TMR0 附值,汇编中:
MOVLW 200;
MOVWF TMR0;
当然得保证当前页面在0,不然会出 错。
C 语言:
TMR0=200;//无论在任何页面都不会出错。
可以看出来C 是很直接了当的。并且最大好处是操作一个寄存器时候,不用考虑页面的问题。一切由
C 自动完成。
二:怎么位操作?
汇编中的位操作 是很容易的。在C 中更简单。C 的头文件中已经对所有可能需要位操作的寄存器的每
一位都有定义名称:
如:PORTA 的每一个I/O 口定义为:RA0、RA1、RA2。。。RA7。OPTION 的每一位定义为:PS0、
PS1、PS2 、PSA 、T0SE、T0CS、INTEDG 、RBPU。可以对其直接进行运算和附值。
如:
RA0=0;
RA2=1;
在汇编中 是:
BCF PORTA,0;
BSF PORTA,2;
可以看出2 者是大同小异的,只是C 中不需要考虑页面的问题。
三: 内存分配问题:
在汇编中定义一个内存是一件很小心的问题,要考虑太多的问题,稍微不注意就会出错。比如16 位的
运算等。用C 就不需要考虑太多。下面给个例子:
16 位的除法(C 代码):
INT X=5000;
INT Y=1000;
INT Z=X/Y;
而在汇编中则需要花太多精力。
给一个小的C 代码,用RA0 控制一个LED 闪烁:
#i nclude
void main()
{
int x;
CMCON=0B111; //掉A 口比较器,要是有比较器功能的话。
ADCON1=0B110; //掉A/D 功能,要是有A/D 功能的话。
TRISA=0; //RA 口全为输出。
loop:RA0=!RA0;
for(x=60000;--x;){;} //延时
goto loop;
}
说 说RA0=!RA0 的意思:PIC 对PORT 寄存器操作都是先读取----修改----写入。上句的含义是程序先
读RA0,然后取反,最后 把运算后的值重新写入RA0,这就实现了闪烁的功能。
3、浅谈PICC 的位操作
由于PIC 处理器对位操作是最高效的,所以把一些BOOL 变量放在一个内存的位中,既可以达到运算
速度快,又可以达到最大限度节省空间的目的。在C 中的位操作有多种选择。
*********************************************
如:char x;x=x|0B00001000; /*对X 的4 位置1。*/
char x;x=x&0B11011111; /*对X 的5 位清0。*/
把上面的变成公式则是:
#define bitset(var,bitno)(var |=1#define bitclr(var,bitno)(var &=~(1则上面的操作就是:char x;bitset(x,4)
char x;bitclr(x,5)
*************************************************
但 上述的方法有缺点,就是对每一位的含义不直观,最好是能在代码中能直观看出每一位代表的意思,
这样就能提高编程效率,避免出错。如果我们想用X 的0-2 位分别表示温度、电压、电流的BOOL 值可以
如下:
unsigned char x @ 0x20; /*象汇编那样把X

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top