1 准备好需要反汇编的代码文件.hex ; 2 File --> Import-->Hex File ; 3 按下图填好;
4 点击Finish;
5 选择Production-->Set Configuration Bits后,就会弹出下图;然后在红色圈处就可以选择Program Memory
6 在下图红色圈处选择Code后即出现Disassembly Code
二 程序 1 最初的程序: #include<pic.h> 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),但是从示波器上观察到的结果来看,这样是可行的。
|