在应广单片机的mini-c中,数组功能弱化,数组的下标不能是变量;比如array[i++]=0;是编译不通过的,如果要实现数组数据填充和数据拷贝,必须一个一个填充吗?不,那使用指针了.mini-c中,定义一个16bit的数就可以当成指针用.不多说,上代码
1.数组的连续寻址比如数据填充和拷贝,可以用指针+循环替换;
2.如果数组的下标是一个变量,那就必须用指针才能实现了;
3.如果数组的下标是一个固定的数,用数组原有操作方法就OK了;
#include "extern.h"
/*************常用宏定义*******************/
#define HIGH 1
#define LOW 0
#define DISABLE 0
#define ENABLE 1
#define EMPTY 0
#define FULL 1
#define ON 1
#define OFF 0
/*************端口定义*******************/
BIT LED_G : PA.3;
BIT TRG : PA.4;
#define GRE_LED_FLASH {if(LED_G){LED_G=0;}else{ LED_G=1;}}
/*****************LED*******************/
BIT ubMsFlag;
/****************系统时钟*********************/
byte count;
word usTmrCnt;
bit FLAG_NMS;
/**************T16*************************/
void TIME16_Init(void)
{
usTmrCnt=488;
ubMsFlag=0;
/*计算方法16M/*/
$ T16M IHRC,/1,BIT15;
INTEN.T16 =1;/*开启定时中断*/
Intrq.T16 =0;/*清除中断请求*/
}
/*定义数组*/
byte ucBindChn[10];
/*定义数组*/
byte ucTxDat[10];
/*定义指针*/
word point;
/*定义指针*/
word uspChn;
void FPPA0 (void)
{
.ADJUST_IC SYSCLK=IHRC/8, IHRC=16MHz,init_ram, VDD=3.0V;
$ CLKMD IHRC/8,En_IHRC,En_ILRC,En_WatchDog;
.delay 40000;
byte i;
byte ucDat;
$ LED_G OUT,HIGH;
$ TRG in,pull;
TIME16_Init();
ENGINT //全局中断开启
while (1)
{
wdreset;
/*取地址,吧数组的地址给到指针*/
point=ucTxDat;
/*循环次数,实现数据存入数组*/
i=10;
while(i--)
{
/*数据存入数组,把i存入数组*/
*point=i;
/*更新指针*/
point++;
}
/* 以上代码执行完成的话 ucTxDat[] 中填入了0-9的数了,实现数据填充*/
/*取地址,可以此处设置断点查看结果*/
uspChn=ucBindChn;
/*取地址,实现数组之间数据拷贝*/
point=ucTxDat;
i=10;
while(i--)
{
/*数据拷贝,*/
*uspChn=*point;
/*更新源指针*/
point++;
/*更新目的指针*/
uspChn++;
}
/* 以上代码执行完成的话,ucTxDat[] 中的数,拷贝到ucBindChn[]了,实现数据拷贝*/
/*要使用指针实现随机寻址,可以用下面操作*/
i=0;/*假如这个i是别处传过来的变量*/
/* 比如要实现dat=ucTxDat[i],如果i是别处传过来的变量,那么用以下方式*/
point=ucTxDat;
point+=i;
ucDat=*point;
/*如果i是一个具体数或固定数,不如这样方便*/
ucDat=ucTxDat[0];
/*1ms定时时间到*/
if( FLAG_NMS )
{
FLAG_NMS=0;
}
}
}
void Interrupt ( void )
{
pushaf;
if ( Intrq.T16 )
{
Intrq.T16 = 0;
STT16 usTmrCnt;
if ( count>0 )
{
count--;
}
else
{
count = 9;
/*1ms*/
FLAG_NMS= 1;
}
}
popaf;
}
/*end create by zhongvv QQ:85547259*/