
首先,这是PICC的定义。
其次,程序本来就是存放在ROM,数据一般放在RAM里;当你用const修饰变量组后,这些变量就成为常数,PICC编译时就会把这些“非位变量”存放到ROM里面去,以节省RAM空间;你知道的:程序空间比数据空间大得多,特别是遇到汉字码一般都会这样做的。
最后,在寻址这些变量时,PICC会自动生成相关的附加代码从程序空间读出这些常数‘变量’的。
需要注意的是:假如你加了const修饰后,你就不能对这些变量进行修改、赋值之类了,我想你应该也不会;其他就和我们对变量的 *** 作一样了,没什么特殊的,很多事情PICC都会完成,当然你得装了PICC的编译器,这是前提 。
打字不易,望推荐!
/
名称: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=0;i<31;i++)
{
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; //禁止编程/擦除 *** 作
}
PIC=peripheral interface control
pic集成了很多外围器件,例如CCP模块,通讯模块等
PIC 单片机是一个小的计算机,PIC单片机有计算功能和记忆内存像CPU并由软件控制允行。最好是有本教程然后自己就可以直接买件输入程序练习了。建议你先看看微机原理作为铺垫,C语言是必要的,另外学学汇编语言也是很有用的。
C语言在前期,就是你的汇编可以的情况下没有 太大的用,但是学到后面的话你就会发现会汇编很复杂,而C就会比较简单容易了
邮箱不知!大体程序见下
;设定PORTA:4为输入端,PORTA,0,1,2,3,四个端口为输出端,点动按键放开按键后,计数并
;且点亮相应的灯(4位二进制显示),循环检测按键,闪动为亮05秒灭05秒再亮05秒灭05,
;然后进入按键检测,键按下时,端口为高电平,放开为低电平
;之前设置省略
BANKSEL TRISA
MOVLW 10H
MOVWF TRISA ; 设定PORTA:4为输入端,PORTA,0,2,3,四个端口为输出端
JIANCE_CHU
BANKSEL PORTA
CLRL PORTA ;输出端口清零
CLRF JISHU
JIANCE_G ;检测按键是否按下
BTFSS PORTA,4
GOTO $-1
CALL DELAY_10
BTFSS PORTA,4
GOTO JIANCE_G
JIANCE_D ;检测按键是否松开
BTFSC PORTA,4
GOTO $-1
CALL DELAY_10
BTFSC PORTA,4
GOTO JIANCE_D
INCF JISHU,1;计数器加1
MOVF JISHU,0
SUBLW 10H ;检测按键次数是否超过15次
BTFSS STATUS,Z
GOTO XIAN ; 没有超过,进入显示程序段
MOVLW 0FH ;超过,进入闪烁程序
MOVWF PORTA ;灯全亮
CALL DELAY_500 ;延时500毫秒
CLRF PORTA ; 灯全灭
CALL DELAY_500
MOVLW 0FH
MOVWF PORTA
CALL DELAY_500
CLRF PORTA
GOTO JIAN_CHU;进入按键检测初始化
XIAN ;显示程序段
MOVF JISHU,0
CALL BIAO;进入查表程序,返回二进制代码送显
MOVWF PORTA
GOTO JIANCE_G;返回按键检测,是否按下
DELAY_10 ;10毫秒延时
;略
DELAY_500 ;500毫秒延时
;略
BIAO ;查表程序
;略
END
往pickit3中装载程序:
仅编程不需要接这个10K的上拉电阻。
这个上拉电阻时用PICKIT3作为调试器Debug时要加的,因为调试时,如果没有上拉电阻,PICKIT3在MCLR引脚上产生的Noise有可能导致目标MCU异常复位。
编程时MCLR引脚功能变成了Vpp,9V的编程电压会加在这个引脚上,此时这个10K上拉电阻有或没有对于编程时序都没有什么影响。
用编程器附带的烧写即可。 要确认这个编程器支持你的单片机型号。 连接编程器与电脑,运行编程器附带,在上面选择芯片型号和要烧写的文件,你这个是串口,可能还需要选择连接的串口号,然后点烧写即可,一般都是这样 *** 作
</ol>
1:第一个问号:是; 第二个问号:不一定;
2:一些C30有多种类型版本,你说的30C和36可能不是指同一种类型。
3:没破解的编译器过期就不能编译程序了。想用就需要重装(貌似它会在系统内记录的,所以应该是重装 *** 作系统才行)。
4:肯定不可靠。我有过编译经历,破解的编译出来的在逻辑上就会有问题。但这不影响普通学生入门者做设计。如果你是做工业、航天领域设计的,你的领导也不会让你用破解版或者未注册版。所以现在很多单位宁愿用汇编来编译程序。
PICC有支持 PIC10/12/16/18/24/32系列单片机 的C编译器。同时也支持dsPIC30/33 系列DSC芯片的C编译器
在使用PIC16F877A单片机时,如果使用定时器0,那么最好不要写TMR0,因为每次的写 *** 作都会导致定时器0的预分频器清零。一般都是定义一个变量,来做定时器0计时值的累计,这样才会将误差降到最小。另外就是仿真的时间不一定准确
以上就是关于如何把数据写到pic的固定程序区全部的内容,包括:如何把数据写到pic的固定程序区、请问PIC16F1938的闪存程序存储器怎么进行擦除和写 *** 作、想学习PIC编程要先学习什么等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)