英锐恩单片机论坛,Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流

标题: 如何从汇编转向PICC [打印本页]

作者: winnie    时间: 2009-3-23 09:42
标题: 如何从汇编转向PICC
因为HIDE-TECH PICC破解版很多,所以HIDE PICC有比其它PICC有更多的用户,虽然它的编译效率不是最好。最好的是CCS,但没破戒版。。。,不过用HIDE PICC精心安排函数一样可以获得很高的编译效率,还是人脑是第一的。
当然要求你要有C语言的基础。PICC不支持C++,这对于习惯了C++的朋友还得翻翻C语言的书。
C代码的头文件一定要有
#include<pic.h>它是很多头文件的集合,C编译器在pic.h中根据你的芯片自动栽入相应的其它头文件。
这点比汇编好用。
载入的头文件中其实是声明芯片的寄存器和一些函数。
顺便摘抄一个片段:
static volatile unsigned char TMR0 @ 0x01;
static volatile unsigned char PCL @ 0x02;
static volatile unsigned char STATUS @ 0x03;
可以看出和汇编的头文件中定义寄存器是差不多的。如下:
TMR0 EQU 0X01;
PCL  EQU 0X02;
STATUS EQU 0X03;
都是把无聊的地址定义为大家公认的名字。
一:怎么附值?
如对TMR0附值:
汇编中:MOVLW 200;
MOVWF TMR0;当然得保证当前页面在0,不然会出错。

C语言:TMR0=200;//无论在任何页面都不会出错。
可以看出来C是很直接了当的。并且最大好处是操作一个寄存器时候,不用考虑页面的问题。一切由C自动完成。
二:怎么位操作?
汇编中的位操作是很容易的。在C中更简单。
C的头文件中已经对所有可能需要位操作的寄存器的每一位都有定义名称:
如:PORTA的每一个I/O口定义为:RA0、RA1、RA2。。。RA7。
OPTION的每一位定义为:PS0、PS1、PS2 、PSA 、T0SE、T0CS、INTEDG 、RBPU。
可以对其直接进行运算和附值。
如:
RA0=0;
RA2=1;
在汇编中是:
BCF PORTA,0;
BSF PORTA,2;
可以看出2者是大同小异的,只是C中不需要考虑页面的问题。
三:内存分配问题:
在汇编中定义一个内存是一件很小心的问题,要考虑太多的问题,稍微不注意就会出错。比如16位的运算等。用C就不需要考虑太多。
下面给个例子:
16位的除法(C代码):
INT X=5000;
INT Y=1000;
INT Z=X/Y;
而在汇编中则需要花太多精力。
给一个小的C代码,用RA0控制一个LED闪烁:
#include<pic.h>void main(){
                       int x;  
                       CMCON=0B111;   file://关掉A口比较器,要是有比较器功能的话。
                        ADCON1=0B110;          file://关掉A/D功能,要是有A/D功能的话。
                          TRISA=0;              file://A口全为输出。
                         loop:RA0=!RA0;           
                          for(x=60000;--x;){;}           file://延
                        goto loop;
}
说说RA0=!RA0的意思:PIC对PORT寄存器操作都是先读取----修改----写入。
上句的含义是程序先读RA0,然后取反,最后把运算后的值重新写入RA0,这就实现了闪烁的功能。




欢迎光临 英锐恩单片机论坛,Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流 (http://enroobbs.com/) Powered by Discuz! X3.2