📄 at93c46_16.c
字号:
//注意:该程序考虑的是16位数据的情况。
//通过DATASHEET发现,AT93C46的读操作每次只能读、写一个字节或者字。
#include"reg51.h"
#include"intrins.h"
#define uchar unsigned char
#define uint unsigned int
sbit cs_93c46=P3^6; //高电平有效
sbit ck_93c46=P3^7; //上升沿数据输入、输出
sbit di_93c46=P3^4;
sbit do_93c46=P3^5;
uchar code READ_93C46=0x06;
uchar code EWEN_93C46=0x04;
uchar code ERAL_93C46=0x04;
uchar code WRITE_93C46=0x05;
void wr_addr_93c46(uchar addr);
//uchar rd_byte_93c46(uchar addr);
void wr_code_93c46(uchar op_code);
uint rd_93c46(void);
void ewen(void);
void erase_all(void);
void wr_93c46(uint dat);
void delay_1ms(void);
void delay_nms(uint n);
uint buf_word[2]={0,0};
void main(void)
{
uchar i;
cs_93c46=1; //向AT93C46输入起始位和操作码110
di_93c46=0;
do_93c46=0;
_nop_();
//ewen();
/********************************
cs_93c46=1;
wr_code_93c46(WRITE_93C46);
wr_addr_93c46(0x00);
wr_93c46(0xaaaa);
cs_93c46=0;
delay_nms(10); //注意:对AT93C46的写操作,写完所有的数据之后,片选清零,且持续至少10ms
********************************************************************************************/
//erase_all();
//-----------------------------
i=0;
while(i<2)
{
cs_93c46=1;
wr_code_93c46(READ_93C46);
wr_addr_93c46(i);
buf_word[i]=rd_93c46();
cs_93c46=0;//取消片选
i++;
}
//ewen();
//erase_all();
//cs_93c46=0;
_nop_();
}
/**********************
//以下是子函数体
void delay_4us(void)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
************************/
void wr_code_93c46(uchar op_code)
{
uchar i=3;
op_code<<=5;
while(i>0)
{
ck_93c46=0;
if((op_code&0x80)==0)
di_93c46=0;
else
di_93c46=1;
ck_93c46=1;
op_code<<=1;
i--;
}
}
//功能:向AT93C46写入任意存储字节的6位地址
void wr_addr_93c46(uchar addr)
{
uchar i=6;
addr<<=2;
while(i>0)
{
ck_93c46=0;
if((addr&0x80)==0)
di_93c46=0;
else
di_93c46=1;
ck_93c46=1;
addr<<=1;
i--;
}
}
//功能:从AT93C46读出一个字16位的数据,仅仅是读操作。
uint rd_93c46(void)
{
uint temp=0;
uchar i=16;
while(i>0)
{
ck_93c46=0;
temp<<=1;
ck_93c46=1;
_nop_();
if(do_93c46==1)
temp|=0x0001;
i--;
}
return(temp);
}
//功能:从AT93C46读出一个字节的数据,包含了之前的写入起始位、操作码和地址。
/***********************************
uchar rd_byte_93c46(uchar addr)
{
//下面三段程序完成写入起始位和操作码
uchar i;
uchar temp;
cs_93c46=1; //向AT93C46输入起始位和操作码110
ck_93c46=0;
di_93c46=0;
do_93c46=0;
_nop_();
di_93c46=1;
ck_93c46=1;
_nop_();
ck_93c46=0;
di_93c46=1;
ck_93c46=1;
_nop_();
ck_93c46=0;
di_93c46=0;
ck_93c46=1;
_nop_();
addr<<=1;
i=7;
while(i>0)
{
ck_93c46=0;
if((addr&0x80)==0)
di_93c46=0;
else
di_93c46=1;
ck_93c46=1;
_nop_();
addr<<=1;
i--;
}
i=8;
temp=0;
while(i>0)
{
ck_93c46=0;
temp<<=1;
ck_93c46=1;
_nop_();
if(do_93c46==1)
temp|=0x01;
i--;
}
ck_93c46=0;
_nop_();
cs_93c46=0;
return(temp);
}
***********************/
/*****************************************
原型:void wr_93c46(uchar dat)
行参:uchar dat
返回值:无
功能:向AT93c46写入一个字16位的数据,纯粹的写操作。
********************************************/
void wr_93c46(uint dat)
{
uchar i=16;
while(i>0)
{
ck_93c46=0;
if((dat&0x8000)==0)
di_93c46=0;
else
di_93c46=1;
ck_93c46=1;
dat<<=1;
i--;
}
}
/*****************************************
原型:void erase_all(void)
行参:无
返回值:无
功能:擦除AT93C46的所有内容
********************************************/
void erase_all(void)
{
cs_93c46=1;
di_93c46=0;
do_93c46=0;
_nop_();
wr_code_93c46(ERAL_93C46);
wr_addr_93c46(0x20);
cs_93c46=0;
}
/*****************************************
原型:void ewen(void)
行参:无
返回值:无
功能:向AT93C46写入擦写命令,使之可以写入新的内容
注意:该函数包含了完整的开始和结束条件
********************************************/
void ewen(void)
{
cs_93c46=1;
di_93c46=0;
do_93c46=0;
_nop_();
wr_code_93c46(EWEN_93C46);
wr_addr_93c46(0x30);
cs_93c46=0;
}
/************************************************************
原型:void delay_1ms(void)
行参:无
返回值:无
功能:延时大约1ms
************************************************************/
void delay_1ms(void)
{
uchar i;
for(i=125;i>0;i--);
}
/******************************
原型:void delay_nms(uint n)
行参:uint n
返回值:无
功能:延时n ms
*****************************/
void delay_nms(uint n)
{
uchar i;
for(;n>0;n--)
{
for(i=125;i>0;i--)
{
;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -