一、环境部署
查看赛元开发量产工具手册的2 SC LINK仿真使用说明章节
点击LOAD,仿真器下载程序成功如下图所示。
二、关于赛元单片机的一些使用总结
- 数码管动态扫描控制思路:利用定时器(3ms)+switch扫描,如果想前几位不显示,可以利用(Counter%x),如果(Counter%x)小于零,就不配置位控制直接跳过。Number(Counter%x);实现段控制。Number()函数的实现也是通过switch选择想要段控制显示的数字,每个数字由8个段控制实现。Counter是定时器计数值。
void LedSeg_Display(BOOL flag)
{
static u8 segIndex = 0;
if(flag)
{
DisplayTimerFlag = 0; //定时器定时结束标志清零
//控制当前的COM使能
segIndex = (++segIndex%8); //8位数码管循环显示
switch(segIndex)
{
case 5://
COM1(0);
COM2(0);
COM3(0);
COM4(0);
COM5(0);
COM6(0); //先关闭位控制,最后再开启位控制显示对应位,减少显示余影
COM7(0);
COM8(0);
Number(Counter%10);
seg_point(1); //段控制,最后一位有小数点要显示,单独提出来显示
COM6(1);
break;
default:
break;
}
}
}
void Number(U8 x)
{
if(x>=0)
{
x=x%10;
switch(x)
{
case 0:Numb0();
break;
case 1:Numb1();
break;
case 2:Numb2();
break;
case 3:Numb3();
break;
case 4:Numb4();
break;
case 5:Numb5();
break;
case 6:Numb6();
break;
case 7:Numb7();
break;
case 8:Numb8();
break;
case 9:Numb9();
break;
}
}
}
//================================================================
// 数码管配置
//================================================================
#define COM1(x) GPIO_WriteBit(GPIO3,GPIO_PIN_7,x);
#define COM2(x) GPIO_WriteBit(GPIO3,GPIO_PIN_6,x);
#define COM3(x) GPIO_WriteBit(GPIO3,GPIO_PIN_2,x);
#define COM4(x) GPIO_WriteBit(GPIO3,GPIO_PIN_3,x);
#define COM5(x) GPIO_WriteBit(GPIO3,GPIO_PIN_4,x);
#define COM6(x) GPIO_WriteBit(GPIO3,GPIO_PIN_5,x);
#define SEG_A(x) GPIO_WriteBit(GPIO2,GPIO_PIN_5,!x);
#define SEG_B(x) GPIO_WriteBit(GPIO2,GPIO_PIN_4,!x);
#define SEG_C(x) GPIO_WriteBit(GPIO2,GPIO_PIN_3,!x);
#define SEG_D(x) GPIO_WriteBit(GPIO2,GPIO_PIN_2,!x);
#define SEG_E(x) GPIO_WriteBit(GPIO2,GPIO_PIN_1,!x);
#define SEG_F(x) GPIO_WriteBit(GPIO2,GPIO_PIN_0,!x);
#define SEG_G(x) GPIO_WriteBit(GPIO1,GPIO_PIN_7,!x);
#define SEG_X(x) GPIO_WriteBit(GPIO1,GPIO_PIN_6,!x);
#define Numb0() {SEG_A(1) SEG_B(1) SEG_C(1) SEG_D(1) SEG_E(1) SEG_F(1) SEG_G(0) SEG_X(0) }
#define Numb1() {SEG_A(0) SEG_B(1) SEG_C(1) SEG_D(0) SEG_E(0) SEG_F(0) SEG_G(0) SEG_X(0) }
#define Numb2() {SEG_A(1) SEG_B(1) SEG_C(0) SEG_D(1) SEG_E(1) SEG_F(0) SEG_G(1) SEG_X(0) }
#define Numb3() {SEG_A(1) SEG_B(1) SEG_C(1) SEG_D(1) SEG_E(0) SEG_F(0) SEG_G(1) SEG_X(0) }
#define Numb4() {SEG_A(0) SEG_B(1) SEG_C(1) SEG_D(0) SEG_E(0) SEG_F(1) SEG_G(1) SEG_X(0) }
#define Numb5() {SEG_A(1) SEG_B(0) SEG_C(1) SEG_D(1) SEG_E(0) SEG_F(1) SEG_G(1) SEG_X(0) }
#define Numb6() {SEG_A(1) SEG_B(0) SEG_C(1) SEG_D(1) SEG_E(1) SEG_F(1) SEG_G(1) SEG_X(0) }
#define Numb7() {SEG_A(1) SEG_B(1) SEG_C(1) SEG_D(0) SEG_E(0) SEG_F(0) SEG_G(0) SEG_X(0) }
#define Numb8() {SEG_A(1) SEG_B(1) SEG_C(1) SEG_D(1) SEG_E(1) SEG_F(1) SEG_G(1) SEG_X(0) }
#define Numb9() {SEG_A(1) SEG_B(1) SEG_C(1) SEG_D(1) SEG_E(0) SEG_F(1) SEG_G(1) SEG_X(0) }
#define Numbx() {SEG_A(0) SEG_B(0) SEG_C(0) SEG_D(0) SEG_E(0) SEG_F(0) SEG_G(0) SEG_X(1) }
2.硬件实现数码管显示,注意要与芯片上的引脚对应,Cx为位选控制引脚,通过0-7数值控制位选,Sx为段控制引脚,查表获取其对应的操作地址。
//led_display.c
#include "LED_DISPLAY.H"
//-----------------------共阴数码管编码表---------------------------
//uint8_t code LedCodeTab[]={0xD7,0x14,0xCD,0x5D,0x1E,0x5B,0xDB,0x15,0xDf,0x5F,0x9F,0xDA,0xC3,0xDC,0xCB,0x8B,0x00,0xff,0x08};
//-----------------------共阳数码管编码表---------------------------
uint8_t code LedCodeTab[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
//-----------------------LED显示RAM数据缓存数组----------------
uint8_t data LedTemp[8] = {0,0,0,0,0,0,0,0};
//-----------------------LED显示RAM配置-----------------------
uint8_t xdata LedDisplay[28] _at_ 0X700;
void LedSeg_initail(void)
{
// 软件实现
#if 0
COM1(0);
COM2(0);
COM3(0);
COM4(0);
COM5(0);
COM6(0);
//seg0-7 output
GPIO_Init(GPIO1, _BIT6|_BIT7, GPIO_MODE_OUT_PP);
GPIO_Init(GPIO2, _BIT5|_BIT4|_BIT3|_BIT2|_BIT1|_BIT0, GPIO_MODE_OUT_PP);
//comm1-6 output
//GPIO_Init(GPIO3, _BIT5|_BIT4|_BIT3|_BIT2|_BIT1|_BIT0, GPIO_MODE_OUT_PP);
GPIO_Init(GPIO3, _BIT5|_BIT4|_BIT3|_BIT2|_BIT6|_BIT7, GPIO_MODE_OUT_PP);
GPIO_WriteBit(GPIO1, _BIT6|_BIT7,0);
GPIO_WriteBit(GPIO2, _BIT5|_BIT4|_BIT3|_BIT2|_BIT1|_BIT0,0);
GPIO_WriteBit(GPIO3, _BIT5|_BIT4|_BIT3|_BIT2|_BIT6|_BIT7,0);
#endif
// 硬件实现
DDIC_Init(DDIC_DUTYCYCLE_D6, 0X00, 0XC0, 0X3F, 0XFC); //占空比1/6,P16~P17,P20~P25,P32~P37为DDIC输出脚
DDIC_LEDConfig(); //DDIC配置为LED模式
DDIC_Cmd(ENABLE); //数码管初始化
}
/**************************************************
*函数名称:void LedSegData(UINT8 LedData,LedSelCOM COMx)
*函数功能:LED显示数据转换
*入口参数:LedData LED显示数据
COMx COM口选择(取值范围:LEDCOM0~7)
*出口参数:void
*功能说明:
**************************************************/
void LedSegData(uint8_t LedData,LedSelCOM COMx)
{
LedTemp[0] |= ((LedData>>0)&0x01)<<COMx;
LedTemp[1] |= ((LedData>>1)&0x01)<<COMx;
LedTemp[2] |= ((LedData>>2)&0x01)<<COMx;
LedTemp[3] |= ((LedData>>3)&0x01)<<COMx;
LedTemp[4] |= ((LedData>>4)&0x01)<<COMx;
LedTemp[5] |= ((LedData>>5)&0x01)<<COMx;
LedTemp[6] |= ((LedData>>6)&0x01)<<COMx;
LedTemp[7] |= ((LedData>>7)&0x01)<<COMx;
}
/**************************************************
*函数名称:void Led_Display(void)
*函数功能:led
*入口参数:无
*出口参数:void
*功能说明:COM口必须跟使用的COM相对应
**************************************************/
void Led_Display(void)
{
UINT8 i;
g_bLEDDispTimerFlag = 0; //数码管调用标志位
for(i=0;i<8;i++)
{
LedTemp[i]=0; //段显示清零,此处不能删除 !!!!!
}
LedSegData(LedCodeTab[(g_bTimeHourHight16%1000/100)], LEDCOM7); // 第一位数码管
LedSegData(LedCodeTab[(g_bTimeHourHight16%100/10)], LEDCOM6); // 第二位数码管
LedSegData(LedCodeTab[(g_bTimeHourHight16%10)], LEDCOM2); // 第三位数码管
LedSegData(LedCodeTab[(g_bTimeHourLow16%1000/100)], LEDCOM3); // 第四位数码管
LedSegData(LedCodeTab[(g_bTimeHourLow16%100/10)], LEDCOM4); // 第五位数码管
LedSegData(LedCodeTab[(g_bTimeHourLow16%10)]&0x7F, LEDCOM5); // 第六位数码管,带小数点显示
LedDisplay[17] = LedTemp[0];
LedDisplay[16] = LedTemp[1];
LedDisplay[15] = LedTemp[2];
LedDisplay[14] = LedTemp[3];
LedDisplay[13] = LedTemp[4];
LedDisplay[12] = LedTemp[5];
LedDisplay[11] = LedTemp[6];
LedDisplay[10] = LedTemp[7];
}
//led_display.h
#ifndef _LED_DISPLAY_H_
#define _LED_DISPLAY_H_
#include "sc92f754x.h"
typedef enum {
LEDCOM0 = (uint8_t)0x00,
LEDCOM1 = (uint8_t)0x01,
LEDCOM2 = (uint8_t)0x02,
LEDCOM3 = (uint8_t)0x03,
LEDCOM4 = (uint8_t)0x04,
LEDCOM5 = (uint8_t)0x05,
LEDCOM6 = (uint8_t)0x06,
LEDCOM7 = (uint8_t)0x07
} LedSelCOM;
void LedSegData(uint8_t LedData,LedSelCOM COMx);
void Led_Display(void);
#endif
3.控制蜂鸣器响的频率思路:通过定时器定时反转蜂鸣器IO口电平实现
void Timer0Init(void)
{
TIM0_TimeBaseInit(TIM0_PRESSEL_FSYS_D1,TIM0_MODE_TIMER); //定时产生方波驱动蜂鸣器
TIM0_WorkMode0Config(8192-1600);
TIM0_Cmd(ENABLE);
TIM0_ITConfig(ENABLE,LOW);
//使能Timer0计数
}
void Timer0Interrupt() interrupt 1
{ TIM0_Mode0SetReloadCounter(8192-1600); //定时0.1ms, 频率10Khz
T0FlagpwmCount++;
if(T0FlagpwmCount>=5) // 2khz
{ T0FlagpwmCount = 0;
BuzzerPWM();
}
}
void BuzzerPWM(void)
{ static BOOL Flag = 0;
Flag = !Flag;
if(Flag)
{
GPIO_WriteHigh(GPIO1,GPIO_PIN_0);
}
else{
GPIO_WriteLow(GPIO1,GPIO_PIN_0);
}
}
4.关于74HC595的使用
#define DCLK(x)
if(x){GPIO_WriteHigh(hw_CLK_Pin_36());}
else{GPIO_WriteLow(hw_CLK_Pin_36());}
#define DATA(x)
if(x){GPIO_WriteHigh(hw_DATA_Pin_32());}
else{GPIO_WriteLow(hw_DATA_Pin_32());}
#define RCLK_L(x)
if(x){GPIO_WriteHigh(hw_CS_Pin_35());}
else{GPIO_WriteLow(hw_CS_Pin_35());}
//全输出
hc595_send_data(0X00);
//不输出
hc595_send_data(0XFF);
void hc595_send_data( u8 input_data )
{
u8 i;
DCLK(1);//SHCP
RCLK_L(1);//STCP
for( i = 0 ; i < 8; i++ )
{
DATA((input_data >> 7)&0x01); //DS
input_data <<= 1;
DCLK(0);//SHCP
_nop_(); _nop_(); _nop_(); _nop_(); DCLK(1);//SHCP
}
RCLK_L(0);//STCP
_nop_(); _nop_(); _nop_(); _nop_();
RCLK_L(1);//STCP
}
5.ADC使用,返回值为0.0到1.0
#include "sc92f754x_adc.h"
void ADCInit(void)
{
ADC_Init(ADC_PRESSEL_FOSC_D6, ADC_Cycle_6Cycle); ADC_ChannelConfig(ADC_CHANNEL_11, ENABLE);
ADC_Cmd(ENABLE);
ADC_VrefConfig(ADC_VREF_VDD);
}
float GetADCValue(void)
{
#define MAX_RES 180
#define MIN_RES 8
#define UP_RES 100 //分压电阻值
#define MIN_ADC (256*MIN_RES/(MIN_RES+UP_RES))
#define MAX_ADC ((uint16_t)256*MAX_RES/(uint16_t)(MAX_RES+UP_RES))
static uint8_t AdcBuf[10] = {0};
static uint8_t index = 0;
float adcValue=0.0;
ADC_ChannelConfig(ADC_CHANNEL_11, ENABLE);
ADC_StartConversion(); //开始一次ADC转换
while(!ADC_GetFlagStatus()); //转换完成,等待标志位置1
ADC_ClearFlag();
AdcBuf[index]= ADC_GetConversionValue(); //得到ADC转换值
if(AdcBuf[index] >= 0XF0) { adcValue = 0.0; }
else {
index = (++index)%10;ADC_Value= (AdcBuf[0]+AdcBuf[1]+AdcBuf[2]+AdcBuf[3]+AdcBuf[4]+AdcBuf[5]+AdcBuf[6]+AdcBuf[7]+AdcBuf[8]+AdcBuf[9])/10;
if(ADC_Value<MIN_ADC)
{ ADC_Value = MIN_ADC; }
if(ADC_Value>MAX_ADC) { ADC_Value = MAX_ADC; }
adcValue= (float)(ADC_Value-MIN_ADC)/(MAX_ADC-MIN_ADC); }
return adcValue;
}
uint16_t ADC_GetConversionValue(void)
{
uint16_t temp;
//temp = (uint16_t)(ADCVH<<4) + (ADCVL>>4); //取高8位和低4位合成12位
temp = (uint16_t)(ADCVH); //只取高8位
return temp;
}
6.ADC取表值,ADC读取值转化为范围为0~100的值。返回值为0.0到1.0(反向)
#include "sc92f754x_adc.h"
//表值,获取ADC读取值在表中的下标值,0~25,再乘以4,即可通过ADC读取值转化为范围为0~100的值。
uint16_t code AdcWaterValue[26] =
{
30 , 102 , 107 , 112 , 117 , 126 , 133 , 139 , 145 , 150 ,
155 , 160 , 163 , 165 , 167 , 169 , 171 , 173 , 175 , 177 ,
179 , 181 , 183 , 185 , 187 , 189
};
/**************************************************
*函数名称:void AdcWaterInit(void)
*函数功能:ADC初始化
*入口参数:void
*出口参数:void
*功能说明:使能ADC通道14,参考电压为VDD
**************************************************/
void AdcWaterInit(void)
{
ADC_Init(ADC_PRESSEL_FOSC_D6, ADC_Cycle_6Cycle);
ADC_ChannelConfig(ADC_CHANNEL_0, ENABLE); // 20201224
ADC_Cmd(ENABLE);
ADC_VrefConfig(ADC_VREF_VDD);
}
/**************************************************
*函数名称:void GetADCValue(void)
*函数功能:得到温度值在数组ADCValueToTemp[]的下标值
*入口参数:void
*出口参数:void
*功能说明:每个下标值测十次,去掉最高最低值求平均值
**************************************************/
float GetAdcWaterValue(void)
{
// 水温传感器温度与电阻关系: 75度195+-10Ω 110度 72+-5Ω
// 直接将最大最小值替换就行了,由于没有水温变化曲线,目前是线性处理
//#define MAX_RES 195 //20201109
//#define MIN_RES 72 //20201109
#define MAX_RES 250 //20201225
#define MIN_RES 25 //20201225
#define UP_RES 100 //上拉电阻分压
#define MIN_ADC (256*MIN_RES/(MIN_RES+UP_RES))
#define MAX_ADC ((uint16_t)256*MAX_RES/(uint16_t)(MAX_RES+UP_RES))
// 256*72/172=107 256*195/295=169
uint8_t j,TEMP;
static uint8_t AdcBuf[20] = {0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa};
static uint8_t index = 0;
static u16 PreValue = 0;
static u16 CurValue = 0;
uint16_t AdcWater_Value;
float adcValue=0.0;
ADC_ChannelConfig(ADC_CHANNEL_0, ENABLE); // 20201224
ADC_StartConversion(); //开始一次ADC转换
while(!ADC_GetFlagStatus()); //转换完成,等待标志位置1
ADC_ClearFlag();
AdcBuf[index]= ADC_GetConversionValue(); //得到ADC转换值
//20201107 当ADC 采集到滑阻数值到达这个程度时,电机不转了,加了这段解决
if(AdcBuf[index] >= 0XF0)
{
adcValue = 1.0; // 检测有没有接传感器
}
else
{
index = (++index)%20;
CurValue = (AdcBuf[0]+AdcBuf[1]+AdcBuf[2]+AdcBuf[3]+AdcBuf[4]+AdcBuf[5]+AdcBuf[6]+AdcBuf[7]+AdcBuf[8]+AdcBuf[9]+AdcBuf[10]+AdcBuf[11]+AdcBuf[12]+AdcBuf[13]+AdcBuf[14]+AdcBuf[15]+AdcBuf[16]+AdcBuf[17]+AdcBuf[18]+AdcBuf[19])/20;
//防止在临界值摆动,如果这次的ADC 值与上次ADC 值相差不大,则取上次值。
if(Abs(PreValue,CurValue)<2)
{
AdcWater_Value=PreValue;
}
else
{
AdcWater_Value=CurValue;
}
PreValue=AdcWater_Value;
for(j=0;j<26;j++)
{
if(AdcWater_Value<AdcWaterValue[0])
{
TEMP = 0; //取得最小值
break;
}
if((j+1)>25)
{
TEMP = 25; //数组最大下标不越界
break;
}
if((AdcWater_Value >= AdcWaterValue[j]) && (AdcWater_Value < AdcWaterValue[j+1]))
{
TEMP = j; //得转换值对应数组下标
break;
}
}
adcValue=(float)(TEMP*4)/100;
if(adcValue>1){adcValue=1;} //防错处理
if(adcValue<0){adcValue=0;}
}
return (1-adcValue); // 输出反向
}
//返回两个数的绝对差值
u16 Abs(u16 Val1,u16 Val2)
{
if(Val1 >= Val2)
{
return (Val1-Val2);
}
else
{
return (Val2-Val1);
}
}
7.EEPROM使用
#define _VE2PROM_C_
#include "FUNCTION.H"
#include "sc92f754x.h"
#ifdef _MAIN_C_
#define _EXTERN_
#else
#define _EXTERN_ extern
#endif
_EXTERN_ WORKDATA g_WorkData;
#define address0 5
#define address1 6
#define address2 7
#define address3 8
#define address4 9
#define address5 10
#define address6 11
#define address7 12
typedef struct t_WorkData
{
u8 _0XAA;
u8 ReserveBuf[4];
u8 _0X55;
u8 XorSum;
}WORKDATA;
BOOL VerifySetting(WORKDATA WorkData,u8 numb)
{
u8 i;
u8 tmpCheckSum = 0x00;
u8* pDat=(u8 *)&WorkData;
if((WorkData._0X55== 0x55) && (WorkData._0XAA== 0xaa))
{
for(i = 0; i < (numb-1); i++)
{
tmpCheckSum ^= pDat[i];
}
if(WorkData.XorSum == tmpCheckSum)
{
return(1);
}
else
{
return(0);
}
}
else
{
return(0);
}
}
void E2promXorSum(WORKDATA *pE2p,u8 length)
{
u8 i;
u8 tmpCheckSum = 0x00;
u8* pDat=(u8*)pE2p;
pE2p->_0X55 = 0x55;
pE2p->_0XAA = 0xaa;
for(i = 0; i < (length-1); i++)
{
tmpCheckSum ^= pDat[i];
}
//printf(" VerifySetting tmpCheckSum=:%d\n",tmpCheckSum);
pE2p->XorSum = tmpCheckSum;
}
void ReadWorkData(void)
{
u8 high=0;
u8 low=0;
u8 B8bit=0,B16bit=0,B24bit=0,B32bit=0;
IAP_SetHoldTime(IAP_HOLDTIME_1500US); //HoldTime时间为1MS
IAP_SetOperateRange(IAP_OPERATERANGE_ONLY_EEPROM); //只允许EEPROM进行IAP操?
g_WorkData._0XAA=IAP_ReadByte(address0,IAP_MEMTYPE_EEPROM);
g_WorkData.ReserveBuf[0]=IAP_ReadByte(address1,IAP_MEMTYPE_EEPROM);
g_WorkData.ReserveBuf[1]=IAP_ReadByte(address2,IAP_MEMTYPE_EEPROM);
g_WorkData.ReserveBuf[2]=IAP_ReadByte(address3,IAP_MEMTYPE_EEPROM);
g_WorkData.ReserveBuf[3]=IAP_ReadByte(address4,IAP_MEMTYPE_EEPROM);
g_WorkData._0X55=IAP_ReadByte(address5,IAP_MEMTYPE_EEPROM);
g_WorkData.XorSum=IAP_ReadByte(address6,IAP_MEMTYPE_EEPROM);
if(VerifySetting(g_WorkData,sizeof(WORKDATA)))
{
IAP_SetHoldTime(IAP_HOLDTIME_1500US); //HoldTime时间为1MS
IAP_SetOperateRange(IAP_OPERATERANGE_ONLY_EEPROM); //只允许EEPROM进行IAP操?
g_WorkData.ReserveBuf[0]=IAP_ReadByte(address1,IAP_MEMTYPE_EEPROM);
g_WorkData.ReserveBuf[1]=IAP_ReadByte(address2,IAP_MEMTYPE_EEPROM);
g_WorkData.ReserveBuf[2]=IAP_ReadByte(address3,IAP_MEMTYPE_EEPROM);
g_WorkData.ReserveBuf[3]=IAP_ReadByte(address4,IAP_MEMTYPE_EEPROM);
}
else
{
g_WorkData._0X55 =0X55;
g_WorkData._0XAA = 0Xaa;
g_WorkData.ReserveBuf[0]=0;
g_WorkData.ReserveBuf[1]=0;
g_WorkData.ReserveBuf[2]=0;
g_WorkData.ReserveBuf[3]=0;
E2promXorSum(&g_WorkData,sizeof(WORKDATA));
}
//由于测试时32位的变量值结果只有65535,只好使用2个16位变量代替
B8bit=g_WorkData.ReserveBuf[0];
B16bit=g_WorkData.ReserveBuf[1];
B24bit=g_WorkData.ReserveBuf[2];
B32bit=g_WorkData.ReserveBuf[3];
g_bTimeHourLow16=(B16bit << 8) | B8bit;
g_bTimeHourHight16=(B32bit << 8) | B24bit;
}
void SaveWorkData(void)
{
uint8_t i=0;
uint8_t *pData;
g_WorkData._0XAA = 0XAA;
g_WorkData._0X55 = 0X55;
g_WorkData.ReserveBuf[0]=g_bTimeHourLow16 & 0xff; // 8位
g_WorkData.ReserveBuf[1]=(g_bTimeHourLow16 >> 8) & 0xff; // 16位
g_WorkData.ReserveBuf[2]=g_bTimeHourHight16 & 0xff; // 24位
g_WorkData.ReserveBuf[3]=(g_bTimeHourHight16 >> 8) & 0xff; // 32位
E2promXorSum(&g_WorkData,sizeof(WORKDATA));
pData = (uint8_t *)&g_WorkData;
IAP_SetHoldTime(IAP_HOLDTIME_1500US); //HoldTime时间为1.5MS
IAP_SetOperateRange(IAP_OPERATERANGE_ONLY_EEPROM); //只允许EEPROM进行IAP操?
for(i=5;i<12;i++)
{
IAP_ProgramByte(i, pData[i-5], IAP_MEMTYPE_EEPROM, 0xf0);
}
}