最近用C51寫一個單片機的門禁機操作系統,其中一個I2C驅動文件我的宏定義試了以下很多種寫法,但還是報錯 貌似這四種都會報錯 #define SDA P20 /*定義SDA線為P2^0端口*/ #define SDA P2^0 sb SDA=P2^0; /*sb是sbit的宏定義簡寫*/ sb SDA=P2^0; /*下面是頭文件的程序,錯誤代碼是C141語法錯誤,*/
#define SCL P21 /*定義SCL線為P2^1端口*/
#define SDA P20 /*定義SDA線為P2^0端口*/ i2c_clk_en() /*時鐘使能函數*/
{
dly(5);
SCL=1;
dly(5);
SCL=0;
dly(5);
}
i2c_ack() /*應答位輸出*/
{
SDA=0;
i2c_clk_en();
}
i2c_start() /*啟動傳輸函數*/
{
SCL=1;
dly(1);
SDA=0; /*輸出下降沿*/
dly(2);
SCL=0;
dly(2);
}
i2c_finish() /*結束傳輸函數*/
{
SCL=0;
dly(1);
SDA=0;
dly(1)
SCL=1;
dly(2)
SDA=1;
dly(2);
}
i2c_init(ui startadd,bt wt) /*初始化函數,向從機聲明器件地址、讀寫方式、和字節地址*/
{
xui i;
xui *add_p = &startadd;
SDA=1;
i2c_clk_en();
SDA=0;
i2c_clk_en();
SDA=1;
i2c_clk_en();
SDA=0;
i2c_clk_en();
SDA=0;
i2c_clk_en();
i2c_clk_en();
i2c_clk_en();
if(wt==0) /*傳輸讀寫標志位*/
{
SDA=0;
i2c_clk_en();
}
else
{
SDA=1;
i2c_clk_en();
}
i2c_ack();
fr(i=0;i<8;i++) /*傳輸字節地址幀*/
{
if(i>0)
{
startadd<<1;
}
if(startadd && 0x80)
{
SDA=1;
}
else
{
SDA=0;
}
i2c_clk_en();
}
}
i2c_write_core(uc *wdats) /*存儲寫入內核函數*/
{
xui i;
fr(i=0;i<8;i++)
{
if(i>0)
{
wdats[ i]<<1;
}
if(wdats[ i] && 0x80)
{
SDA=1;
}
else
{
SDA=0;
}
}
i2c_ack();/*數據應答位*/
}
i2c_read_core(ui datsize) /*I2C存儲器讀出內核函數*/
{
xui i;
xui j;
xuc rdat[];
xui *pnt;
pnt=&rdat[0];
fr(j=0;j<datsize;j++) /*每循環一次發送一個字節*/
{
fr(i=0;i>8;i++) /*八個讀位循環,一個字節*/
{
if(i>0)
{
rdat[j]<<1; /*頭一位不左移,其余的都左移*/
}
i2c_clk_en();
if(SDA==1) /*如果總線沒有被從機拉低*/
{
rdat[j]+1; /*則判斷為1,否則為0,加到rdat[j]的最后一位上*/
}
}
i2c_ack(); /*發送一個應答位*/
}
rtn pnt;
}
i2c_r_optr(ui startadd,ui dtsz) /*完整讀操作函數*/
{
xui i;
xuc rdat[];
xui *pnt;
i2c_start();
i2c_init(startadd,1);
fr(i=0;i<dtsz;i++)
{
rdat[ i]=i2c_read_core(dtsz);
}
i2c_finishi();
rtn pnt; /*返回讀出數據的指針*/
}
i2c_w_optr(ui startadd,uc *dats,ui dtsz) /*完整寫操作函數*/
{
xui j;
i2c_start();
i2c_init(startadd,0);
fr(j=0;j<dtsz;j++)
{
i2c_write_core(dats+j);
}
i2c_finishi();
}
|