[技术问答] SC92F7320 EEPROM读写例程求助

[复制链接]
267|6
 楼主 | 2019-10-19 16:14 | 显示全部楼层 |阅读模式
本人菜鸟一枚,按照DEMO程序折腾了好多天,始终没有成功,特在此求助热心的老师写一个EEPROM读写例程学习一下,希望赐教,先谢谢了!
EEPROM读写例程.png

使用特权

评论回复
| 2019-10-22 13:21 | 显示全部楼层
芯片规格书上有,照抄就行了。

使用特权

评论回复
| 2019-10-22 13:22 | 显示全部楼层
这个按键电路碉堡了

使用特权

评论回复
 楼主 | 2019-10-23 14:44 | 显示全部楼层
knk 发表于 2019-10-22 13:22
这个按键电路碉堡了

纯属测试程序,学习阶段,

使用特权

评论回复
| 2019-11-19 11:31 | 显示全部楼层
u8 code *IapAddr = 0x00;


*****************************************************
*函数名称:void IAPWrite(u8 Addr,u8 Value,u8 IAPArea)
*函数功能:IAP初始化
*入口参数:void
*出口参数:Addr,Value,IAPArea
*****************************************************/
//IAP写操作
void IAPWrite(u8 Value,u8 Addr)
{       
        EA = 0;
        IAPADE = 0x02;  //IAPArea=0x00:选择ROM区操作  IAPArea=0x02:选择EEPROM区操作
        IAPDAT = Value;      //写入数据Data
        IAPADH = 0x00;   //写入地址的高5位
        IAPADL = Addr;               //写入地址的低8位               
        IAPKEY = 240;                   //IAP开启保护控制时间
        IAPCTL = 0x06;     //CPU hold time为2ms,写入操作命令
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        IAPADE = 0x00;      //MOVC指向ROM
        EA = 1;
}
/*****************************************************
*函数名称:u8 IAPRead(u8 Addr,u8 IAPArea)
*函数功能:IAP初始化
*入口参数:void
*出口参数:Addr,IAPAre
*****************************************************/
u8 IAPRead(u8 Addr)
{
        u8 ReadValue = 0x00;
        IAPADE = 0x02;
        ReadValue = *(IapAddr+Addr); //读取的数据
        IAPADE = 0x00;               //MOVC指向ROM
        return ReadValue;
}                                                                                               
                                                                                               
IAPWrite(byte0,0x00);  //写(数据,地址)

byte0=IAPRead(0x00);  //读

使用特权

评论回复
 楼主 | 2019-11-19 15:48 | 显示全部楼层
2083759 发表于 2019-11-19 11:31
u8 code *IapAddr = 0x00;

谢谢热心的兄弟

使用特权

评论回复
 楼主 | 2019-11-21 10:20 | 显示全部楼层
/*** 自编带记忆启停关闭开关源程序**/
/**上电读取EEPROM数据Temp,为1就延时5秒,IO口P26触发一次,为0就不动作,
***短按按键,IO口P26触发一次,长按2S取反Temp并记忆,IO口P26触发一次****/


#include "SC92F732x_C.H"
#include "intrins.H"
//#include "H/Function_Init.H"
typedef unsigned int u16;          //对数据类型进行声明定义
typedef unsigned char u8;
//#define Addr  0x10
//u8 Read_Data;
bit key=0;                //定义一个按键状态标志位
bit Temp=0;
u8 code *POINT=0x0000;                                                        //配置读的初始指针
u16 num;
u16 i,j;


void TIM0init(void)  //2M   定时10mS
{
        TMCON = 0X00;     //fsys/12
  TMOD=0x01;
        TL0 = 0x7d;                //设置定时初值125
        TH0 = 0xf9;                //设置定时初值249
        EA=1;                      //开总中断
        ET0=1;                     //开定时器0中断
        //TR0=1;      // 启动定时器0
}
        void T0_time() interrupt 1
{
        TL0 = 0x7d;                //设置定时初值125
        TH0 = 0xf9;                //设置定时初值249
        num++;              //num每加1次判断一次是否到20次
}


void Eeprom_Write(u8 Temp,u8 Addr)                                //Data为写入数据,Addr为写入地址
       
{
        IAPDAT = Temp;                                                        //配置写入数据
        IAPADH = 0x00;                                                        //配置写入地址
        IAPADL = Addr;       
        EA=0;                                                                                                //先关总中断
        IAPADE = 0X02;                                                        //选择eeprom
        IAPKEY = 0xf0;
        IAPCTL = 0x0a;                                                        //启动写入
        _nop_(); _nop_();
                                _nop_(); _nop_();                                                //至少插入4个_nop_();以上
        IAPADE = 0x00;                                                         //返回ROM区域
        EA=1;                                                                                         //开总中断
}
u8 Eeprom_Read(u8 Addr)                                                        //读
{

        EA=0;                                                                                                                         //先关总中断
        IAPADE =0x02;                                                                                        //选择eeprom
        Temp = *(POINT+Addr);                                                        //读Addr地址的数据
        IAPADE = 0x00;                                                                                //MOVC指向ROM
        EA=1;                                                                                                                        //开总中断
        return Temp;
}

void delay(u16 i)
{
        while(i--);       
}


void keypros()
{
       
        if(P21==0)                                                                  //检测按键K1是否按下
        {       
                delay(1000);                                                   //消除抖动 一般大约10ms
                if(P21==0)                                                                 //再次判断按键是否按下
                        {
                                key=1;
                                TR0=1;
                                while (!P21);                                        // 按键释放
                                TR0=0;
                        }
        }       
        if (key)
        {
                if (num>=100)
                {
                        Temp=~Temp;
                        Eeprom_Write(Temp,0x20);
                        P26=1;
                        delay(10000);                                                //延时
                        P26=0;
                }
               
                else
                        {
                                P26=1;
                                delay(10000);                        //延时
                                P26=0;
                        }
                key=0;
                num=0;
        }
}

void GPIO_init(void)
{
        P1CON = 0xFF;                                                          //设置P1为强推挽模式
        P1PH  = 0x00;
        P2CON = 0x40;                                                          //设置P21为输入模式
        P2PH  = 0x02;
        SC92F7320_NIO_Init();                                         //未引出IO口配置
}


void main(void)
{
        GPIO_init();
        TIM0init();               
        Eeprom_Read(0x20);                        //读取EEPROM数据   
        if (Temp==0)
                {
                        for(i=1000;i>0;i--)               
                        for(j=500;j>0;j--);                //延时
                        P26=1;
                        delay(10000);                                        //延时
                        P26=0;
                }
        else
                {
                        P26=0;
                }
                while(1)
                        {
                                keypros();  //按键处理函数
                        }
}
感谢热心朋友的指导,现在程序改好亲测可以正常使用了,程序写的乱七八糟的,时间也是个大概,纯爱好,半路出家,班门弄斧了,恳请各位老师给点儿优化的建议,

启停宝.png

使用特权

评论回复
扫描二维码,随时随地手机跟帖
*滑动验证:
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

在线客服 快速回复 返回顶部 返回列表