分享

PIC单片机C语言简记

 共同成长888 2020-05-26

1.PICC安装:    

  PICC编译器可以直接挂接在MPLAB-IDE集成开发平台下,实现一体化的编译连接和原代码调试。使用MPLAB-IDE内的调试工具ICE2000 、ICD2 和软件模拟器都可以实现原代码级的程序调试,非常方便。

  首先必须在你的计算机中安装 PICC 编译器。安装成功后可以进入IDE ,选择菜单项Project Æ Set Language Tool Locations… ,打开语言工具挂接设置对话框。在对话框中选择“HI-TECH PICC Toolsuite”栏,展开可执行文件组“Executable”后,列出了将被MPLAB-IDE 后台调用的编译器所用到的所有可执行文件,其中有汇编编译器“PICC Assembler ”、C 原程序编译器“PICC Compiler”和连接定位程序“PICC Linker”。同时在此列表中还显示了对应的可执行程序名,请注意在这里都是“PICC.EXE”。用鼠标分别点击选中这三项可执行文件,观察对话框下面“Location ”一栏中显示的文件路径,用“Browse…”按纽,从计算机中已经安装的 PICC编译器文件夹中选择PICC.EXE 文件。

     实际上PICC.EXE 只是一个调度管理程序,它会按照所输入的文件扩展名自动调用对应的编译器和连接器,用户要注意的是C 语言原程序扩展名用“.c ”,汇编原程序用“.as”即可。用C 语言编程的好处是可以实现模块化编程。程序编写者应尽量把相互独立的控制任务用多个独立的C 原程序文件实现,如果程序量较大,一般不要把所有的代码写在一个文件内。

  基于PICC编译环境编写PIC 单片机程序的基本方式和标准C 程序类似,程序一般由以下几个主要部分组成: 
  z   在程序的最前面用#include 预处理指令引用包含头文件,其中必须包含一个编译器提供的“pic.h ”文件,实现单片机内特殊寄存器和其它特殊符号的声明; 
  z   用“__CONFIG ”预处理指令定义芯片的配置位; 
  z   声明本模块内被调用的所有函数的类型,PICC将对所调用的函数进行严格的类型匹配检查; 
  z   定义全局变量或符号替换; 
  z   实现函数(子程序),特别注意 main 函数必须是一个没有返回的死循环。

 1 #include   //包含单片机内部资源预定义 

 2 #include “pc68.h”    //包含自定义头文件 

 3  //定义芯片工作时的配置位 

 4 __CONFIG (HS & PROTECT & PWRTEN & BOREN & WDTDIS); 

 5  //声明本模块中所调用的函数类型 

 6 void SetSFR(void); 

 7 void Clock(void); 

 8 void KeyScan(void); 

 9 void Measure(void); 

10 void LCD_Test(void); 

11 void LCD_Disp(unsigned char);  

12 //定义变量 

13 unsigned char second, minute, hour; 

14 bit flag1,flag2; 

15 //函数和子程序

16 void main(void) 

17 { 

18   SetSFR(); 

19   PORTC = 0x00; 

20   TMR1H += TMR1H_CONST; 

21   LED1 = LED_OFF; 

22 

23   LCD_Test(); 

24  

25   //程序工作主循环 

26   while(1) { 

27      asm(“clrwdt”);   //清看门狗 

28      Clock();        //更新时钟 

29      KeyScan();      //扫描键盘 

30      Measure();      //数据测量 

31      SetSFR();       //刷新特殊功能寄存器 

32   } 

33 } 

2.PICC 中的变量定义:

bit         1      布尔型位变量,0 或1 两种取值 
char          8      有符号或无符号字符变量,PICC 缺省认定char 型变量为无符号数,但可以通过编译选项改为有符号字节变量 
unsigned char    8      无符号字符变量 
short       16      有符号整型数 
unsigned short   16      无符号整型数 
int           16      有符号整型数 
unsigned int         16      无符号整型数 
long        32      有符号长整型数 
unsigned long       32      无符号长整型数 
float        24      浮点数 
double       24  或32     浮点数,PICC 缺省认定double 型变量为24位长,但可以改变编译选项改成32位

除了bit型位变量外,PICC完全支持数组、结构和联合等复合型高级变量,这和标准的C 语言所支持的高级变量类型没有什么区别。例如: 

数组:unsigned int data[10]; 

结构:struct commInData { 

         unsigned char inBuff[8]; 

         unsigned char getPtr, putPtr; 

      }; 

联合:union int_Byte { 

         unsigned char c[2]; 

         unsigned int i; 

      }; 

3.PICC对数据寄存器bank 的管理

  PICC把单片机中数据寄存器的bank 问题交由编程员自己管理,因此在定义用户变量时你必须自己决定这些变量具体放在哪一个bank 中。如果没有特别指明,所定义的变量将被定位在bank0。  

例如下面所定义的这些变量: 

unsigned char buffer[32]; 

bit flag1,flag2; 

float val[8]; 

  除了bank0 内的变量声明时不需特殊处理外,定义在其它bank 内的变量前面必须加上相应的bank 序号,例如: 

bank1 unsigned char buffer[32];    //变量定位在bank1中 
bank2 bit flag1,flag2;    //变量定位在bank2中 
bank3 float val[8];    //变量定位在bank3中

  如果超过bank 容量,在最后连接时会报错,大致信息如下:(中档PIC中一个数据寄存器128字节) 
Error[000]   : Can't find 0x12C words for psect rbss_1 in segment BANK1

 
   连接器告诉你总共有0x12C (300 )个字节准备放到 bank1 中但 bank1 容量不够。显然,只有把一部分原本定位在bank1 中的变量改放到其它 bank 中才能解决此问题。

  虽然变量所在的bank 定位必须由编程员自己决定,但在编写原程序时进行变量存取操作前无需再特意编写设定bank 的指令。C 编译器会根据所操作的对象自动生成对应 bank 设定的汇编指令。为避免频繁的bank 切换以提高代码效率,尽量把实现同一任务的变量定位在同一个bank 内;对不同bank 内的变量进行读写操作时也尽量把位于相同 bank 内的变量归并在一起进行连续操作。

    PICC中把所有的函数内部定义的auto型局部变量放在bank0。为了节约宝贵的存储空间,它采用了一种被叫做“静态覆盖”的技术来实现局部变量的地址分配。因此用户自己定位在bank()内的变量字节数将受到一定的限制,在实际使用时需注意。

   bit型为变量只能是全局的或静态的。PICC将把定位在同一bank内的8个位变量合并成一个存放于一个固定地址。因此所有指针对为变量的操作将直接使用PIC单片机的位操作汇编指令高效实现。

  在用C 语言写程序时变量一般由编译器和连接器最后定位,在写程序之时无需知道所定义的变量具体被放在哪个地址(除了bank 必须声明)。真正需要绝对定位的只是单片机中的那些特殊功能寄存器,而这些寄存器的地址定位在PICC编译环境所提供的头文件中已经实现,无需用户操心。

  unsigned char tmpData @ 0x20;  //tmpData定位在地址0x20

    上面变量 tmpData 的地址是0x20,但最后 0x20 处完全有可能又被分配给了其它变量使用,这样就发生了地址冲突。因此针对变量的绝对定位要特别小心。从笔者的应用经验看,在一般的程序设计中用户自定义的变量实在是没有绝对定位的必要。

  如果需要,位变量也可以绝对定位。但必须遵循上面介绍的位变量编址的方式。如果一个普通变量已经被绝对定位,那么此变量中的每个数据位就可以用下面的计算方式实现位变量指派: 
      unsigned char tmpData @ 0x20;  //tmpData定位在地址0x20 
      bit tmpBit0 @ tmpData*8+0;    //tmpBit0对应于tmpData第0 位 
      bit tmpBit1 @ tmpData*8+1;    //tmpBit0对应于tmpData第1 位 
      bit tmpBit2 @ tmpData*8+2;    //tmpBit0对应于tmpData第2 位 
如果tmpData 事先没有被绝对定位,那就不能用上面的位变量定位方式。

4.PICC的其它变量修饰关键词: 

  extern  —  外部变量声明。如果在一个C 程序文件中要使用一些变量但其原型定义写在另外的文件中,那么在本文件中必须将这些变量声明成“extern ”外部类型。

例如程序文件code1.c中有如下定义: 

bank1 unsigned char var1, var2;      //定义了bank1中的两个变量 

在另外一个程序文件code2.c中要对上面定义的变量进行操作,则必须在程序的开头定义:  

extern bank1 unsigned char var1, var2;  //声明位于bank1的外部变量 

volatile — 易变型变量声明。PICC 中还有一个变量修饰词在普通的C 语言介绍中一般是看不到的,它说明

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

上一篇:PIC16f877a单片机DS18b20源程序
下一篇:比较/ 捕捉/PWM (CCP)模块

  • 关注eeworld公众号
    快捷获取更多信息

  • 关注eeworld服务号
    享受更多官方福利

0

推荐阅读

