📄 eeprom.c
字号:
#include "register.h"
int index=0,readdata,refe[214],disk[214]={0,1,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,2,1,90,25,0,15,0,20,0,15,0,30,0,45,0,60,0,75,0,90,0,105,0,120,0,135,0,150,0,165,0,180,0,195,0,210,0,225,0,240,0,255,0,14,1,29,1,44,1,59,1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,1,90,25,0,15,0,20,0,0,0,15,0,30,0,45,0,60,0,75,0,90,0,105,0,120,0,135,0,150,0,165,0,180,0,195,0,210,0,225,0,240,0,255,0,14,1,29,1,44,1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
int initial()
{
asm(" setc SXM"); // 符号位扩展有效
asm(" clrc OVM"); // 累加器中结果正常溢出
asm(" clrc CNF"); // B0被配置为数据存储空间
*WDCR=0x6F; // 不使能看门狗 E8?
// 软件禁止看门狗
*SCSR1=0x83FF; // CLKIN=15M,CLKOUT=4*CLKIN=30M
*IMR=0x0000; // 禁止所有中断
*IFR=0x0FFFF; // 清除全部中断标志,"写1清0"
WSGR=0X00; // 禁止所有的等待状态
*MCRA=0x0283; // IOPA0,2-6,IOPB2-7端口配置为一般的I/O功能
*PADATDIR=0x7D03; //IOPA2-6输出低电平,B7279时钟,DATA,273CLR,CLK输出低电平
*PBDATDIR=0xFD08; // IOPB0-2-7端口设置为输出低电平方式,3为高电平
*MCRC=0x8014; //IOPF0-6, IOPE0,1,3,5~7配置为一般的I/O功能,
*PFDATDIR=0X87FF; // IOPF0-2端口为输出低电平端口,IOPF3-IOPF6为输入端口
*PEDATDIR=0XE30B; // IOPE0,5-7端口为输出低电平端口 E1输出高电平,E0为EEPROM CLK E1为 SI E3 为SO输入 读为高
*MCRB=0XFE00; //IOPC0~7配置为一般的I/O功能,IOPD0为EEPROM片选为高
*PCDATDIR=0XFF01; // IOPC0-7端口为输出低电平端口,0高B7279片选
*PDDATDIR=0XFF01; // IOPD0端口为输出高电平端口 EEPROM片选
}
void Start()
{
int i;
*PEDATDIR=*PEDATDIR|0x0303; //SDA高 时钟 SDA输出为高
for(i=0;i<0x0015;i++)
i=i;
*PEDATDIR=*PEDATDIR&0xFFFD; //SDA输出为低
for(i=0;i<0x0015;i++)
i=i;
}
int SendByte(int databyte)
{
int k,m,ll,i;
unsigned j;
*PEDATDIR=*PEDATDIR|0X0300; //CLK SDA输出低
*PEDATDIR=*PEDATDIR&0XFFFC;
j=databyte; //ACK时输出为低 发命令码
for(k=0;k<0x0010;k++)//8个时钟 发命令
{
if((*PEDATDIR&0x0001)==0) //IOPE0若为0 时钟
{
for(i=0;i<0x0015;i++)
i=i;
m=j&0X0080;//j的最高位
j= j<<1; //j左移一位
m=m>>6; //m到相应位置
ll=*PEDATDIR&0xFFFD; //IOPE1 输出SI
*PEDATDIR=ll|m; //先发数据,再给时钟高电平
for(i=0;i<0x0015;i++)
i=i;
*PEDATDIR=*PEDATDIR|0X0101; //IOPE0设置为1. 为了保证低电平时间,给一定时间的延时
}
else
{
for(i=0;i<0x0030;i++)
i=i;
*PEDATDIR=*PEDATDIR&0XFFFE; //否则IOPE0设置为0
}
}
}
int Read()
{
int databyte=0,k,m,i,ll;
*PEDATDIR=*PEDATDIR&0xFDFE;//IOPE1改为输入 IOPE0输出低
*PEDATDIR=*PEDATDIR|0x0002;//IOPE1读为高
for(k=0;k<0x0010;k++)//8个时钟
{
if((*PEDATDIR&0x0001)==0) //IOPE0若为0 时钟
{
m=*PEDATDIR&0x0002; //IOPE1 输出
m=m>>1;//m到相应位置
databyte=databyte<<1;
databyte=databyte+m;
for(i=0;i<0x0030;i++)
k=k;
*PEDATDIR=*PEDATDIR|0X0101; //IOPE0设置为1. 为了保证低电平时间,给一定时间的延时
}
else
{
for(i=0;i<0x0030;i++)
i=i;
*PEDATDIR=*PEDATDIR&0XFFFE; //否则IOPE0设置为0
}
}
}
int Ack()
{
int m=0,i;
*PEDATDIR=*PEDATDIR&0xFDFC;//IOPE1改为输入 IOPE0输出低
// *PEDATDIR=*PEDATDIR|0x0002;//IOPE1读为高
for(i=0;i<0x0030;i++)
i=i;
*PEDATDIR=*PEDATDIR|0X0101; //IOPE0设置为1. 为了保证低电平时间,给一定时间的延时
for(i=0;i<0x0015;i++)
i=i;
m=*PEDATDIR&0x0002; //IOPE1 输入
m=m>>1;
for(i=0;i<0x0015;i++)
i=i;
return m;
}
void NoAck()
{
int i;
*PEDATDIR=*PEDATDIR|0x0300;//
*PEDATDIR=*PEDATDIR&0xFFFE;//CLK 输出为低
for(i=0;i<0x0030;i++)
i=i;
*PEDATDIR=*PEDATDIR|0x0001;// 输出为高
for(i=0;i<0x0030;i++)
i=i;
}
void End()
{
//结束
int i;
*PEDATDIR=*PEDATDIR|0X0300; //CLK SDA输出为低
*PEDATDIR=*PEDATDIR&0xFFFC; //CLK SDA输出为低
for(i=0;i<0x0030;i++)
i=i;
*PEDATDIR=*PEDATDIR|0x0101; //CLK输出为高
for(i=0;i<0x0015;i++)
i=i;
*PEDATDIR=*PEDATDIR|0x0202; //SDA输出为高
}
int sendROM(int code,unsigned addr,int databyte)
{
int codedata;
Start();
//建立
do
{
SendByte(code);
}
while(Ack()!=1);
do
{
SendByte(addr);
}
while(Ack()!=1);
codedata=code&0x0001;
if(codedata==1)//读数据
{
Start();
do
{
SendByte(code);
}
while(Ack()!=1);
databyte=Read();
NoAck();
}
else if(codedata==0)//写数据
{
do
{
SendByte(databyte);
}
while(Ack()!=1);
}
End();
if(codedata==1)//读数据
return databyte;
}
main()
{
initial();
for(index=0;index<0x0040;index++);
for(index=0;index<=214;index++)
sendROM(0xA1,index,disk[index]);
for(index=0;index<=214;index++)
sendROM(0xA0,index,refe[index]);
for(index=0;index<0x0040;index++);
//readdata=
sendROM(0xA8,1,85);
//sendROM(0xA1,0,readdata);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -