比较cao蛋的是,MPLAB 具有多种编译器,版本相弊樱互不兼容。
其中市场主打 的PIC16F 系列,多数采用 MPLAB IDE 编译器(本人用V8.8版本(破解的,嘘),新的应该是V8.9版本租橡丛,不过本人没多关注,也不知道正不正确)。
MPLAB 编译器,在编程的时候,必须选择单片机型号,而本人使用的IDE V8.8版,并不能支持所有的PIC16系列单片机型号(最起码,最近使用的PIC16F1513就没有支持,在MPLAB X IDE里有支持)
而microchip 的高级单片机 PIC18系列,则以 MPLAB X IDE 编译器为主(行业称“十”版本),不过用了IDE V8.8后,再下载使用 IDE 10(就是上面的十版本)。你会觉得画风突变,完全找不着北,连配置字、用户程序版本号都没法兼容使用。前面熟悉的IDE,完全没法发挥任何作用。你又得重新开始学习一个新的编程软件(害得哥在新项目上浪费了N多时间)。
最可恨的是,IDE 10 把市场上销售的如祥PICKIT 3 的离线脱机下载功能给搞死了(一插上KIT 3,IDE 10就自动升级KIT 3 的内部固件程序)。然后哥只能给它贴上“研发专用”标签!
PIC 的单片机很多地方要注意的,不用的特殊功能(特别是AD)不是你不开就好的,而是你必须关闭才行。
PIC 单片机有自己的一套 汇编,如果你用汇编,你必须重新学习它的汇编语言。如果你使用C,那还好,多数是兼容的(除了 程序续行(就是单行程序太长,进行多行显示))。不过哥没整好它的混编(不知道是哥能力不够,还是破解安装少东西,都是编译错误),没法发挥它的高效。PIC 单片机的 除法运算1000个周期、左右移16位无法编译、硬堆栈层限制(就是函数内 调用函数 调用函数 调用函数……,最明显的就是递归调用被限死)…………一堆弱点!
搜索栏里找PIC.H你看看是这个不:
#ifndef _PIC_H
#define _PIC_H
#if defined(_10F200) || defined(_10F202) ||\\
defined(_10F204) || defined(_10F206)
#include <戚运液pic10f20x.h>
#endif
#if defined(_12C508) || defined(_12C509) ||\\
defined(_12F508) || defined(_12F509) ||\\
defined(_12C508A) || defined(_12C509A) ||\\
defined(_12CE518) || defined(_12CE519) ||\\高物
defined(_12C509AG) || defined(_12C509AF) ||\\
defined(_12CR509A) || defined(_RF509AG) ||\\
defined(_RF509AF)
#include <pic125xx.h>
#endif
#if defined(_16C432) || defined(_16C433)
#include <43x.h>
#endif
#if defined(_16C52) || defined(_16C54) || defined(_16C54A) ||\\
defined(_16C54B) || defined(_16C54C) || defined(_16CR54A) ||\\
defined(_16CR54B) || defined(_16CR54C) || defined(_16C55) ||\\
defined(_16C55A) || defined(_16C56) || defined(_16C56A) ||\\
defined(_16CR56A) || defined(_16C57) || defined(_16C57C) ||\\
defined(_16CR57B) || defined(_16CR57C) || defined(_16C58A) ||\\
defined(_16C58B) || defined(_16CR58A) || defined(_16CR58B) ||\\
defined(_16C58) || defined(_16HV540)
#include <5x.h>
#endif
#if defined(_16F54) || defined(_16F57)
#include <f5x.h>
#endif
#if defined(_12C671) || defined(_12C672) ||\\
defined(_12CE673) || defined(_12CE674)
#include <pic1267x.h>
#endif
#if defined(_12F629) || defined(_12F675)
#include <pic12f6x.h>
#endif
#if defined(_12F683)
#include <pic12f683.h>
#endif
#if defined(_12F675F) || defined(_12F675H) || defined(_12F675K)
#include <pic12rf675.h>
#endif
#if defined(_16C505) || defined(_16F505)
#include <505.h>
#endif
#ifdef _14000
#include <pic14000.h>
#endif
#if defined(_16C554) || defined(_16C556) || defined(_16C557) || \\
defined(_16C558) || defined(_16C554A) || defined(_16C556A) || \\
defined(_16C558A)
#include <55x.h>
#endif
#ifdef _16C61
#include <61.h>
#endif
#if defined(_16C62) || defined(_16C62A) || defined(_16CR62) ||\\悄配
defined(_16C62B)
#include <62.h>
#endif
#if defined(_16C620) || defined(_16C621) || defined(_16C622) ||\\
defined(_16C620A) || defined(_16C621A)|| defined(_16C622A) ||\\
defined(_16CE623) || defined(_16CE624) || defined(_16CE625) ||\\
defined(_16CR620A)
#include <62x.h>
#endif
#if defined(_16C64) || defined(_16C64A) || defined(_16CR64)
#include <64.h>
#endif
#if defined(_16C641) || defined(_16C642) ||\\
defined(_16C661) || defined(_16C662)
#include <6xx.h>
#endif
#if defined(_16C65) || defined(_16C65A) || defined(_16CR65)
#include <65.h>
#endif
#if defined(_16C66) || defined(_16C67)
#include <6x.h>
#endif
#if defined(_16C71) || defined(_16C710) || defined(_16C711)
#include <71x.h>
#endif
#if defined(_16C712)|| defined(_16C715) || defined(_16C716)
#include <715.h>
#endif
#if defined(_16C72) || defined(_16C72A) || defined(_16CR72)
#include <72.h>
#endif
#if defined(_16C73) || defined(_16C73A) ||\\
defined(_16C74) || defined(_16C74A) ||\\
defined(_16C63) || defined(_16CR63) || defined(_16C63A) ||\\
defined(_16C65B)|| defined(_16C73B) || defined(_16C74B) ||\\
defined(_16LC74B)
#include <74.h>
#endif
#if defined(_16C76) || defined(_16C77)
#include <77.h>
#endif
#if defined(_16C773) || defined(_16C774) || defined(_16C770) ||\\
defined(_16C771) || defined(_16C717) || defined(_16C745) ||\\
defined(_16C765)
#include <77x.h>
#endif
#if defined(_16C781) || defined(_16C782)
#include <78x.h>
#endif
#if defined(_16F627) || defined(_16F628)
#include <f6x.h>
#endif
#if defined(_16F627A) || defined(_16F628A) || defined(_16F648A)
#include <f62xa.h>
#endif
#if defined(_16F630) || defined(_16F676)
#include <630.h>
#endif
#if defined(_12F635) || defined(_16F636)
#include <f636.h>
#endif
#if defined(_16F684)
#include <f684.h>
#endif
#if defined(_16F688)
#include <f688.h>
#endif
#if defined(_16F83) || defined(_16CR83) || defined(_16C84) || \\
defined(_16F84) || defined(_16F84A) || defined(_16CR84)
#include <84.h>
#endif
#if defined(_16F87) || defined(_16F88)
#include <f87.h>
#endif
#if defined(_16F873) || defined(_16F874) ||\\
defined(_16F876) || defined(_16F877) ||\\
defined(_16F872) || defined(_16F871) ||\\
defined(_16F870)
#include <87x.h>
#endif
#if defined(_16F873A) || defined(_16F874A) ||\\
defined(_16F876A) || defined(_16F877A)
#include <8xa.h>
#endif
#if defined(_16F72) ||\\
defined(_16F73) || defined(_16F74) ||\\
defined(_16F76) || defined(_16F77)
#include <f7x.h>
#endif
#if defined(_16F716)
#include <f716.h>
#endif
#if defined(_16F737) || defined(_16F747) ||\\
defined(_16F767) || defined(_16F777)
#include <f7x7.h>
#endif
#if defined(_16F818) || defined(_16F819)
#include <f81x.h>
#endif
#if defined(_16C923) || defined(_16C924) ||\\
defined(_16C925) || defined(_16C926)
#include <9xx.h>
#endif
#if defined(_7C695X)
#include <pic7695x.h>
#endif
#if defined(_16C99) || defined (_16C99C)
#include<99.h>
#endif
#if defined(_17C42) || defined(_17C42A) || defined(_17CR42) ||\\
defined(_17C43) || defined(_17CR43) || defined(_17C44)
#include<pic174x.h>
#endif
#if defined(_17C752) || defined(_17C756) || defined(_17C756A)||\\
defined(_17C762) || defined(_17C766)
#include<pic177xx.h>
#endif
#define CLRWDT() asm("clrwdt")
#define SLEEP() asm("sleep")
#define NOP() asm("nop")
#define ___mkstr1(x) #x
#define ___mkstr(x) ___mkstr1(x)
#define __CONFIG(x) asm("\\tpsect config,class=CONFIG,delta=2")\\
asm("\\tdw "___mkstr(x))
#define __IDLOC(w) asm("\\tpsect idloc,class=IDLOC,delta=2")\\
asm("\\tglobal\\tidloc_word")\\
asm("idloc_word")\\
asm("\\tirpc\\t__arg," ___mkstr(w))\\
asm("\\tdw 0&__arg&h")\\
asm("\\tendm")
#if EEPROM_SIZE >0
#define __EEPROM_DATA(a, b, c, d, e, f, g, h) \\
asm("\\tpsect eeprom_data,class=EEDATA,delta=2")\\
asm("\\tdb\\t" ___mkstr(a) "," ___mkstr(b) "," ___mkstr(c) "," ___mkstr(d) "," \\
___mkstr(e) "," ___mkstr(f) "," ___mkstr(g) "," ___mkstr(h))
#endif
/***********************************************************************
**** FLASH memory read/write/erase macros and function definitions ****
***********************************************************************
* Notes:
* __FLASHTYPE == 0 defined in devices that can only read flash memory - cannot write eg. 16F777
* __FLASHTYPE == 1 defined in traditional devices that can write 1 word at a time eg. 16F877
* __FLASHTYPE == 2 defined in devices that can only write in 4 word blocks eg. 16F877A
* __FLASHTYPE == 3 defined in devices requiring 32-word block erasure before writing eg. 16F87
* __FLASHTYPE == undefined if device can neither read nor write program memory
*/
// macro FLASH_READ returns a word stored at a flash address
#if defined(__FLASHTYPE)
extern unsigned char flash_read(unsigned short addr)
#if EEPROM_SIZE >0
#define FLASH_READ(addr) \\
(EEADR=(addr)&0xff, \\
EEADRH=(addr)>>8, \\
WREN=0, \\
EECON1 |= 0x80, \\
RD=1, \\
DC=0, \\
DC=0, \\
(EEDATH <<8) | EEDATA)
#else // FLASH_READ without EEPROM
#define FLASH_READ(addr) \\
(EEADR=(addr)&0xff, \\
EEADRH=(addr)>>8, \\
RD=1, \\
DC=0, \\
DC=0, \\
(EEDATH <<8) | EEDATA)
#endif
#endif // end FLASH_READ
// macro FLASH_WRITE used when writing only one word of data
#if __FLASHTYPE==2 || __FLASHTYPE==3
#define FLASH_WRITE(addr,data) \\
do{ \\
unsigned short x=data\\
flash_copy((const unsigned char *)&x,1,addr)\\
}while(0)
extern void flash_copy(const unsigned char * source_addr,unsigned char length,unsigned short dest_addr)
#elif __FLASHTYPE==1
#define FLASH_WRITE(addr, value) \\
EEADR=((addr)&0xff)\\
EEADRH=((addr)>>8)\\
EEDATH=((value)>>8)\\
EEDATA=((value)&0xff)\\
EECON1 |= 0x80 \\
WREN=1 \\
EECON2 = 0x55 \\
EECON2 = 0xaa \\
WR=1 \\
asm("nop") \\
asm("nop") \\
WREN=0
#endif // end FLASH_WRITE
// macro FLASH_ERASE used to clear a 32-Byte sector of flash
#if __FLASHTYPE==3
#define FLASH_ERASE(addr) \\
while(WR)continue\\
EEADR=((addr)&0xFF)\\
EEADRH=((addr>>8)&0xFF)\\
EECON1=0x94\\
CARRY=0if(GIE)CARRY=1GIE=0\\
EECON2=0x55EECON2=0xAAWR=1\\
asm("\\tNOP")\\
if(CARRY)GIE=1
// library function version
extern void flash_erase(unsigned short addr)
#endif // end FLASH_ERASE
/***********************************************************************/
/****** EEPROM memory read/write macros and function definitions *******/
/***********************************************************************/
#if EEPROM_SIZE >0
#ifdef __FLASHTYPE
// macro versions of EEPROM write and read
#define EEPROM_WRITE(addr, value) \\
while(WR)continueEEADR=(addr)EEDATA=(value)\\
EECON1&=0x7FCARRY=0if(GIE)CARRY=1GIE=0\\
WREN=1EECON2=0x55EECON2=0xAAWR=1WREN=0\\
if(CARRY)GIE=1
#define EEPROM_READ(addr) ((EEADR=(addr)),(EECON1&=0x7F),(RD=1),EEDATA)
#else // else doesn\'t write flash
#define EEPROM_WRITE(addr, value) \\
while(WR)continueEEADR=(addr)EEDATA=(value)\\
CARRY=0if(GIE)CARRY=1GIE=0\\
WREN=1EECON2=0x55EECON2=0xAAWR=1WREN=0\\
if(CARRY)GIE=1
#define EEPROM_READ(addr) ((EEADR=(addr)),(RD=1),EEDATA)
#endif
/* library function versions */
extern void eeprom_write(unsigned char addr, unsigned char value)
extern unsigned char eeprom_read(unsigned char addr)
#endif // end EEPROM routines
/****************************************************************/
/****** Global interrupt enable/disable macro definitions *******/
/****************************************************************/
#ifdef _PIC16
#ifndef ei
#define ei() (GLINTD = 0) // interrupt disable bit
#endif ei
#if defined(_17C42)
#ifndef di
#define di() { do { GLINTD = 1} while ( GLINTD == 0 )} // disable interrupt bit
#endif di
#else
#ifndef di
#define di() (GLINTD = 1) // interrupt disable bit
#endif di
#endif
#elif defined _PIC14
#ifndef ei
#define ei() (GIE = 1) // interrupt enable bit
#endif ei
#if defined(_14000) || defined(_16C61) || defined(_16C62) ||\\
defined(_16C63) || defined(_16C63A) || defined(_16C64) ||\\
defined(_16C65) || defined(_16C65B) || defined(_16C71) ||\\
defined(_16C73) || defined(_16C73B) || defined(_16C74) ||\\
defined(_16C74B) || defined(_16C84) || defined(_16C745) ||\\
defined(_16C765) || defined(_16LC74B)
#ifndef di
#define di() { do { GIE = 0} while ( GIE == 1 )} // disable interrupt bit
#endif di
#else
#ifndef di
#define di() (GIE = 0) // interrupt enable bit
#endif di
#endif
#endif
#endif /* _PIC_H */
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)