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. 问题 J: Palindromic Password ( 2018组队训练赛第十五场) (简单模拟)

    问题 J: Palindromic Password 时间限制: 3 Sec  内存限制: 128 MB提交: 217  解决: 62[提交][状态][讨论版][命题人:admin] 题目描述 The ...

  2. Is there a TRY CATCH command in Bash

    Is there a TRY CATCH command in Bash? No. Bash doesn't have as many luxuries as one can find in many ...

  3. hadoop安装过程中出现的错误

    此次来记录一下我在安装Hadoop安装过程中出现的错误,安装过程参照慕课网林子雨教程进行安装,在尝试过程中出现的错误如下: 1.在安装Ubuntu时,新建虚拟电脑时,并没有在版本的输入框中有Ubunt ...

  4. linux 命令基础一。

    UNIX是什么 UNIX的定义: UNIX是一个计算机操作系统,一个用来协调.管理和控制计算机硬件和软件资源的控制程序. UNIX操作系统的特点:多用户和多任务多用户表示在同一时刻可以有多个用户同时使 ...

  5. SpringBoot返回json和xml

    有些情况接口需要返回的是xml数据,在springboot中并不需要每次都转换一下数据格式,只需做一些微调整即可. 新建一个springboot项目,加入依赖jackson-dataformat-xm ...

  6. Codeforces Round #517 (Div. 2)

    A #include<queue> #include<cstdio> #include<cstring> #include<algorithm> #de ...

  7. string method and regular expresions

    <!doctype html> <!DOCTYPE html> <html> <head> <meta charset="utf-8&q ...

  8. 潭州课堂25班:Ph201805201 tornado 项目 第二课 项目 基本功能模块和 Git 使用 (课堂笔记)

    tornado 相关说明 把图片显示在页面, 创建个 static 文件夹, 在这个文件下存放几张图片 在配置中指定静态文件路径, 在 html 文件中迭代出图片, 创建个包,重构 handlers ...

  9. Python内置GUI模块Tkinter的几点笔记

    组件属性,用法 组件位置 更多

  10. 深入理解JVM(7)——类加载器

    一.类和类加载器 a)        类加载器的作用:将class文件加载到JVM的方法区,并且在方法区中创建一个java.lang.Class对象作为外界访问这个类的接口. b)        类和 ...