有用C51编程的高档技巧(C51编程)
一.
void main()
{
}
假如你的程序包括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[4];
pf=&a;
a=34.526;
for(i=0;i<4;i++)
{
*(px+i)=*((char *)pf+i);
}
}
假如已将数存入EEPROM,要将其取出兼并,办法也是相同,可参阅下面的程序。
void CtoF(void)
{
float a;
uchar i,*px
uchar x[4]={56,180,150,73};
void *pf;
px=x;
pf=&a;
for(i=0;i<4;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)
data unsigned char aaa
idata unsigned char aaa
xdata unsigned char aaa
code
五. 强制函数的编译形式
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)
{
return (1 + arg);
}
七. volatile的运用办法及运用条件点
第一种状况涉及到内存映射硬件(memory-mapped hardware,如图形适配器,这类设备对计算机来说就好象是内存的一部分相同);
#define XBYTE[1000]
第二种状况涉及到同享内存(shared memory,即被两个以上一起运转的程序所运用的内存)。
C51中中止调用的变量