實用C51編程的高級技巧(C51編程)
一.
void main()
本文引用地址:http://www.104case.com/article/201611/321499.htm{
}
如果你的程序包含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中中斷調用的變量
評論