📄 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 + -