PIC单片机,型号16F876,如何在程序存储器存取数组float A【100】?求实例

PIC单片机,型号16F876,如何在程序存储器存取数组float A【100】?求实例,第1张

在程序存储器中只能放置常量,用查表的方式读取数据。这数组跟着程序一起烧写到程序寄存器中。写完程序就不能对其进行修改了(只读的)。因为程序也在程序存储器内,所以程序无法修改自己所在区域的信息。

如果你要 *** 作这数据,只能外扩一个flash芯片。将其作为外扩数据存储器

#ifndef __PWM__H__

#define __PWM__H__

void pwm_ccp1(unsigned char a,unsigned char b)

void pwm_ccp2(unsigned char a,unsigned char b)

#endif

void pwm_ccp1(unsigned char a,unsigned char b)//左边PWM

//CCP1 模块的 PWM 工作方式,周期为(b+1)*4*Tosc*(TMR2前分频值)=b+1 us //pwm高电平=a:CCP1CON(第四五位)Tosc*(TMR2前分频值)

//pwm高电平=a:CCP1CON(第四五位)Tosc*(TMR2前分频值)

{//a>b时有最高转速

CCPR1L=a //* 设置工作循环的高 8bit 为 a

CCP1CON=0X0C //0000 1100 设置 CCP1 为 PWM 工作方式,且工作循环的低 bit2 为 11*/

CCP1IE=0//* 禁止总中断和外围中断 */

PR2=b //* 设置 PWM 周期 */

TRISC2=0 //* 设置 RC2/CCP1 为输出 */

T2CON=0X04 //* 0000 1000前分频比为 1:1 ,后分频器1:2,打开 TMR2 ,同时输出 PWM 信号 */

}

void pwm_ccp2(unsigned char a,unsigned char b) //右边PWM

//CCP2 模块的 PWM 工作方式,周期为(b+1)*4*Tosc*(TMR2前分频值),

//pwm高电平=a:CCP2CON(第四五位)Tosc*(TMR2前分频值)

{

CCPR2L=a //* 设置工作循环的高 8bit 为 a

CCP2CON=0X0C //* 设置 CCP2 为 PWM 工作方式,且工作循环的低 bit2 为 11*/

CCP2IE=0 //* 中断屏蔽

PR2=b //* 设置 PWM 周期 */

TRISC1=0 //* 设置 RC1/CCP2 为输出 */

T2CON=0X04 //* 前分频比为 1 ,打开 TMR2 ,同时输出 PWM 信号 */

}

/*

***************************************************************************************************

函数名:EE_readbyte

功 能:片内EEPROM 读1字节

说 明:Read_AddrH:待写入的高地址;Read_Addr:待写入的低地址

函数执行完返回一个存放在该地址处的值

***************************************************************************************************

*/

uchar EE_ReadByte(uchar Read_AddrH,uchar Read_Addr)

{

EEADRH = Read_AddrH //写入高地址

EEADR = Read_Addr //写入低地址

EECON1bits.EEPGD = 0//访问EEPROM存储区

EECON1bits.CFGS = 0 //访问EEPROM或程序区

EECON1bits.RD = 1

return EEDATA

}

/*

***************************************************************************************************

函数名:EE_writebyte

功 能:片内EEPROM 写1字节

说 明:Write_AddrH:待写入的高位地址;Write_Addr:待写入的低位地址;Write_Byte:待写入的字节

***************************************************************************************************

*/

void EE_WriteByte(uchar Write_AddrH,uchar Write_Addr,uchar Write_Byte)

{

ClrWdt()//喂狗

while(EECON1bits.WR)

EEADRH = Write_AddrH//写入高地址

EEADR = Write_Addr //写入低地址

EEDATA = Write_Byte //写入数据

EECON1bits.EEPGD = 0//访问EEPROM存储区

EECON1bits.CFGS = 0 //访问EEPROM或程序区

EECON1bits.WREN = 1 //充许擦写

INTCONbits.GIE = 0 //禁止所有中断

EECON2 = 0x55 //写入密钥

EECON2 = 0xaa

EECON1bits.WR = 1 //开始写 *** 作

Nop()

Nop()

INTCONbits.GIE = 1 //开中断

EECON1bits.WREN = 0 //禁止擦写

while(EECON1bits.WR) //等待写完成

{

}

}

/*

***************************************************************************************************

函数名:EE_WriteArray

功 能:写入数组数据到EEPROM

说 明:AddrH:EEPROM起始地址高字节,Addr:EEPROM起始地址低字节

WriteByte[]:待存储的数据存放数组

LenArray:待存储的数组长度

举例:存放地址0x0020---0x0029;存放数据array[10]

***************************************************************************************************

*/

void EE_WriteArray(uchar AddrH,uchar Addr,uchar WriteArray[],uchar LenArray)

{

uchar tempH,tempL,tempByte

uint i=0

tempH = AddrH

tempL = Addr

for(i=0i<LenArrayi++)

{

tempByte = WriteArray[i]

EE_WriteByte(tempH,tempL,tempByte)

tempL++

}

}

/*

***************************************************************************************************

函数名:EE_ReadArray

功 能:写入数组数据到EEPROM

说 明:AddrH:EEPROM起始地址高字节,Addr:EEPROM起始地址低字节

ReadByte[]:待存储的数据存放数组

LenArray:待存储的数组长度

举例:存放地址0x0020---0x0029;存放数据array[10]

***************************************************************************************************

*/

void EE_ReadArray(uchar AddrH,uchar Addr,uchar ReadArray[],uchar LenArray)

{

uchar tempH,tempL,tempByte

uint i

tempH=AddrH

tempL=Addr

for(i=0i<LenArrayi++)

{

tempByte=EE_ReadByte(tempH,tempL)

ReadArray[i]=tempByte

tempL++

}

}


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存