PIC单片机之I2C通信(主模式)
(ACK)    当接收方接收完一个字节的数据就要告诉对方我收到了。接收方如果接收到数据则控制数据线输出低电平。否则为高电平。    5,停止     没有下一个字节要发送,最后时钟线变为高电平后,数据线从低电平变为高电平。代表数据发送停止。    实例讲解: 使用单片机使用 RSM2257 电子音量控制芯片来控制音量。一个按键按下,声音变大,一个按键按下,声音变小。在加上一个按键,控制一个LED亮灭的程序。而且音量掉电保存。    介绍RSM2257.    子地址 
发表于 2020-04-25
PIC单片机之I2C通信(主模式)
PIC单片机学习遇到的一些问题
1、中断优先级中断优先级的设置虽然能够比较合理的管理资源,但是如果在中断里写太多内容会导致另一个中断可能永远进不去的现象。比如在定时器中断里定20ms,但是中断里面处理的代码量太多超过20ms,则会出现另一个中断优先级低的刚等待定时器执行完要开始执行时,定时时间到了又进定时中断。如此循环低优先级的中断永远也进不去。(给低优先级中断IE位重新复位可以在短时间无视优先级执行,不过过一段时间也会出现上述情况。作者亲身试过的bug)2、AD采样出现波动大的问题有时程序出现AD采样的数值波动大往往是因为可能这时候的供电情况不同,可能你跟原先状态比关闭了什么开启了什么。如开关GPS、开关功放导致的。3、XC编译器与系统不兼容问题由于系统与编译器
发表于 2020-03-23
PIC单片机的学习——时钟的配置
一、概念Fcy是CPU时钟,Fosc晶振频率。Fcy = Fosc/2,也就是CPU时钟是晶振频率的1/2。二、寄存器的配置例子如下:    //系统时钟初始化 产生55.296M //11.0592M晶振    // Fosc= Fin*M/(N1*N2), Fcy=Fosc/2    // Fosc= 11.0592M*60/(2*3)=110.592Mhz for 11.0592M input clock    // Fcy= Fosc/2 = 55.296MHZ     PLLFBD = 58;  &nbs
发表于 2020-03-23
PIC单片机软件平台----MPLAB IDE和MPLAB X IDE
这里主要是针对PIC18单片机开发平台,当然对于16位或32位单片机的开发平台是一样的,只是编译器不一样。PIC18单片机有两个开发平台,一个是MPLAB IDE,对应的编译器为MPLAB C Compiler for PIC18 MCUs.exe;一个是MPLAB X IDE,对应的编译器为xc8-v2.00-full-install-windows-installer.exe。下载链接如下:https://download.csdn.net/download/euxnijuoh/10889265
发表于 2020-03-17
PIC单片机输出比较(PWM)模块介绍
在Android红外遥控器项目中使用了输出比较OC1(PWM)模块来产生38KHz PWM脉冲,脉冲占空比与红外信号发射距离以及产品功耗有关。其中占空比越大,发射距离越远,功耗越大。红外载波的占空比一般在1/3左右。将输出比较模块配置为PWM 操作,需要以下步骤:1.将OCx输出配置为可用的外设引脚选择引脚之一。2.计算所需的占空比并将计算结果装入 OCxR 寄存器。3.计算所需的周期并将计算结果装入 OCxRS 寄存器。4.选择当前的 OCx 作为同步源,方法是把 0x1F写入SYNCSEL<4:0>(OCxCON2<4:0>),把 0 写入OCTRIG (OCxCON2<7>)。5.通过写 O
发表于 2020-03-17
PIC单片机驱动LCD模块的设计
(Thevenin)等效电路进行模拟。对于VLCD3和VLCD0,戴维南电阻为0;如它不为0的两种情况,即对于VLCD2和VLCD1。电路可以简化为如下图所示的电路。RSW是段多路开关的电阻;RCOM是公共多路开关的电阻。对于戴维南电阻不为0的情况,戴维南电压等于2/3 VDD或1/3 VDD。戴维南电阻等于梯形电阻网络上部和下部的串联电阻,其估算电阻的等效电路见右图所示。例如.可以用RC电路来模拟单个像素的驱动器,在该电路中电压在0V~VLCD2之间切换。对于LCD和PIC单片机,可以估算段和公共开关电路的电阻分别大约为4.7kΩ和0.4kΩ。可以看到,经过像素的电压从0变为VTH的时间将取决于像素的电容和总电阻,而梯形电阻网络戴维南电阻
发表于 2020-03-11
PIC单片机驱动LCD模块的设计

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多