a93c46.c

来自「使用STC12C5410AD单片机作为开发系统实现简易闹钟、秒表、打铃小系统程序」· C语言 代码 · 共 212 行

C
212
字号
#include <reg51.h>
#include "a93c46.h"

// Write enable must precede all programming modes.
void Ewen(void)
{
	 uchar 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)
{
	 uchar 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.
uint Read(uchar address)
{
	 uchar temp;
	 uint 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(uchar address,uint InData)
{
	 uchar 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(uchar address) {
 uchar 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) {
 uchar 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(uint InData) {
 uchar 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();
}

*/

uchar ReadChar(uchar address)
{
	 uchar temp=address>>1;
	 if(address&0x01) return((uchar)(Read(temp)>>8));
	 else return((uchar)(Read(temp)));
}

void WriteChar(uchar address,uchar InData)
{
	 uchar temp=address>>1;
	 if(address&0x01) Write(temp,(uint)(Read(temp)&0x00ff|(InData<<8)));
	 else Write(temp,(uint)(Read(temp)&0xff00|InData));
}

void ReadString(uchar data *RamAddress,uchar RomAddress,uchar Number)
{
	 while(Number!=0) {
		  *RamAddress=ReadChar(RomAddress);
		  RamAddress++;
		  RomAddress++;
		  Number--;
	 }
}

void WriteString(uchar data *RamAddress,uchar RomAddress,uchar Number)
{
	 uint 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);
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?