?? write2401a.c
字號:
#include "reg51.h"
#include "Write2401A.h"
#include "intrins.h"
main()
{
// uchar i;
init();
// Write_Add = 0x35;
// Write_Data = 0x66;
for(;;)
{
if(Card_In == True)
{
Card_Insert_Flag = True;
}
else
Card_Insert_Flag = False;
if(Card_Insert_Flag == True)
{
Write_Add = R_Buffer[0];
Write_Data = R_Buffer[1];
if(Card_Write_Flag == True)
{
NOP();
NOP();
Card_Power_Control = True;
Card_Power_LED = ON;
Open_At24c01A();
NOP();
Start_I2C();
SendByte(Write_At24c01A);
if(ack == 1)
{
SendByte(Write_Add);
if(ack == 1)
{
SendByte(Write_Data);
if(ack == 1)
{
Send();
Card_Write_Flag = False;
Stop_I2C();
Close_At24c01A();
}
}
}
}
else NOP();
}
else
{
Card_Power_Control = False;
Card_Power_LED = OFF;
}
}
}
/*--------------------------------
啟動卡函數
函數原型:Open_At24c01A()
功能:啟動ic卡片
---------------------------------*/
void Open_At24c01A()
{
NOP();
SCL=0;
NOP();
RST=0;
NOP();
RST=1;
NOP();
SDA=1;
NOP();
SCL=1;
NOP();
SCL=0;
NOP();
RST=0;
}
/*--------------------------------
關閉卡函數
函數原型:Close_At24c01A()
功能:關閉ic卡片
---------------------------------*/
void Close_At24c01A()
{
SDA=0;
NOP();
SCL=0;
NOP();
RST=0;
NOP();
}
/*--------------------------------
延時
函數原型:Nop();
功能:延時
---------------------------------*/
void NOP()
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
/*---------------------------------
啟動總線函數
函數原型:Start_I2C()
功能:啟動I2C總線,即發送起始條件
---------------------------------*/
void Start_I2C()
{
SDA = 1; //發送起始條件數據信號
_nop_();
SCL = 1;
_nop_(); //起始建立時間大于4.7us
_nop_();
_nop_();
_nop_();
_nop_();
SDA = 0; //發送起始信號
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCL = 0; //鉗位
_nop_();
_nop_();
}
/*-------------------------------
結束總線函數
函數原型:Stop_I2C()
功能:結束I2C總線,即發送I2C結束條件
-------------------------------*/
void Stop_I2C()
{
SDA = 0; //發送結束條件的數據信號
_nop_(); //發送結束條件的時鐘信號
SCL = 1; //結束條件建立時間大于4us
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SDA = 1; //發送I2C總線結束命令
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
/*------------------------------
字節數據傳送函數
函數原型:SendByte(uchar c)
功能:將數據C發送出去,可以是地址,
也可以是數據,發送完成之后等待應答
并且對應答狀態位進行操作,不應答和非
應答都使得ACK=0,發送數據正常則ACK=1
--------------------------------*/
void SendByte(uchar c)
{
uchar BitCnt;
for(BitCnt = 0;BitCnt < 8;BitCnt++) //一個字節
{
if((c << BitCnt)& 0x80) SDA = 1; //判斷發送位
else SDA = 0;
_nop_();
SCL = 1; //時鐘線為高,通知被控器開始接受數據
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCL = 0;
}
_nop_();
_nop_();
SDA = 1; //釋放數據線,準備接受應答位
_nop_();
_nop_();
SCL = 1;
_nop_();
_nop_();
_nop_();
if(SDA == 1) ack =0;
else ack = 1; //判斷是否收到應答信號
SCL = 0;
_nop_();
_nop_();
}
void init()
{
TMOD=0x20;
TL1=0xFd;
TH1=0xFd;
SCON=0x50;
PCON=0x00;
EA = 1;
ES = 1;
TR1=1;
P1_5 = OFF;
P1_6 = OFF;
P1_7 = OFF;
RST = OFF;
Card_In = 1;
Card_Insert_Flag = False;
Card_Power_Control = False;
Card_Power_LED = OFF;
Card_Write_Flag = False;
R_Counter = 0;
}
void R_Serial() interrupt 4 using 1
{
if( RI == 1)
{
uchar R_Temp;
RI = 0;
R_Temp = SBUF;
if(R_Counter==0)
{
if( R_Temp== 0xFF)
{
R_Counter=0;
}
else return;
}
else
{
R_Buffer[R_Counter -1] = R_Temp;
if( R_Counter == 2)
{
R_Counter=0;
Card_Write_Flag = True;
return;
}
}
R_Counter++;
}
}
void Send()
{
SBUF = Write_Add;
do{}
while(TI == 0);
TI = 0;
SBUF = Write_Data;
do{}
while(TI == 0);
TI = 0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -