|
<B>对24c16卡读写操作===源程序(清风徐徐)</B></P>
//=======================================
//功能:对24c16卡读写操作
//改写:清风徐徐(改自[永远不开的壶]程序)
//时间:2004.5.17
//qq: 78779514
//更多源代码:http://www.qfmcu.com
//======================================
#include <reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
unsigned char a[]="0123456789";
/*---------------------------------------------
读写24C16标准程序段
完成日期:03/7/9
作者:reed
-------------------------------------------*/
//#include"main.h"
sbit SDA=P1^1;
sbit SCL=P1^0;
/*-----------------------------------------------
调用方式:void start_bit(void)
函数说明:开始位
-----------------------------------------------*/
void start_bit(void)
{
SCL=1;_nop_();
SDA=1;_nop_();
SDA=0;_nop_();
SCL=0;_nop_();
}
/*-----------------------------------------------
调用方式:void stop_bit(void)
函数说明:停止位
-----------------------------------------------*/
void stop_bit(void)
{
SDA=0;_nop_();
SCL=1;_nop_();
SDA=1;_nop_();
}
/*-----------------------------------------------
调用方式:void mast_ack(void)
函数说明:主答函数
-----------------------------------------------*/
void mast_ack(void)
{
SCL=0;_nop_();
SDA=0;_nop_();
SCL=1;_nop_();
SCL=0;_nop_();
SDA=1;_nop_();
}
/*-----------------------------------------------
调用方式:void ack(void)
函数说明:应答函数
-----------------------------------------------*/
void ack(void)
{
SDA=1;
SCL=0;_nop_();
SCL=1;_nop_();
while(SDA){;}
SCL=0;_nop_();
}
/*-----------------------------------------------
调用方式:void no_ack(void)
函数说明:无需应答位,在读程序中用到
-----------------------------------------------*/
void no_ack(void)
{
SDA=1;_nop_();
SCL=1;_nop_();
while(SDA){;}
SCL=0;_nop_();
}
/*-----------------------------------------------
调用方式:write_8bit(uchar ch)
函数说明:写一个字节(8位)数据
-----------------------------------------------*/
write_8bit(uchar ch)
{
uchar i=8;
SCL=0;_nop_();
while(i--)
{
SDA=(bit)(ch&0x80);_nop_();
ch<<=1;
SCL=1;_nop_();
SCL=0;_nop_();
}
}
/*----------------------------------------------
调用方式:uchar read24c16(uint address)
函数说明:读24c16指定地址数据(字节读)
-----------------------------------------------*/
uchar read24c16(uint address)
{
uchar data rdata;
uchar i=8;
EA=0;//避免与串口通讯等中断冲突
start_bit();
write_8bit(0xA0);
ack();
write_8bit(address);
ack();//伪写
start_bit();
write_8bit(0xA1);
ack();
while(i--)
{
rdata<<=1;
SCL=0;_nop_(); SCL=1;
if(SDA) rdata|=0x01;
}
no_ack();
stop_bit();
EA=1;
return rdata;
}
/*-----------------------------------------------
调用方式:void write24c16(uint address,uchar ddata)
函数说明:写数据到24c16的指定地址(字节写)
-----------------------------------------------*/
void write24c16(uint address,uchar ddata)
{
EA=0; //避免与串口通讯等中断冲突
start_bit();
write_8bit(0xA0);
ack();
write_8bit(address);
ack();
write_8bit(ddata);
ack();
stop_bit();
EA=1;
}
/*-----------------------------------------------
调用方式:void page_wr(uint firstw_ad,uint counter,uint data *firstr_ad)
函数说明:页面写函数,firstw_ad为写入字节单元的首地址,
*firstr-ad为被写入数据所在首地址指针
counter为写入数据字节数
-----------------------------------------------*/
void page_wr(uint firstw_ad,uint counter,uchar firstr_ad)
{
uchar data *ufirstr_ad;
ufirstr_ad=firstr_ad;
start_bit();
write_8bit(0xA2);
ack();
write_8bit(firstw_ad);
ack();
while(counter--)
{
write_8bit(*ufirstr_ad);
ufirstr_ad++;
ack();
}
stop_bit();
}
/*-----------------------------------------------
调用方式:void page_rd(uint firstrd_ad,uint count,uint firstwr_ad)
函数说明:页面读函数,firstrd-ad为所读字节首地址,count为读字节数
*ufirstwr-ad为读出数据存储首地址指针
-----------------------------------------------*/
void page_rd(uint firstrd_ad,uint count,uchar firstwr_ad)
{
uchar j=8;
uchar data *ufirstwr_ad;
ufirstwr_ad=firstwr_ad;
start_bit();
write_8bit(0xA2);
ack();
write_8bit(firstrd_ad);
ack();
start_bit();
write_8bit(0xA3);
ack();
while(count--)
{
uchar i=8;
while(i--)
{
(*ufirstwr_ad)<<=1;
SCL=0;_nop_();_nop_();SCL=1;
if(SDA) (*ufirstwr_ad)|=0x01;
}
ufirstwr_ad++;
mast_ack();
}
while(j--)
{
(*ufirstwr_ad)<<=1;
SCL=0;_nop_();_nop_();SCL=1;
if(SDA) (*ufirstwr_ad)|=0x01;
}
no_ack();
stop_bit();
}
void main(void)
{
while(1)
{
page_wr(1,10,a);
}
}
|
|