* 名称: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再单步*/
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)