请问PIC16F1938的闪存程序存储器怎么进行擦除和写 *** 作

请问PIC16F1938的闪存程序存储器怎么进行擦除和写 *** 作,第1张

/*******************************************************************************

* 名称:FlashRead

* 功能:读取程序存储器一个字

* 参数:addr ->程序存储器字地址

* 返回:读取到的存储器值

*******************************************************************************/

uint16 FlashReadWord(uint16 addr)

{

EEADRL = ((addr) &0x00ff)

EEADRH = ((addr) >>8)

CFGS = 0//访问程序存储器or数据EEPROM

LWLO = 0//仅装载写锁存器位

EEPGD = 1//访问程序存储器

RD = 1//启动对程序存储器or数据EEPROM的读 *** 作,读 *** 作占用一个周期,由硬件清零

asm("NOP")

asm("NOP")

return ((EEDATH)<<8 | (EEDATL))

}

/*******************************************************************************

* 名称:FlashWriteWord

* 功能:编程程序存储器一个字

* 参数:addr ->程序存储器字地址

* dat ->要编程的值

* 返回:无

*******************************************************************************/

void FlashWriteWord(uint16 addr,uint16 dat)

{

uint16 value

EECON1 = 0

EEADRL = ((addr) &0xff)

EEADRH = ((addr) >>8)

value = dat &0x3fff

EEDATH = ((value) >>8)

EEDATL = ((value) &0xff)

EEPGD = 1//访问程序存储器

CFGS = 0//访问程序存储器or数据EEPROM

WREN = 1//使能编程/擦除 *** 作

LWLO = 0//加载到程序存储锁存器,并编程到程序存储器

EECON2 = 0x55//必须的解锁序列

EECON2 = 0xAA//必须的解锁序列

WR = 1//启动编程 *** 作

asm("NOP")

asm("NOP")

WREN = 0//禁止编程/擦除 *** 作

}

/*******************************************************************************

* 名称:FlashWriteLine

* 功能:编程程序存储器一行(32字)

* 参数:addr ->程序存储器行地址

* dat ->要编程的值

* 返回:无

*******************************************************************************/

void FlashWriteLine(uint16 addr,uint16 *dat)

{

uint8 i

uint16 value

EECON1 = 0

EEADRL = ((addr) &0xff)

EEADRH = ((addr) >>8)

for(i=0i<31i++)

{

value = dat[i] &0x3fff

EEDATH = ((value) >>8)

EEDATL = ((value) &0xff)

EEPGD = 1//访问程序存储器

CFGS = 0//访问程序存储器or数据EEPROM

WREN = 1//使能编程/擦除 *** 作

LWLO = 1//只加载到程序存储锁存器

EECON2 = 0x55//必须的解锁序列

EECON2 = 0xAA//必须的解锁序列

WR = 1//启动编程 *** 作

asm("NOP")

asm("NOP")

EEADR++

}

value = dat[31] &0x3fff

EEDATH = ((value) >>8)

EEDATL = ((value) &0xff)

EEPGD = 1//访问程序存储器

CFGS = 0//访问程序存储器or数据EEPROM

WREN = 1//使能编程/擦除 *** 作

LWLO = 0//加载到程序存储锁存器,并编程到程序存储器

EECON2 = 0x55//必须的解锁序列

EECON2 = 0xAA//必须的解锁序列

WR = 1//启动编程 *** 作

asm("NOP")

asm("NOP")

WREN = 0//禁止编程/擦除 *** 作

}

/*******************************************************************************

* 名称:FlashEraseLine

* 功能:擦除程序存储器一行

* 参数:addr ->程序存储器行地址

* 返回:无

*******************************************************************************/

void FlashEraseLine(uint16 addr)

{

EEADRL = ((addr) &0xff)

EEADRH = ((addr) >>8)

CFGS = 0//访问程序存储器or数据EEPROM

WREN = 1//使能编程/擦除 *** 作

EEPGD = 1//访问程序存储器

FREE = 1//执行擦除 *** 作

EECON2 = 0x55//必须的解锁序列

EECON2 = 0xAA//必须的解锁序列

WR = 1//启动程序存储器or数据EEPROM编程/擦除 *** 作

asm("NOP")

asm("NOP")

WREN = 0//禁止编程/擦除 *** 作

}

#include<pic.h>//流水灯实验

#define uchar unsigned char//宏定义

#define uint unsigned int

__CONFIG(0x3B31)//设置配置位

void delay(uint x)//延迟函数x表示毫秒

{

uint a,b

for(a=xa>0a--)

for(b=110b>0b--)//嵌套

}

void main()

{

uchar i//为下面的for循环作一个变量i

TRISD=0x00//设置全为输出状态

while(1)//因为是流水灯所以是一个死循环,所以要在while里不要加分号

{

PORTD=0X01//先点亮第一个二极管

for(i=8i>0i--)//因为有8个灯作流水灯

{

delay(500)//延迟500ms

PORTD=PORTD<<1//让RD口左移动一位后再付给回PORTD

}

}

}

/*软件仿真功能:打开菜单Debugger--Select Tool--MPLAB SIM进行设置断点再单步仿真

可以打开菜单View--Special Function Registers看PIC全部的I/O口

也可以打开菜单View--Watch看I/O口和变量

也可以打开菜单的Debugger--Setting设置晶振的频率后打开Debugger--Stopwatch看每个指今的具体时间和

流水灯的时间,先按Zero清0再单步*/


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11484057.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存