📄 at93c46.h
字号:
/*******************************************************************************
* 标题: at93c46头文件 *
* 日期: 2007-4-1 *
* 版本: 1.0 *
* 作者: 无名 *
* 邮箱: djrljf@163.com *
* QQ : 403499014 *
********************************************************************************
********************************************************************************
* 【版权】 Copyright(C)无名 All Rights Reserved *
* 【声明】 此程序仅用于学习与参考,引用请注明版权和作者信息! *
*******************************************************************************/
#ifndef _at93c46_H // 防止at93c46.h被重复引用
#define _at93c46_H
#include "at89x52.h"
#define uchar unsigned char
#define uint unsigned int
//默认设置,使用时根据实际布线修改DIN CLK LOAD
#define CS P3_3
#define SK P3_4
#define DI P3_5
#define DO P3_6
//操作数设置
#define READ 0x02
#define WRITE 0x01
#define ERASE 0x03
#define OTHER 0x00
#define EWEN 0xc0
#define EWDS 0x00
#define ERAL 0x80
#define WRAL 0x40
//测试写动作完成
void test()
{CS=0;CS=1;
DO=0;
while(~DO);
while(DO);
CS=0;
}
//写开始位,操作数,地址(特殊字)
void head(uchar buf,uchar addr)
{
uchar i=0;
CS=1;SK=0;DI=0;
DI=1;SK=1;SK=0; //起始位
if(buf&&0x02==0x02)DI=1;
else DI=0;
SK=1;SK=0;
if(buf&&0x01==0x01)DI=1;
else DI=0;
SK=1;SK=0; //"写"操作码
for(i=0;i<8;i++)
{
if((addr&0x80)==0x80)DI=1; //写1
else DI=0; //写0
SK=1;SK=0; //些
addr=(addr<<1); //从高位开始写地址
}
}
//===================================================
//读指定地址内数据
//===================================================
uchar readBit(uchar addr)
{
uchar i=0,temp=0;
head(READ,addr);
for(i=0;i<8;i++) //读8为数据
{
SK=0;SK=1;
temp=(temp|DO);
temp=temp<<1; //从高位到低位
}
CS=0;CS=1; //结束标记
return temp; //返回结果
}
//===================================================
//从指定地址开始连续读N个字节返回到指定数组(93C46不支持此功能)
//===================================================
void readMulti(uchar addr,uchar no,uchar *word)
{
uchar i=0,j=0,temp;
head(READ,addr);
for(j=0;j<no;j++) //连续读NO个数据
{
for(i=0;i<8;i++) //读8为数据
{
SK=0;SK=1;
temp=(temp|DO);
temp=temp<<1;
}
*(word+j)=temp; //返回一个数据
}
CS=0;CS=1; //结束标记
}
//===================================================
//写数据到指定地址
//===================================================
void write(uchar addr,uchar dat)
{
uchar i=0;
head(WRITE,addr);
for(i=0;i<8;i++)
{
if((dat&0x80)==0x80)DI=1;
else DI=0;
SK=1;SK=0;
dat=(dat<<1); //从高位开始写地址
}
test();
}
//===================================================
//擦除指定地址内数据(填充1)
//===================================================
void erase(uchar addr)
{
uchar i=0;
head(ERASE,addr);
for(i=0;i<10;i++);
test();
}
//===================================================
//写允许设置
//===================================================
void ewen()
{
head(OTHER,EWEN);
CS=0;
}
//===================================================
//写禁止设置
//===================================================
void ewds()
{
head(OTHER,EWDS);
CS=0;
}
//===================================================
//擦除全部数据
//===================================================
void eral()
{
head(OTHER,ERAL);
test();
}
//===================================================
//写数据到所有空间
//===================================================
void wral(uchar dat)
{
uchar i=0;
head(OTHER,WRAL);
for(i=0;i<8;i++)
{
if((dat&0x80)==0x80)DI=1;
else DI=0;
SK=1;SK=0;
dat=(dat<<1); //从高位开始写地址
}
test();
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -