⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main_block0.c

📁 用SST89系列单片机存储超过64K的数据的一个例子,可节省外部的24C512,24C16,24C02等EEPROM,既省出了I/O的口,又增加了数据的保密性.
💻 C
字号:
//#pragma
/***********************************************************************************************************
* IAP_SSTmcu.c - SST89X564/554 SST89X516/58/54/52RD2的FLASH作为单字节的EEPROM数据存储器的用法
*            弘微科技(SPAC)  田伯运    
*		WEB: www.spacltd.com.cn 	TEL:0755-26010579   E-MAIL:andy.tian@spacltd.com.cn
*
* 功能介绍: 
*		1.主要是演示如何使用SST的MCU(SST89X564/554 SST89X516/58/54/52RD2)的内部FLASH的在线擦除编程作为EEPROM存储数据
*
*   功能:可以对单片机内部的FLASH存储器的内容进行单字节或多个单元的改写更新,从而很简单的实现数据存储等功能.
*   用法:只需调用modify_single_byte_flash(ADDR,DATA)函数便可对指定的FLASH单元的内容进行改写;
*		 只需调用modify_multi_byte_flash(begin_ADDR,counter,DATA_array)函数便可对指定起始地址的多个FLASH单元的内容进行改写;
*        不用考虑具体FLASH的操作命令.注意要将IAP_SSMCU.C文件加入到你的项目中即可.
***********************************************************************************************************/
#include <SST89x5xxRD2.H>		//加入SST MCU单片机的头文件,这样就剩去了许多的特殊寄存器的声明,	 							
#include <stdio.h>				
/***********************************************************************************************************
* 用到的外部函数声明
***********************************************************************************************************/
extern bit modify_single_byte_flash(unsigned short int Address, unsigned char dataByte);//字节编程函数
extern bit modify_multi_byte_flash(unsigned int Begin_Addr, unsigned char counter, unsigned int array[]);//修改多个FLASH地址单元的内容
extern unsigned char Flash_byte_read(unsigned short int Address); //读FLASH地址单元内容的函数
/***********************************************************************************************************
* Global Variable Definition
***********************************************************************************************************/
sbit LED_ERR = P1^2;/* 测试常量数组 */
sbit LED_OK  = P1^3;
/***********************************************************************************************************
* Function Prototype,用到的函数声明
***********************************************************************************************************/
/* 测试常量数组 */
unsigned code Test_array[8] = {0x60, 0x61,0x62,0x63,0x64,0x65,0x66,0x67};
/***********************************************************************************************************
* 本文件中的几个函数
***********************************************************************************************************/
void DelayUs(unsigned char n);		//一个外部在BLOCK1块内的C51函数
void DelayMs(unsigned char n);		//一个外部在BLOCK1块内的C51函数
void delay_100ms(unsigned char n);	//延时100MS函数,一个外部在BLOCK1块内的C51函数
/***********************************************************************************************************
* IAP演示主程序
***********************************************************************************************************/
void main()
{
	unsigned short int Flash_addr = 0x1000;	//定义一个EEPROM的数据地址,DATAFLASH_ADDR_START;//擦除与编程的首地址
	unsigned  char xdata Test_data_xram;	//定义两个内部扩展RAM区域的全局变量,测试XRAM是否会被局部128个的XRAM缓冲区冲掉

	LED_ERR=~LED_ERR;						//点亮一个指示灯

	//----------------------修改一个FLASH单元的函数测试--------------------------
	modify_single_byte_flash(Flash_addr, 0xe7);					//将内部的FLASH存储器的Flash_addr单元的内容修改为0XE7
	modify_single_byte_flash(Flash_addr, 0x23);					//将内部的FLASH存储器的Flash_addr单元的内容修改为0X23
	modify_single_byte_flash(Flash_addr+1, 0x45);					//将内部的FLASH存储器的Flash_addr单元的内容修改为0X45

	//----------------------连续修改多个FLASH单元的函数测试--------------------------
	modify_multi_byte_flash(Flash_addr+0x0100,0x04,Test_array);	//将内部的FLASH存储器的Flash_addr+0x100的连续8个地址单元的内容
																	//修改为Test_array数组的前4个字节的内容---0x60, 0x61,0x62,0x63
	modify_multi_byte_flash(Flash_addr+0x0100,0x04,Test_array+4);	//将内部的FLASH存储器的Flash_addr+0x100的连续8个地址单元的内容修改为Test_array数组的后4个字节的内容
																	//修改为Test_array数组的后4个字节的内容---0x64,0x65,0x66,0x67

	//----------------------读一个FLASH单元的函数测试----------------------------------
	Test_data_xram=Flash_byte_read(Flash_addr);				//将内部的FLASH存储器的Flash_addr单元的内容读出来放到内部的扩展XRAM存储器的data_xram_2单元.


	while(1)
		{	
			LED_OK=~LED_OK;					//闪烁成功和错误指示灯(P1.3和P1.2),表示编程成功
			LED_ERR=~LED_ERR;
			delay_100ms(10);//调用C_BLOCK1.C C语言在BLOCK1中的0XF800地址的子程序1
			DelayMs(3);		//调用C_BLOCK1.C C语言在BLOCK1中的0XF800地址的子程序2
			DelayUs(3);		//调用C_BLOCK1.C C语言在BLOCK1中的0XF800地址的子程序3
		}
 }

 //-------------------几个延时函数-------------------------------------------------------
//******************************************************
//	delay_100ms:延时100毫秒的函数;按照晶振为12MHZ计算
//******************************************************
void DelayUs(unsigned char n)
{
	while(n--);
}

//Using 12M
void DelayMs(unsigned char n)
{
	unsigned char i;
	for(;n>0;n--)
	{
		for(i=0;i<160;i++);
		for(i=0;i<165;i++);
	}
}


void delay_100ms(unsigned char n)
{
	unsigned int i;	
	for(;n>0;n--)
	{
		for(i=0;i<2000;i++);	
	}
}	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -