html 93c,93c46读写程序

这是一个实现93C46存储器读写操作的C语言程序,包括Ewen(写使能)、Ewds(写禁用)、Read(读取数据)、Write(写入数据)等关键函数。程序详细定义了地址和数据的传输过程,适用于嵌入式系统中的数据存储和读取。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

93c46读写程序

“93c46读写程序”

#include 

sbit CS=P2^7;

sbit SK=P2^6;

sbit DI=P2^5;

sbit DO=P2^4;

/*

extern unsigned char ReadChar(unsigned char address);

extern void WriteChar(unsigned char address,unsigned char InData);

extern void ReadString(unsigned char data *RamAddress,unsigned char RomAddress,

unsigned char Number);

extern void WriteString(unsigned char data *RamAddress,unsigned char RomAddress,unsigned char Number);

*/

// Write enable must precede all programming modes.

void Ewen(void) {

unsigned char temp,InData;

CS=0;

SK=0;

CS=1;

InData=0x98; // 10011XXXX

for(temp=9;temp!=0;temp--) { // 9

DI=InData&0x80;

SK=1; SK=0;

InData<<=1;

}

CS=0;

}

// Disables all programming instrucTIons.

void Ewds(void) {

unsigned char temp,InData;

CS=0;

SK=0;

CS=1;

InData=0x80; // 10000XXXX

for(temp=9;temp!=0;temp--) { // 9

DI=InData&0x80;

SK=1; SK=0;

InData<<=1;

}

CS=0;

}

// Reads data stored in memory, at specified address.

unsigned int Read(unsigned char address) {

unsigned char temp;

unsigned int result;

Ewen();

SK=0; DI=1; // 110 A5-A0

CS=0; CS=1;

SK=1; SK=0;   // 1

address=address&0x3f 0x80;

for(temp=8;temp!=0;temp--) { // 8

DI=address&0x80;

SK=1; SK=0;

address<<=1;

}

DO=1;

for(temp=16;temp!=0;temp--) { // 16

SK=1;

result=(result<<1) DO;

SK=0;

}

CS=0;

Ewds();

return(result);

}

// Writes memory locaTIon An - A0.

void Write(unsigned char address,unsigned int InData) {

unsigned char temp;

Ewen();

SK=0; DI=1; // 101 A5-A0

CS=0; CS=1;

SK=1; SK=0;   // 1

address=address&0x3f 0x40;

for(temp=8;temp!=0;temp--) { // 8

DI=address&0x80;

SK=1; SK=0;

address<<=1;

}

for(temp=16;temp!=0;temp--) { // 16

DI=InData&0x8000;

SK=1; SK=0;

InData<<=1;

}

CS=0; DO=1;

CS=1; SK=1;

while(DO==0) {   // busy test

SK=0; SK=1;

}

SK=0; CS=0;

Ewds();

}

/*

// Erase memory locaTIon An - A0.

void Erase(unsigned char address) {

unsigned char temp;

Ewen();

SK=0; DI=1; // 111 A5-A0

CS=0; CS=1;

SK=1; SK=0;   // 1

address =0xc0;

for(temp=8;temp!=0;temp--) { // 8

DI=address&0x80;

SK=1; SK=0;

address<<=1;

}

CS=0; DO=1;

CS=1; SK=1;

while(DO==0) {

SK=0; SK=1;

}

SK=0; CS=0;

Ewds();

}

// Erases all memory locaTIons. Valid only at VCC = 4.5V to 5.5V.

void Eral(void) {

unsigned char temp,InData;

Ewen();

CS=0;

SK=0;

CS=1;

InData=0x90; // 10010XXXX

for(temp=9;temp!=0;temp--) { // 9

DI=InData&0x80;

SK=1; SK=0;

InData<<=1;

}

CS=0; DO=1;

CS=1; SK=1;

while(DO==0) {

SK=0; SK=1;

}

SK=0; CS=0;

Ewds();

}

// Writes all memory locations. Valid only at VCC = 4.5V to 5.5V.

void Wral(unsigned int InData) {

unsigned char temp,address;

Ewen();

CS=0;

SK=0;

CS=1;

address=0x88; // 10001XXXX

for(temp=9;temp!=0;temp--) { // 9

DI=address&0x80;

SK=1; SK=0;

address<<=1;

}

for(temp=16;temp!=0;temp--) { // 16

DI=InData&0x8000;

SK=1; SK=0;

InData<<=1;

}

CS=0; DO=1;

CS=1; SK=1;

while(DO==0) {

SK=0; SK=1;

}

SK=0; CS=0;

Ewds();

}

*/

unsigned char ReadChar(unsigned char address) {

unsigned char temp=address>>1;

if(address&0x01) return((unsigned char)(Read(temp)>>8));

else return((unsigned char)(Read(temp)));

}

void WriteChar(unsigned char address,unsigned char InData) {

unsigned char temp=address>>1;

if(address&0x01) Write(temp,(unsigned int)(Read(temp)&0x00ff (InData<<8)));

else Write(temp,(unsigned int)(Read(temp)&0xff00 InData));

}

void ReadString(unsigned char data *RamAddress,unsigned char RomAddress,unsigned char Number) {

while(Number!=0) {

*RamAddress=ReadChar(RomAddress);

RamAddress++;

RomAddress++;

Number--;

}

}

void WriteString(unsigned char data *RamAddress,unsigned char RomAddress,unsigned char Number) {

unsigned int temp;

if(Number==0) return;

if(RomAddress&0x01) {

WriteChar(RomAddress,*RamAddress);

RamAddress++;

RomAddress++;

Number--;

}

if(Number==0) return;

while(Number>>1) {

temp=*RamAddress;

RamAddress++;

temp=temp (*RamAddress)<<8;

RamAddress++;

Write(RomAddress>>1,temp);

RomAddress++;

RomAddress++;

Number--;

Number--;

}

if(Number) WriteChar(RomAddress,*RamAddress);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值