/******************************************
******PIC16F877A 内部EEPROM读写实验*******好象还有点问题,没有写进去?
Author:hnrain
Date:2010-12-25
Version:V0.1
Email:hnrain1004@gmail.com
_______________________________
实验现象:先给内部EEPROM的0~7字节写数据1~8,再读出第0字节的
内容,并判断读出来的数据是不是1,如果是1则点亮RD0口的LED。
内部EEPROM的操作主要通过4个寄存器
EECON1,EECON2,EEDATA,EEADR
EEADR存放EEPROM被访问过的地址
bit7:5 未用;读为0
bit4 EEIF:EEPROM写操作中断标志位
= 写操作完成(必须软件清零)
= 写操作未完成或还未开始
bit3 WRERR:EEPROM错误标志位
= 写操作过早终止
= 写操作已完成
bit2 WREN:EEPROM写使能位
= 允许写入
= 禁止写入EEPROM
bit1 WR:写操作控制位
= 启动写周期,一旦写入完成,该位将被硬件清零
写操作控制位只能用软件置"1"
= EEPROM的写周期已完成
bit0 RD:读控制位
= 启动EEPROM读操作。读需要一个周期,RD由硬件清零
RD只能用软件置“1”
= 未启动EEPROM读操作
然后将WR位置1
*******************************************/
#include
#include "../head/config.h"
//HS振荡,禁止看门狗,低压编程关闭,启动延时定时器
void WriteEE(uint8 addr,uint8 data);//EEPROM写函数
uint8 ReadEE(uint8 addr); //EEPROM读函数
{
unsigned int i,j;
for(i=0;i
for(j=0;j<10;j++);
}
}
void Display(unsigned char num,unsigned char data)
{
PORTD = TABLE[data]; //取出数据,送D口显示
PORTC = 0x01;
switch(num)
{
case 0:
PORTA = 0x01;
break;
case 1:
PORTA = 0x02;
break;
case 2:
PORTA = 0x04;
break;
case 3:
PORTA = 0x06;
break;
case 4:
PORTA = 0x08;
break;
case 5:
PORTA = 0x0A;
break;
case 6:
PORTA = 0x0C;
break;
case 7:
PORTA = 0x0E;
break;
default:
PORTA = 0x00;
}
DelayMs(2);
}
{
unsigned char buf;
GIE =0;
TRISD = 0; //portd 输出
TRISA = 0; //porta 输出
TRISC = 0; //porta 输出
PORTC = 0x01; //74HC138控制端口
DelayMs(50);
buf=232;
// writeByte(0x15,buf);
eeprom_write(0x30,buf);
buf = 0;
DelayMs(50);
// buf = 0;
// buf = readByte(0x15);
buf=eeprom_read(0x30); //从片内EEPROM中的地址0X10中读出数据
// GIE = 1;
while(1)
{
Display(0,buf/100);
Display(1,buf/10%10);
Display(2,buf%100%10);
}}
void WriteEE(uint8 addr,uint8 data)
{
do{}
while(WR == 1);//等待写完成
EEADR = addr;//写入地址信息
EEDATA = data;//写入数据信息
EEPGD = 0;//操作EEPROM
WREN = 1; //写EEPROM允许
EECON2 = 0x55;//写入特定时序
EECON2 = 0xaa;
WR = 1; //执行写操作
do{}
while(WR == 1);//等待写完成
WREN = 0;//禁止写入EEPROM
}
uint8 ReadEE(uint8 addr)
{
uint8 num;
do{}
while(RD == 1);//等待读完成
EEADR = addr;//写入要读的址址
EEPGD = 0;//操作EEPROM
RD = 1;//执行读操作
do{}
while(RD == 1);//等待读完成
num = EEDATA;
return num;//返回读取的数据
}
上一篇:PIC单片机AD中断调试(无数字滤波)
下一篇:PIC16F917 内部AD练习程序
推荐阅读最新更新时间:2024-03-16 13:49
设计资源 培训 开发板 精华推荐
- 睿瀚医疗万斌:“脑机接口+AI+机器人”是康复赛道的未来
- 希润医疗孟铭强:手功能软体机器人,让脑卒中患者重获新生
- 柔灵科技陈涵:将小型、柔性的脑机接口睡眠设备,做到千家万户
- 微灵医疗李骁健:脑机接口技术正在开启意识与AI融合的新纪元
- USB Type-C® 和 USB Power Delivery:专为扩展功率范围和电池供电型系统而设计
- 景昱医疗耿东:脑机接口DBS治疗技术已实现国产替代
- 首都医科大学王长明:针对癫痫的数字疗法已进入使用阶段
- 非常见问题解答第223期:如何在没有软启动方程的情况下测量和确定软启动时序?
- 兆易创新GD25/55全系列车规级SPI NOR Flash荣获ISO 26262 ASIL D功能安全认证证书
- 新型IsoVu™ 隔离电流探头:为电流测量带来全新维度