首先MPLAB-IDE是一个集成开发环境,从微芯公司网站上官网下载的安装包里面,自带的是汇编程序的编译器。
因此要开发C语言程序还需要安装其他的C语言编译器。
配套的C语言编译器为 MPLAB-C18,安装的时候不要轻易改变路径,尤其不能有中文。
对于编译器来说,不会把C语言再生产ASM文件,而是直接编译成为目标代码。
在IDE环境中可以通过调试器来观察程序的运行情况,查看变量和各功能寄存器在程序运行过程中的值,或者让程序分步执行以便于更加清晰地分析程序的流程。
#include<pich>//流水灯实验
#define uchar unsigned char//宏定义
#define uint unsigned int
__CONFIG(0x3B31);//设置配置位
void delay(uint x)//延迟函数x表示毫秒
{
uint a,b;
for(a=x;a>0;a--)
for(b=110;b>0;b--);//嵌套
}
void main()
{
uchar i;//为下面的for循环作一个变量i
TRISD=0x00;//设置全为输出状态
while(1)//因为是流水灯所以是一个死循环,所以要在while里不要加分号
{
PORTD=0X01;//先点亮第一个二极管
for(i=8;i>0;i--)//因为有8个灯作流水灯
{
delay(500);//延迟500ms
PORTD=PORTD<<1;//让RD口左移动一位后再付给回PORTD
}
}
}
/软件仿真功能:打开菜单Debugger--Select Tool--MPLAB SIM进行设置断点再单步仿真
可以打开菜单View--Special Function Registers看PIC全部的I/O口;
也可以打开菜单View--Watch看I/O口和变量;
也可以打开菜单的Debugger--Setting设置晶振的频率后打开Debugger--Stopwatch看每个指今的具体时间和
流水灯的时间,先按Zero清0再单步/
搜索栏里找PICH
你看看是这个不:
#ifndef _PIC_H
#define _PIC_H
#if defined(_10F200) || defined(_10F202) ||\\
defined(_10F204) || defined(_10F206)
#include <pic10f20xh>
#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 <pic125xxh>
#endif
#if defined(_16C432) || defined(_16C433)
#include <43xh>
#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 <5xh>
#endif
#if defined(_16F54) || defined(_16F57)
#include <f5xh>
#endif
#if defined(_12C671) || defined(_12C672) ||\\
defined(_12CE673) || defined(_12CE674)
#include <pic1267xh>
#endif
#if defined(_12F629) || defined(_12F675)
#include <pic12f6xh>
#endif
#if defined(_12F683)
#include <pic12f683h>
#endif
#if defined(_12F675F) || defined(_12F675H) || defined(_12F675K)
#include <pic12rf675h>
#endif
#if defined(_16C505) || defined(_16F505)
#include <505h>
#endif
#ifdef _14000
#include <pic14000h>
#endif
#if defined(_16C554) || defined(_16C556) || defined(_16C557) || \\
defined(_16C558) || defined(_16C554A) || defined(_16C556A) || \\
defined(_16C558A)
#include <55xh>
#endif
#ifdef _16C61
#include <61h>
#endif
#if defined(_16C62) || defined(_16C62A) || defined(_16CR62) ||\\
defined(_16C62B)
#include <62h>
#endif
#if defined(_16C620) || defined(_16C621) || defined(_16C622) ||\\
defined(_16C620A) || defined(_16C621A) || defined(_16C622A) ||\\
defined(_16CE623) || defined(_16CE624) || defined(_16CE625) ||\\
defined(_16CR620A)
#include <62xh>
#endif
#if defined(_16C64) || defined(_16C64A) || defined(_16CR64)
#include <64h>
#endif
#if defined(_16C641) || defined(_16C642) ||\\
defined(_16C661) || defined(_16C662)
#include <6xxh>
#endif
#if defined(_16C65) || defined(_16C65A) || defined(_16CR65)
#include <65h>
#endif
#if defined(_16C66) || defined(_16C67)
#include <6xh>
#endif
#if defined(_16C71) || defined(_16C710) || defined(_16C711)
#include <71xh>
#endif
#if defined(_16C712) || defined(_16C715) || defined(_16C716)
#include <715h>
#endif
#if defined(_16C72) || defined(_16C72A) || defined(_16CR72)
#include <72h>
#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 <74h>
#endif
#if defined(_16C76) || defined(_16C77)
#include <77h>
#endif
#if defined(_16C773) || defined(_16C774) || defined(_16C770) ||\\
defined(_16C771) || defined(_16C717) || defined(_16C745) ||\\
defined(_16C765)
#include <77xh>
#endif
#if defined(_16C781) || defined(_16C782)
#include <78xh>
#endif
#if defined(_16F627) || defined(_16F628)
#include <f6xh>
#endif
#if defined(_16F627A) || defined(_16F628A) || defined(_16F648A)
#include <f62xah>
#endif
#if defined(_16F630) || defined(_16F676)
#include <630h>
#endif
#if defined(_12F635) || defined(_16F636)
#include <f636h>
#endif
#if defined(_16F684)
#include <f684h>
#endif
#if defined(_16F688)
#include <f688h>
#endif
#if defined(_16F83) || defined(_16CR83) || defined(_16C84) || \\
defined(_16F84) || defined(_16F84A) || defined(_16CR84)
#include <84h>
#endif
#if defined(_16F87) || defined(_16F88)
#include <f87h>
#endif
#if defined(_16F873) || defined(_16F874) ||\\
defined(_16F876) || defined(_16F877) ||\\
defined(_16F872) || defined(_16F871) ||\\
defined(_16F870)
#include <87xh>
#endif
#if defined(_16F873A) || defined(_16F874A) ||\\
defined(_16F876A) || defined(_16F877A)
#include <8xah>
#endif
#if defined(_16F72) ||\\
defined(_16F73) || defined(_16F74) ||\\
defined(_16F76) || defined(_16F77)
#include <f7xh>
#endif
#if defined(_16F716)
#include <f716h>
#endif
#if defined(_16F737) || defined(_16F747) ||\\
defined(_16F767) || defined(_16F777)
#include <f7x7h>
#endif
#if defined(_16F818) || defined(_16F819)
#include <f81xh>
#endif
#if defined(_16C923) || defined(_16C924) ||\\
defined(_16C925) || defined(_16C926)
#include <9xxh>
#endif
#if defined(_7C695X)
#include <pic7695xh>
#endif
#if defined(_16C99) || defined (_16C99C)
#include <99h>
#endif
#if defined(_17C42) || defined(_17C42A) || defined(_17CR42) ||\\
defined(_17C43) || defined(_17CR43) || defined(_17C44)
#include <pic174xh>
#endif
#if defined(_17C752) || defined(_17C756) || defined(_17C756A) ||\\
defined(_17C762) || defined(_17C766)
#include <pic177xxh>
#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=0;if(GIE)CARRY=1;GIE=0;\\
EECON2=0x55;EECON2=0xAA;WR=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)continue;EEADR=(addr);EEDATA=(value); \\
EECON1&=0x7F;CARRY=0;if(GIE)CARRY=1;GIE=0; \\
WREN=1;EECON2=0x55;EECON2=0xAA;WR=1;WREN=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)continue;EEADR=(addr);EEDATA=(value); \\
CARRY=0;if(GIE)CARRY=1;GIE=0; \\
WREN=1;EECON2=0x55;EECON2=0xAA;WR=1;WREN=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 /
在开发好
程序
后,准备利用isp2对
芯片
编程然后上板测试或者是已经贴好板子,需要利用isp2对
目标板
进行程序烧写,此时你是否确认你的HEX文件是否可靠呢?是microchip自主的MPLAB
IDE
下生成的呢还是第三方呢?下面的描述,对你有帮助的。
MICROCHIP公司自主开发的MPLAB
IDE是PIC系列芯片唯一的官方IDE,也是最可靠的IDE。只有最终在MPLAB
IDE下产生的HEX,才是最标准,最可靠的HEX,任何第三方环境下产生的HEX,都需要注意烧写技巧。如果在第三方环境下开发生成的HEX,以PICMATE2004为例子,在MPLAB
IDE下,
1),通过CONFIG——SELECT
DEVICE选择芯片型号,
2),从FILE——IMPORT导入2004下产生的HEX文件,
3),通过CONFIG——CONFIG
BITS
选择正确的配置字(如果开发人员在
代码
中配置了某些CONFIG,此步骤可省略)。
请注意:在MPLAB
IDEV760版本以上,CFG设置界面上多了一个Configuration
Bits
Set
in
code的选项。因此用MPLAB
IDE导出HEX文件时请将CFG设置界面上的Configuration
Bits
Set
in
code
前的勾去掉。如下图所示。
4),通过FILE——EXPORT导出,此时保存的HEX包含CONFIG信息。
如果为MPLAB
IDE下开发的HEX,按照步骤1,4执行,得到可靠HEX。
后续烧
写芯片
,只需要按照,
1),选择型号,2),导入含有CONFIG的信息的HEX文件,3),脱机下载烧写。
以上就是关于PIC的开发平台MPLAB中编译C语言会有中间产物ASM文件吗全部的内容,包括:PIC的开发平台MPLAB中编译C语言会有中间产物ASM文件吗、【高分悬赏】PIC单片机16F877接如图所示MPLAB—— ICD演示版 使用MPLAB烧写程序 求一个程序、我用mplab 编写一个pic18f252的c 程序,创建时显示:can't open "pic.h" head file such director等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)