步骤:
1 准备好需要反汇编的代码文件.hex ;
2 File --> Import-->Hex File ;
3 按下图填好;
4 点击Finish;
5 选择Production-->Set Configuration Bits后,就会弹出下图;然后在红 {MOD}圈处就可以选择Program Memory
6 在下图红 {MOD}圈处选择Code后即出现Disassembly Code
二 程序
1 最初的程序:
#include
void delay(long i);
void main(void)
{
__CONFIG(OSC_IntRC&WDT_OFF&CP_OFF&MCLRE_ON);
OPTION = 0x40; //关闭内部上拉
TRIS = 00001001; //GPIO1、GPIO2输出;GPIO0、 GPIO3输入;高四位不可修改,默认为0
OSCCAL = 0x00; // 内部时钟校正参数
GP2 = 1;
GP1 = 0;
delay(25000); //延时800ms
GP1 = 1;
delay(2500);//延时ms
GP2 =0;
//while((GP1==1)&&(GP2==0)) //保持
while(1)
{
GP1=1;
GP2=0;
}
}
void delay(long i)
{
while(i)
i--;
}
需注意:
1 delay函数中的i不要设为int型,因为int的最大值为32767,如果你延时很长的话会超过32767的,程序就会出问题;
2 如果开了看门狗(WDT),就要记得喂狗即CLRWDT;我最开始的程序开了WDT,但是并没有CLRWDT。就导致GP2在输出时总是输出方波,跟我要的不一样。
三 问题:
1 为什么这段C代码用MPLAB转成汇编之后最后一行不是:
256 FF C14 MOVLW 0x14
而是:
256 FF FFF XORLW 0xFF
用HI TECH PICC v9.82和XC8编译出来的结果都是这样的。
2 为什么单测这个芯片,在掉电时GP1 GP2 的电平会翻转?上电后在很短时间内就掉电不会翻转,但是上电后过一段时间再掉电,二者的电平就会翻转
四 程序结论:
1 时钟校正参数是必须要写的,否则GP2一直输出方波,GP1一直是高电平;
2 若用C语言来写,则OSCCAL = 0x00;这句写在程序开头都可以。虽然译成汇编之后最后一行不是Cxx(MOVLW 0x xx),但是从示波器上观察到的结果来看,这样是可行的。