N76e003单片机内部没有EEPROM,但是可以使用 APROM模拟EEPROM功能,代码如下:

eeprom.h

 #ifndef _EEPROM_H_
#define _EEPROM_H_ //EEPROM 指令
#define BYTE_PROGRAM_AP 0x21 //APROM 字节编程(数据写入)
#define PAGE_ERASE_AP 0x22 //APROM 页擦除 (128字节)
#define BYTE_Read_AP 0x00 //APROM 字节读 (数据字节) // EEPROM起始地址
#define EEPROM_START_ADDRESS 0x0200 void Eeprom_Unlock(void);
void Eeprom_Locked(void);
void Eeprom_IAP_process(void);
void Eeprom_Erase_page(unsigned short address,unsigned char Data);
void Eeprom_Byte_write(unsigned short address,unsigned char Data);
unsigned char Eeprom_Erase_read(unsigned short address); #endif /* _EEPROM_H_ */

eeprom.c

 #include <N76E003.h>
#include "eeprom.h"
#include "data.h" volatile unsigned char code Data_Flash[] _at_ EEPROM_START_ADDRESS; //不被优化 /**************************************************************************
Function: Eeprom_Unlock
Description: 解锁 Eeprom
Input: no
Output: no
Return: no
**************************************************************************/
void Eeprom_Unlock(void){
//开启 在线编程模式(LDROM和APROM)
TA = 0xAA; //CHPCON受TA保护
TA = 0x55;
CHPCON |= 0x01; //IAPEN = 1, 启用IAP模式(CHPCON芯片控制寄存器)
//开启 编程程序模式(APROM)
TA = 0xAA; //IAPUEN受TA保护
TA = 0x55;
IAPUEN |= 0x01; //APUEN = 1, 启用APROM更新(更新使能)
}
/**************************************************************************
Function: Eeprom_Locked
Description: 解锁 Eeprom
Input: no
Output: no
Return: no
**************************************************************************/
void Eeprom_Locked(void)
{
//关闭 编程程序模式(APROM)
TA = 0xAA; //IAPUEN受TA保护
TA = 0x55;
IAPUEN &= ~0x01; //APUEN = 0,禁用APROM更新
//关闭 在线编程模式(LDROM和APROM)
TA = 0xAA; //CHPCON受TA保护
TA = 0x55;
CHPCON &= ~0x01; //IAPEN = 0,禁用IAP模式
}
/**************************************************************************
Function: Eeprom_IAP_process
Description: IAP 处理
Input: no
Output: no
Return: no
**************************************************************************/
void Eeprom_IAP_process(void){
bit EA_status;
//IAP 执行
EA_status = EA;
EA = ;
TA = 0xAA;
TA = 0x55;
IAPTRG |= 0x01; //IAP 执行(设置该位为1开始执行IAP。该指令后,CPU保持程序计数器(PC) ,IAP硬件自动管理控制该过程。IAP完成后,程序计数器继续执行下一个指令。IAPGO位自动清零,保持为0。在触发IAP动作前,如果中断打开应该临时关闭因为硬件限制。) Eeprom_Unlock(); //Eeprom 上锁
EA = EA_status;
}
/**************************************************************************
Function: Eeprom_Erase_page
Description: 擦除页面 Eeprom
Input: - address 指定擦除页面的绝对地址
- Data Eeprom擦除后的数据
Output: no
Return: no
**************************************************************************/
void Eeprom_Erase_page(unsigned short address,unsigned char Data)
{
unsigned char High_address = address >> ; //取高位
unsigned char Low_address = address; //取低位
Eeprom_Unlock(); //Eeprom 解锁
//擦除页面
IAPCN = PAGE_ERASE_AP; //页擦除
IAPAH = High_address; //页面地址高8位
IAPAL = Low_address; //页面地址低8位
IAPFD = Data; //擦除数据值
//IAP 执行
Eeprom_IAP_process(); //执行上面设置
Eeprom_Locked(); //Eeprom 上锁
}
/**************************************************************************
Function: Eeprom_Byte_write
Description: 字节编程 Eeprom
Input: - address 指定更改数据的绝对地址
- Data Eeprom写入的数据
Output: no
Return: no
**************************************************************************/
void Eeprom_Byte_write(unsigned short address,unsigned char Data)
{
unsigned char High_address = address >> ; //取高位
unsigned char Low_address = address; //取低位
Eeprom_Unlock(); //Eeprom 解锁
//字节编程
IAPCN = BYTE_PROGRAM_AP; //字节编程
IAPAH = High_address; //字节编程地址高8位
IAPAL = Low_address; //字节编程地址低8位
IAPFD = Data; //写入的数据
//IAP 执行
Eeprom_IAP_process(); //执行上面设置
Eeprom_Locked(); //Eeprom 上锁
}
/**************************************************************************
Function: Eeprom_Erase_read
Description: 字节读 Eeprom
Input: - address 指定读出数据的绝对地址
Output: no
Return: IAPFD 读出的数据
**************************************************************************/
unsigned char Eeprom_Erase_read(unsigned short address){
unsigned char High_address = address >> ; //取高位
unsigned char Low_address = address; //取低位
//字节读
IAPCN = BYTE_Read_AP; //字节读
IAPAH = High_address; //字节读地址高8位
IAPAL = Low_address; //字节读地址低8位
//IAP 执行
Eeprom_IAP_process(); //执行上面设置
return IAPFD;
}

单片机成长之路(51基础篇) - 022 N76e003 APROM模拟EEPROM驱动的更多相关文章

  1. 单片机成长之路(51基础篇) - 015 关于sdcc的多文件编译范例二

    本文是续 单片机成长之路(51基础篇) - 009 关于sdcc的多文件编译范例(一)编写的. 在实际的工作中,单片机的头文件和功能函数不可能同全部放在同一个文件夹下面,我们把单片机成长之路(51基础 ...

  2. 单片机成长之路(51基础篇) - 009 关于sdcc的多文件编译范例(一)

    本文是续 单片机成长之路(51基础篇) - 006 在Linux下搭建51单片机的开发烧写环境编写的. 本范例主要由(main.c ,delay.h,delay.c,makefile)4个文件组成,s ...

  3. (转)Python成长之路【第九篇】:Python基础之面向对象

    一.三大编程范式 正本清源一:有人说,函数式编程就是用函数编程-->错误1 编程范式即编程的方法论,标识一种编程风格 大家学习了基本的Python语法后,大家就可以写Python代码了,然后每个 ...

  4. Sass进阶之路,之一(基础篇)

    Sass 学习Sass之前,应该要知道css预处理器这个东西,css预处理器是什么呢? Css预处理器定义了一种新的语言将Css作为目标生成文件,然后开发者就只要使用这种语言进行编码工作了.预处理器通 ...

  5. python成长之路第三篇(1)_初识函数

    目录: 函数 为什么要使用函数 什么是函数 函数的返回值 文档化函数 函数传参数 文件操作(二) 1.文件操作的步骤 2.文件的内置方法 函数: 一.为什么要使用函数 在日常写代码中,我们会发现有很多 ...

  6. C++自学成长之路(第一篇)

    今天开始我将开启C++自学成长之路,今天是第一天,在以前就一直在网上查找关于c++的资料,想买一本好一点的,权威一点的资料书,通过努力查找,我选择了c++ primer,在网上这本书的好评如潮.更多的 ...

  7. 单片机成长之路(51基础篇) - 008 C51 的标示符和关键字

    标准 C 语言定义了 32 个关键字,如下表(ANSI C的32个关键字): C51在此基础上针对单片机功能进行了扩展,详情见下表(C51编译器扩充关键字): C 51的数据类型 51单片机使用的C语 ...

  8. 单片机成长之路(51基础篇) - 006 在Linux下搭建51单片机的开发烧写环境

    在Linux下没有像keli那样好用的IDE来开发51单片机,开发环境只能自己搭建了. 第一步:安装交叉编译工具 a) 安装SDCC sudo apt-get install sdcc b)测试SDC ...

  9. 单片机成长之路(51基础篇) - 002 STC单片机冷启动和复位有什么区别

    STC单片机简介 STC单片机是一款增强型51单片机,完全兼容MCS-51,还增加了新的功能,比如新增两级中断优先级,多一个外中断,内置EEPROM,硬件看门狗,具有掉电模式,512B内存等.还支持I ...

随机推荐

  1. Newtonsoft.Json日期转换

    在使用EasyUI做后台时,使用表格datagrid,用Newtonsoft.Json转换为Json格式后,时间显示为2013-06-15 T00:00:00形式. 后来研究了一下Newtonsoft ...

  2. JMeter-java.lang.OutOfMemoryError: PermGen space错误

    PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被 ...

  3. YOLO系列:YOLO v1深度解析

    声明一点,我是工程应用人员,此文章仅适合算法应用工程师. 1.首先 先看一下YOLO的整体结构: 2.其次 看一下YOLO的工作过程: (1) 将原图划分为SxS的网格.如果一个目标的中心落入某个格子 ...

  4. Java笔记(六)列表和队列

    列表和队列 一)ArrayList 1.基本原理 ArrayList是一个泛型容器.内部会有一个数组elementData,一般会有预留空间 有一个整数记录实际的元素个数. private trans ...

  5. php 通用数据库类

    <?php // 数据库连接类 class DB{ //私有的属性 private static $dbcon=false; private $host; private $port; priv ...

  6. 南方IT学校期末PCB结课项目考试(实操)说明书

    南方IT学校期末结课项目考试(实操)说明书(一) 课程:<印制电路板设计技术>(二) 项目:笔记本电脑电源适配器的印制电路板设计(三) 背景说明:如今笔记本已经进入千家万户,作为给电脑充电 ...

  7. React生命周期函数详解

    React生命周期函数 生命周期函数是指在某一个周期自动执行的函数. React中的生命周期执行过程 以下是React中的常用的生命周期函数,按个部分中按照自动执行顺序列出,这几个过程可能存在同时进行 ...

  8. python3.6.5 + selenium +VS Code 运行报错:Unable to find a matching set of capabilities的解决

    在python3.6.5 + selenium +VS Code 环境中,在class的__init__ 方法初始化火狐浏览器时出现以下错误: 发生异常: selenium.common.except ...

  9. [P1005][NOIP2007] 矩阵取数游戏 (DP+高精)

    我不会高精…… 也不会DP…… 这道题即考高精又考DP…… 我要死了 给一个不是高精的代码(当然不能满分) #include<cstdio> #include<iostream> ...

  10. 使用git(window)在github上存项目教程

    要托管到github,那你就应该要有一个属于你自己的github帐号,所以你应该先到github.com注册 打开浏览器 在地址栏输入地址:github.com 填写用户名.邮箱.密码 点击Sign ...