一、C51热启动代码的编制
void main() { char data *HotPoint=(char *)0x7f; if((*HotPoint==0xaa)&&(*(--HotPoint)==0xaa)) { /*热启动的处理 */ } else { HotPoint=0x7e; /*冷启动的处进 *HotPoint=0xaa; *(++HotPoint)=0xaa; } /*正常工作代码*/ }
如果你的程序包含startup.a51,则需要对startup.a51进行修改。对于startup.a51的修改,根据自已的需要进行,如将IDATALEN EQU 80H中的80H改为70H,就可以使6F到7F的16字节内存不被清零。
二、直接调用EPROM中已固化的程序
void main(void) { void (*DispBuffer)(); /*定义指向函数指针*/ DispBuffer=0xde00; /*赋值*/ for(;;) { Key(); DispBuffer(); } }
原理:利用指向函数的指针来实现的 (*指针变量名)();
三、将浮点数转化为字符数组
#define uchar unsigned char #define uint unsigned int void FtoC(void) { float a; uchar i,*px uchar x[]; /*定义字符数组,准备存储浮点数的四个字节*、 void *pf; px=x; /*px指针指向数组x*/ pf=&a; /*void 型指针指向浮点数首地址*/ a=34.526; ;i<;i++) { *(px+i)=*((char *)pf+i); /*强制void 型指针转成char型,因为void型指针不能运算*/ } }
如果已将数存入EEPROM,要将其取出合并,方法也是一样,可参考下面的程序。
void CtoF(void) { float a; uchar i,*px uchar x[]={,,,}; void *pf; px=x; pf=&a; ;i<;i++) { *((char *)pf+i)=*(px+i); } }
四、绝对存储器访问
(1)绝对存储器访问宏
#define CBYTE ((unsigned char volatile code *)0) #define DBYTE ((unsigned char volatile data *)0) #define XBYTE ((unsigned char volatile xdata *)0) #define IBYTE ((unsigned char volatile idata *)0) #define PBYTE ((unsigned char volatile pdata *)0)
(2)连接器位置控制
KeilC编译设置中,有定义
(3)关键字_at_
data unsigned char aaa _at_ 0x40; idata unsigned char aaa _at_ 0x40; xdata unsigned char aaa _at_ 0x40; code unsigned char aaa _at_ 0x40;
五、强制函数的编译模式
void GetDataLen()small; void GetDataLen()small { ………………. }
六、C程序与汇编的接口
1.第1种情况:直接嵌入汇编
#pragma asm ... #paragma endasm
2.第2种情况:文件间调用
通过寄存器传递参数,通过固定存储区传递参数。
3.第3种情况:由C生成汇编接口
#pragma SRC #pragma SMALL unsigned int asmfunc1 ( unsigned int arg) { + arg); }
七、volatile的使用方法及使用条件点
第一种情况涉及到内存映射硬件(memory-mapped hardware,如图形适配器,这类设备对计算机来说就好象是内存的一部分一样);
#define XBYTE[1000] PORTADD //硬件口地址定义
第二种情况涉及到共享内存(shared memory,即被两个以上同时运行的程序所使用的内存)。