📄 24lc512.c
字号:
#include <msp430x14x.h>
#include "24LC512.h"
#define unchar unsigned char
#define unint unsigned int
#define unlong unsigned long
#define MEMDIR P2DIR
#define MEMSEL P2SEL
#define MEMOUT P2OUT
#define MEMIN P2IN
#define SCL0 MEMOUT &= ~BIT3 // CLK 复位
#define SCL1 MEMOUT |= BIT3 // CLK 置位
#define SDA0 MEMOUT &= ~BIT4 // DATA 复位
#define SDA1 MEMOUT |= BIT4 // DATA 置位
/*************************************/
// 延时
void delay_memory()
{
unchar q0 ;
for(q0=0;q0<20;q0++)
{
_NOP() ;
}
}
/***********************************/
// 开始
void start(void)
{
MEMDIR |= BIT4 ;
SDA1 ;
delay_memory() ;
SCL1 ;
delay_memory() ;
SDA0 ;
delay_memory() ;
SCL0 ;
delay_memory() ;
}
/**********************************/
// 停止
void stop(void)
{
MEMDIR |= BIT4 ;
SCL0 ;
delay_memory() ;
SDA0 ;
delay_memory() ;
SCL1 ;
delay_memory() ;
SDA1 ;
delay_memory() ;
}
/**********************************/
//
void ack()
{
MEMDIR |= BIT4 ;
SDA0 ;
delay_memory() ;
SCL1 ;
delay_memory() ;
SCL0 ;
delay_memory() ;
SDA1 ;
}
/*************************************/
//
void noack()
{
MEMDIR |= BIT4 ;
SDA1 ;
delay_memory() ;
SCL1 ;
delay_memory() ;
SCL0 ;
delay_memory() ;
}
/************************************/
//
unchar testack()
{
unchar ack ;
SCL1 ;
delay_memory() ;
MEMDIR &= ~BIT4 ;
delay_memory() ;
ack = (MEMIN * BIT4) ;
delay_memory() ;
SCL0 ;
delay_memory() ;
return (ack) ;
}
/*********************************/
//
void write8bit(unchar input)
{
unchar temp , q0 ;
MEMDIR |= BIT4 ;
for(temp = 8 ;temp > 0 ; temp--)
{
q0 = input & 0x80 ;
if(q0 == 0x80)
SDA1 ;
else
SDA0 ;
delay_memory() ;
SCL1 ;
delay_memory() ;
SCL0 ;
delay_memory() ;
input = input<<1 ;
}
}
/*************************************/
//
unchar read8bit()
{
unchar temp ,q0 ,rbyte = 0 ;
MEMDIR &= ~BIT4 ;
for(temp=8 ;temp>0 ;temp--)
{
SCL1 ;
delay_memory() ;
rbyte = rbyte<<1 ;
MEMDIR &= ~BIT4 ;
q0 = (MEMIN & BIT4) ;
if(q0 == BIT4)
rbyte = rbyte|0x1 ;
delay_memory() ;
SCL0 ;
delay_memory() ;
}
return (rbyte) ;
}
/***********************************/
//
void initmemory(void)
{
//设定存储器的地址为 100 ,写保护无效
// P2SEL &= 0X07 ; // P2口的 0 ~ 5 引脚为端口功能
//MEMDIR |= BIT0 + BIT1 + BIT2 ; // P2口的 0 ~ 2 引脚为输出方向
// MEMOUT &= ~BIT0 ; //
// MEMOUT &= ~BIT1 ; //
// MEMOUT &= ~BIT2 ; // P2口的 0 ~ 1 引脚 置为 0 确定 24LC512 的地址为 100
// P2口的 2 引脚置为 0 ,关闭写保护端口
MEMDIR |= BIT3 ; // P2 口的 4 脚 恒定为输出模数
}
/***********************************/
//
unchar write(unint add ,unchar *data,unchar nbyte)
{
unchar addlow ;
unchar addhigh ;
addlow = add ;
add=add>>0x08 ;
addhigh = add ;
start() ;
write8bit(0xa0) ;
if(testack()==1)
return 1 ;
write8bit(addhigh) ;
if(testack()==1)
return 1;
write8bit(addlow) ;
if(testack()==1)
return 1;
for(; nbyte > 0 ; nbyte--)
{
write8bit(*data) ;
if(testack()==1)
return 1 ;
data++ ;
}
stop() ;
delay_memory() ;
return 0 ;
}
/***************************************/
//
unchar read(unchar *data ,unint add )
{
unchar addlow ;
unchar addhigh ;
addlow = add ;
add=add >> 8 ;
addhigh = add ;
start() ;
write8bit(0xa0) ;
if(testack()==1)
return 1 ;
write8bit(addhigh) ;
if(testack()==1)
return 1 ;
write8bit(addlow) ;
if(testack()==1)
return 1 ;
start() ;
write8bit(0xa1) ;
if(testack()==1)
return 1 ;
*data = read8bit() ;
noack() ;
stop() ;
return 0 ;
}
/*******************************************************/
//
unchar readseq(unchar *data,unint add, unchar nbyte)
{
unchar addlow ;
unchar addhigh ;
addlow = add ;
add=add >> 0x08 ;
addhigh = add ;
start() ;
write8bit(0xa0) ;
if(testack()==1)
return 1 ;
write8bit(addhigh) ;
if(testack()==1)
return 1 ;
write8bit(addlow) ;
if(testack()==1)
return 1 ;
start() ;
write8bit(0xa1) ;
if(testack()==1)
return 1 ;
while(nbyte != 1)
{
*data = read8bit() ;
ack() ;
data++ ;
nbyte-- ;
}
*data = read8bit() ;
noack() ;
stop() ;
return 0 ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -