📄 24c01a.c
字号:
#include <reg51.h>
#include <intrins.h>
//#include <stdio.h>
//#include <absacc.h>
#define uchar unsigned char
#define uint unsigned int
#define WriteDeviceAddress 0xa0
#define ReadDviceAddress 0xa1
uchar get_code(uchar i);
void display(uchar i,uchar j,uchar k,uchar l);
void DelayMs(uint number);
void Start(void);
void Stop(void);
void Ack(void);
void NoAck(void);
bit TestAck(void);
void Write8Bit(uchar input);
uchar Read8Bit(void);
void Write24c02(uchar Romadd,uchar number,uchar *Wdata);
void Read24c02(uchar RomAddress, uchar num,uchar *RamAddress);
sbit SCL=P1^6;
sbit SDA=P1^7;
bit bdata NACK=0;//器件坏或错误标志;
uchar idata MTD[8]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07}; //数据发送缓冲区
uchar idata MRD[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //数据接收缓冲区
/***************************************************************************/
main()
{
uchar i;
Write24c02(0x00,8,MTD);
Read24c02(0x00,8,MRD);
for(i=0;i<8;i++)
{
display(MRD[i],MRD[i],MRD[i],MRD[i]);
}
while(1);
}
/*************************************功能:发起始信号*******************************/
/*****************当SCL为高电平时,SDA发生由高到低跳变为开始信号*********************/
void Start()
{SCL=0;
SDA=1;
_nop_();_nop_();_nop_();_nop_();
SCL=1;
_nop_();_nop_();_nop_();_nop_();
SDA=0;
_nop_();_nop_();_nop_();_nop_();
SCL=0;
return;
}
/***************************************************************************/
/*********************************功能:发停止信**********************************/
/****************当SCL为高电平时,SDA发生由低到高跳变为结束信号*******************/
void Stop()
{ SCL=0;
SDA=0;
_nop_();_nop_();_nop_();_nop_();
SCL=1;
_nop_();_nop_();_nop_();_nop_();
SDA=1;//放开总线
_nop_();_nop_();_nop_();_nop_();
return;
}
/***************************************************************************/
/*********************************功能:发响应信号***************************/
void Ack()
{SCL=0;
SDA=0;
_nop_();_nop_();_nop_();_nop_();
SCL=1;
_nop_();_nop_();//_nop_();_nop_();
SCL=0;
_nop_();_nop_();_nop_();_nop_();
return;
}
/***************************************************************************/
/*********************************功能:发非响应信号*************************/
void NoAck()
{
SCL=0;
SDA=1;
_nop_();_nop_();_nop_();_nop_();
SCL=1;
_nop_();_nop_();_nop_();_nop_();
SCL=0;
return;
}
/***************************************************************************/
/*****************************测试响应信号(不完善需改动)**********************************/
bit TestAck()
{
bit ErrorBit;
SCL=0;
SDA=1;
_nop_();_nop_();_nop_();_nop_();
SCL=1;
_nop_();_nop_();_nop_();_nop_();
ErrorBit=SDA;
SCL=0;
SDA=1;
return(ErrorBit);
}
/***************************************************************************/
/*****************************写一字节**********************************/
void Write8Bit(unsigned char input)
{
unsigned char temp;
for(temp=8;temp!=0;temp--)
{
SCL=0;
SDA=(bit)(input&0x80);
_nop_();_nop_();_nop_();_nop_();
SCL=1;
_nop_();_nop_();_nop_();_nop_();
SCL=0;
input=input<<1;
}
}
/***************************************************************************/
/********************************读一字节**********************************/
unsigned char Read8Bit()
{
unsigned char temp,rbyte=0;
SDA=1;
for(temp=8;temp!=0;temp--)
{
SCL=0;
_nop_();_nop_();_nop_();_nop_();
SCL=1;
_nop_();_nop_();_nop_();_nop_();
rbyte=rbyte<<1;
rbyte=rbyte|((unsigned char)(SDA));
SCL=0;
SDA=1;
}
return(rbyte);
}
/***************************************************************************/
/*********************************多字节写操作******************************************/
/*Wdata为待写数据所在的首地址,RomAddress为将存储的存储卡地址,number为将写入的数据个数*/
void Write24c02(uchar RomAdd,uchar number,uchar *Wdata)
{
uchar i;
Start();
Write8Bit(WriteDeviceAddress); //发送从地址
i=TestAck();
if(i==1)
{
NACK=1;
return;
}
Write8Bit(RomAdd); //发送子地址
i=TestAck();
if(i==1)
{
NACK=1;
return;
}
for(;number!=0;number--)
{
Write8Bit(*Wdata);
i=TestAck();
if(i==1)
{
NACK=1;
return;
}
Wdata++;
}
Stop();
DelayMs(10);
}
/**********************************************************************************/
/*********************************多字节读操作***************************************/
/*************RamAddress为待将读出的数据所放的单片机的首地址,RomAddress*************/
/***************为待读数据在存储卡的首地址,number为将读出的数据个数*****************/
void Read24c02(uchar RomAddress,uchar num,uchar *RamAddress)
{
uchar i;
Start();
Write8Bit(WriteDeviceAddress);
i=TestAck();
if(i==1)
{
NACK=1;
return;
}
Write8Bit(RomAddress); //子地址
i=TestAck();
if(i==1)
{
NACK=1;
return;
}
Start();
Write8Bit(ReadDviceAddress);
i=TestAck();
if(i==1)
{
NACK=1;
return;
}
while(num!=1)
{
*RamAddress=Read8Bit();
Ack();
RamAddress++;
num--;
}
*RamAddress=Read8Bit();
NoAck();
Stop();
}
/***************************************************************************/
//-----------------------------------------------------------------
//函数名称:DelayMS()
//功能:实现廷时(number)mS
//-----------------------------------------------------------------
void DelayMs(uint number)
{
unsigned char temp;
for(;number!=0;number--)
{
for(temp=125;temp!=0;temp--)
{ }
}
}
//--------------------------------------------------------------
//函数名称:get_code
//功能:获得对应的共阳极码
//--------------------------------------------------------
uchar get_code(uchar k)
{
unsigned char p;
switch (k){
case 0: p=0x3F; break; /*0*/
case 1: p=0x06; break; /*1*/
case 2: p=0x5B; break; /*2*/
case 3: p=0x4F; break; /*3*/
case 4: p=0x66; break; /*4*/
case 5: p=0x6D; break; /*5*/
case 6: p=0x7D; break; /*6*/
case 7: p=0x07; break; /*7*/
case 8: p=0x7F; break; /*8*/
case 9: p=0x67; break; /*9*/
case 10: p=0x77; break; /*A*/
case 11: p=0x7C; break; /*B*/
case 12: p=0x39; break; /*C*/
case 13: p=0x5E; break; /*D*/
case 14: p=0x79; break; /*E*/
case 15: p=0x71; break; /*F*/
case 16: p=0x00; break; /*灭灯*/
default: break;}
return (p);
}
//-----------------------------------------------------------
//函数名称:display
//功能:动态数码显示
//-----------------------------------------------------------
void display(uchar i,uchar j,uchar k,uchar l)
{ uchar ii;
for(ii=0;ii<250;ii++)
{
P0=get_code(i);
P2=0x8F;
DelayMs(2);
P0=get_code(j);
P2=0x4F;
DelayMs(2);
P0=get_code(k);
P2=0x2F;
DelayMs(2);
P0=get_code(l);
P2=0x1F;
DelayMs(2);
}
P2=0x0F;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -