📄 复件 (2) pedometer.c
字号:
LCD_SetColor(PEDOMETER_BACK_CLOLOR);
LCD_FillRect(PEDOMETER_NUMBER_CONSUMEPHOUR_X, PEDOMETER_NUMBER_CONSUMEPHOUR_Y, PEDOMETER_NUMBER_CONSUMEPHOUR_X+50, PEDOMETER_NUMBER_CONSUMEPHOUR_Y+16);
LCD_SetColor(0xFFFF);
LCD_NFDispStringAt(PEDOMETER_NUMBER_CONSUMEPHOUR_X, PEDOMETER_NUMBER_CONSUMEPHOUR_Y, tmpbuf);
LCD_SetColor(pcolor_tmp);
}
PEDOMETER_APP_CODE
void PDisplayStepFreqency(unsigned long StepFreqency)
{
unsigned int tmpbuf[8];
pcolor_tmp = LCD_GetColor();
Conver16To10Display(StepFreqency,tmpbuf);
LCD_SetColor(PEDOMETER_BACK_CLOLOR);
LCD_FillRect(PEDOMETER_NUMBER_STEPPMINUTE_X, PEDOMETER_NUMBER_STEPPMINUTE_Y, PEDOMETER_NUMBER_STEPPMINUTE_X+50, PEDOMETER_NUMBER_STEPPMINUTE_Y+16);
LCD_SetColor(0xFFFF);
LCD_NFDispStringAt(PEDOMETER_NUMBER_STEPPMINUTE_X, PEDOMETER_NUMBER_STEPPMINUTE_Y, tmpbuf);
LCD_SetColor(pcolor_tmp);
}
#else ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void PDisplayBodyWeight(unsigned long BodyWeight)
{
unsigned int tmpbuf[8];
unsigned int i;
Conver16To10Display(BodyWeight,tmpbuf);
for(i=0;i<5;i++)
tmpbuf[i]=tmpbuf[i]-'0';
for(i=2;i<5;i++)
{
DisplayPicture(PEDOMETER_NUMBER_BODY_WEIGHT_X+((i+1)*(MIDDLENUMBER_XSIZE)), PEDOMETER_NUMBER_BODY_WEIGHT_Y, MIDDLENUMBER_XSIZE, MIDDLENUMBER_YSIZE, NFA_MIDDLENUMBER_BASS+tmpbuf[i]*MIDDLENUMBER_XSIZE*MIDDLENUMBER_YSIZE*2);
// 每个数值的宽度 数字图片的地址
}
}
PEDOMETER_APP_CODE
void PDisplayBodyHeight(unsigned long BodyHeight)
{
unsigned int tmpbuf[8];
unsigned int i;
pcolor_tmp = LCD_GetColor();
Conver16To10Display(BodyHeight,tmpbuf);
for(i=0;i<5;i++)
tmpbuf[i]=tmpbuf[i]-'0';
for(i=2;i<5;i++)
{
DisplayPicture(PEDOMETER_NUMBER_STEP_SIZE_X+((i+1)*(MIDDLENUMBER_XSIZE)), PEDOMETER_NUMBER_STEP_SIZE_Y, MIDDLENUMBER_XSIZE, MIDDLENUMBER_YSIZE, NFA_MIDDLENUMBER_BASS+tmpbuf[i]*MIDDLENUMBER_XSIZE*MIDDLENUMBER_YSIZE*2);
// 每个数值的宽度 数字图片的地址
}
}
PEDOMETER_APP_CODE
void PDisplayTargetConsume(unsigned long Consume)
{
unsigned int tmpbuf[8];
unsigned int i;
pcolor_tmp = LCD_GetColor();
DIV100Conver16To10Display(Consume,tmpbuf);
for(i=0;i<7;i++)
tmpbuf[i]=tmpbuf[i]-'0';
tmpbuf[5]=10;//显示'.'
for(i=1;i<7;i++)
{
DisplayPicture(PEDOMETER_NUMBER_TARGET_CONSUME_X+((i-1)*(MIDDLENUMBER_XSIZE)), PEDOMETER_NUMBER_TARGET_CONSUME_Y, MIDDLENUMBER_XSIZE, MIDDLENUMBER_YSIZE, NFA_MIDDLENUMBER_BASS+tmpbuf[i]*MIDDLENUMBER_XSIZE*MIDDLENUMBER_YSIZE*2);
// 每个数值的宽度 数字图片的地址
}
}
PEDOMETER_APP_CODE
void PDisplayAdjustPosition(unsigned long AdjustPosition)
{
unsigned int tmpbufX[11]={104-1,112-1,120-1,104-1,112-1,120-1,80-1,88-1,96-1,104-1,120-1};//位置
unsigned int tmpbufY[11]={39+18, 39+18, 39+18, 69+18, 69+18, 69+18, 99+18,99+18,99+18,99+18, 99+18};//位置
unsigned int Front;
unsigned int Behind;
if(AdjustPosition>=11)//清掉前一位的指示
{
AdjustPosition=11;
Behind=1;
}
else
Behind=AdjustPosition+1;
if(AdjustPosition<=1)//清掉后一位的指示
{
Front=11;
AdjustPosition=1;
}
else
Front=AdjustPosition-1;
pcolor_tmp = LCD_GetColor();
LCD_SetColor(PEDOMETER_BACK_CLOLOR);
LCD_FillRect(tmpbufX[Behind-1], tmpbufY[Behind-1], tmpbufX[Behind-1]+PEDOMETER_SET_POSIT_XSIZE-1, tmpbufY[Behind-1]+PEDOMETER_SET_POSIT_YSIZE-1);
LCD_FillRect(tmpbufX[Front-1], tmpbufY[Front-1], tmpbufX[Front-1]+PEDOMETER_SET_POSIT_XSIZE-1, tmpbufY[Front-1]+PEDOMETER_SET_POSIT_YSIZE-1);
DisplayPicture(tmpbufX[AdjustPosition-1], tmpbufY[AdjustPosition-1], PEDOMETER_SET_POSIT_XSIZE, PEDOMETER_SET_POSIT_YSIZE, NFA_PEDOMETER_SET_POSIT);
}
PEDOMETER_APP_CODE
void PDisplayDistance(unsigned long Distance)
{
unsigned int tmpbuf[8];
unsigned int i;
pcolor_tmp = LCD_GetColor();
DIV10Conver16To10Display(Distance,tmpbuf);
for(i=0;i<7;i++)
tmpbuf[i]=tmpbuf[i]-'0';
tmpbuf[4]=10;//显示'.'
LCD_SetColor(PEDOMETER_BACK_CLOLOR);
//LCD_FillRect(PEDOMETER_NUMBER_DISTANCE_X, PEDOMETER_NUMBER_DISTANCE_Y, PEDOMETER_NUMBER_DISTANCE_X+PEDOMETER_NUMBER_DISTANCE_XSIZE, PEDOMETER_NUMBER_DISTANCE_Y+PEDOMETER_NUMBER_DISTANCE_YSIZE);
for(i=1;i<7;i++)
{
DisplayPicture(PEDOMETER_NUMBER_DISTANCE_X+((i-1)*(MIDDLENUMBER_XSIZE)), PEDOMETER_NUMBER_DISTANCE_Y, MIDDLENUMBER_XSIZE, MIDDLENUMBER_YSIZE, NFA_MIDDLENUMBER_BASS+tmpbuf[i]*MIDDLENUMBER_XSIZE*MIDDLENUMBER_YSIZE*2);
// 每个数值的宽度 数字图片的地址
}
LCD_SetColor(pcolor_tmp);
}
void PDisplayTotalConsume(unsigned long TotalConsume)
{
unsigned int tmpbuf[8];
pcolor_tmp = LCD_GetColor();
DIV100Conver16To10Display(TotalConsume,tmpbuf);
LCD_SetColor(PEDOMETER_BACK_CLOLOR);
LCD_FillRect(PEDOMETER_NUMBER_CONSUME_X, PEDOMETER_NUMBER_CONSUME_Y, PEDOMETER_NUMBER_CONSUME_X+8*5, PEDOMETER_NUMBER_CONSUME_Y+10);
LCD_SetColor(0xFFFF);
LCD_NFDispStringAt(PEDOMETER_NUMBER_CONSUME_X, PEDOMETER_NUMBER_CONSUME_Y, tmpbuf);
LCD_SetColor(pcolor_tmp);
}
PEDOMETER_APP_CODE
void PDisplayStepCounter(unsigned long StepCounter)
{
unsigned int tmpbuf[8];
pcolor_tmp = LCD_GetColor();
Conver16To10Display(StepCounter,tmpbuf);
LCD_SetColor(PEDOMETER_BACK_CLOLOR);
LCD_FillRect(PEDOMETER_NUMBER_STEP_X, PEDOMETER_NUMBER_STEP_Y, PEDOMETER_NUMBER_STEP_X+6*5, PEDOMETER_NUMBER_STEP_Y+10);
LCD_SetColor(0xFFFF);
LCD_NFDispStringAt(PEDOMETER_NUMBER_STEP_X, PEDOMETER_NUMBER_STEP_Y, tmpbuf);
LCD_SetColor(pcolor_tmp);
}
PEDOMETER_APP_CODE
void PDisplayTime(unsigned long TimeCounter)
{
unsigned int Hour;
unsigned int Minute;
unsigned int Second;
unsigned int i;
unsigned int tmpbuf[8];
Second=TimeCounter%60;
Minute=TimeCounter/60;
Hour=Minute/60;
Minute=Minute-Hour*60;
tmpbuf[0]=Hour/10;
tmpbuf[1]=Hour%10;
tmpbuf[2]=11;//显示':'
tmpbuf[3]=Minute/10;
tmpbuf[4]=Minute%10;
tmpbuf[5]=10;//显示'.'
tmpbuf[6]=Second/10;
tmpbuf[7]=Second%10;
for(i=0;i<8;i++)
{
DisplayPicture(PEDOMETER_TIMER_X+(i*(BIGNUMBER_XSIZE+2)), PEDOMETER_TIMER_Y, BIGNUMBER_XSIZE, BIGNUMBER_YSIZE, NFA_BIGNUMBER_BASS+tmpbuf[i]*BIGNUMBER_XSIZE*BIGNUMBER_YSIZE*2);
// 每个数值的宽度+2 数字图片的地址
}
}
PEDOMETER_APP_CODE
void PDisplayConsumeBar(unsigned long Consumer,TargerConsumer)
{
unsigned int tmpbuf[8];
pcolor_tmp = LCD_GetColor();
Conver16To10Display(StepCounter,tmpbuf);
LCD_SetColor(PEDOMETER_BACK_CLOLOR);
LCD_FillRect(PEDOMETER_NUMBER_STEP_X, PEDOMETER_NUMBER_STEP_Y, PEDOMETER_NUMBER_STEP_X+6*5, PEDOMETER_NUMBER_STEP_Y+10);
LCD_SetColor(0xFFFF);
LCD_NFDispStringAt(PEDOMETER_NUMBER_STEP_X, PEDOMETER_NUMBER_STEP_Y, tmpbuf);
LCD_SetColor(pcolor_tmp);
}
#endif
//=================================================================
// G sensor Read: MXC62020
// Addr: 0x20
// Detail : BGST ---- Initial the Temperature.
// Acce ----
// StepLoop: StepCount
// Temperature Read: Music menu.
//=================================================================
PEDOMETER_APP_CODE
unsigned int GsensorPowerOnDown(unsigned int poweronoff)
{
unsigned int status,i,j;
status=0;
PedoMeterIicInit();
//write_mem(IC_DATA_CMD,GSENSOR_I2C_ADDRESS);
write_mem(IC_DATA_CMD,0x00);//写
if(poweronoff==GS_POWERON)
write_mem(IC_DATA_CMD,0x00);// POWER On
else
write_mem(IC_DATA_CMD,0x01);// POWER Down
//////////////////////////////////////////////////////////
j = 0;
do {
if (++ j == 0xfff0)
{
status = 1;//Error
break;
}
} while (read_XDATA(IC_STATUS) & TFNF == 0);
//////////////////////////////////////////////////////////
return status;
}
PEDOMETER_APP_CODE
void GetAcceleration(void)
{
unsigned int status,i;
unsigned char temp,test[5];
unsigned int j;
test[0]=0;
test[1]=0;
test[2]=0;
test[3]=0;
test[4]=0;
PedoMeterIicInit();//选中I2C器件,其地址为0x20,开始写操作
write_mem(IC_DATA_CMD,0x01);//01准备从读X轴高4位开始读
for ( j=0; j < 4; j ++) {
write_XDATA(IC_DATA_CMD,0x100);
temp = 0;
do {
if (++ temp == 0xfff0)
break;
} while ((read_XDATA(IC_STATUS) & RFNE) == 0);
test[j] = read_XDATA(IC_DATA_CMD);
}
write_mem(IC_ENABLE, 0x0000); //IIC Transfer Disable
//MXC6202DataOut.Bytes.InternalReg=test[0];
MXC6202DataOut.Bytes.XaccMSB=test[0];
MXC6202DataOut.Bytes.XaccLSB=test[1];
MXC6202DataOut.Bytes.YaccMSB=test[2];
MXC6202DataOut.Bytes.YaccLSB=test[3];
Delay1Ms(2);
}
/*
********************************************************************************
* Copyright (C),2004-2007, Fuzhou Rockchip Electronics Co.,Ltd.
* Function name : CodecIicInit()
* Author: ZHengYongzhi
* Description: Codec通讯初始化,IIC配置
*
* Input:
* Output:
* Return:
* Calls:
*
* History: <author> <time> <version>
* ZhengYongzhi 2006/01/01 Ver1.0
* desc: ORG
* --------------------------------------------------------------------
* ZhengYongzhi 2007-5-7 Ver1.9
* desc: 修改IIC通讯的时序,解决因为IIC时序配置不正确时可能引起的Codec设置错误或不起作用的问题
********************************************************************************
*/
PEDOMETER_APP_CODE
void PedoMeterIicInit(void)
{
// write_mem(GPIO_PCON1,read_mem(GPIO_PCON1) & 0xffC3);//p1.1 p1.2 input
write_mem(GPIO_PCON1,read_mem(GPIO_PCON1) | 0x003C);//p1.1 p1.2 I2C_SDA I2C_SCL
write_mem(IC_ENABLE, 0x0000); //IIC Transfer Disable
bitset_mem(I2C_EXT,0); //外部的
write_mem(IC_SAR,0x55); /* IIC Slave address */
write_mem(IC_TAR,GSENSOR_I2C_ADDRESS); //6205 IIC Address
write_mem(IC_CON,0x63); /* Master Mode */
write_mem(IC_SS_HCNT,0x88);
write_mem(IC_SS_LCNT,0x66);
write_mem(IC_ENABLE, 0x0001); //IIC Transfer Enable
delay_nops(1600);
}
//=================================================================
// 1 Order Passive LPF
// LPF Formula
//Y(N)=(T*X(N)+RL*CL*Y(N-1)) / (T+RL*CL)
// 4Hz LPF RC=0.04
// 8Hz LPF RC=0.02
// 2PI * f * RC=1
// Sample Rate f=16 Hz, RC = 0.01 20Hz , 0.008;
// f=32Hz, RC= 0.008
//=================================================================
PEDOMETER_APP_CODE
unsigned long AccLPF(unsigned long iX0,unsigned long iY1)
{
iY1*=LPF_RC; //RC = 0x000003;
iY1+=((iX0*SAMPLE_TIME)+(LPF_RC+SAMPLE_TIME)/2);
iY1/=(LPF_RC+SAMPLE_TIME);
return iY1;
}
//=================================================================
// 1 Order Passive HPF
// HPF Formula
// Y(N)=RH*CH(X(N)-X(N-1)+Y(N-1))/(T+RH*CH)
// 1Hz HPF RC=0.16
// // 2PI * f * RC=1
// Sample Rate f=20Hz, RC = 0.008
// f=10Hz RC =0.016
//=================================================================
PEDOMETER_APP_CODE
unsigned long AccHPF(unsigned long iX0,unsigned long iX1, unsigned long iY1)
{
iY1+=(iX0-iX1);
iY1*=HPF_RC;
iY1+=0x008000+(HPF_RC+SAMPLE_TIME)/2; //RC = 0x000003;
iY1/=(HPF_RC+SAMPLE_TIME); // 0x000004; T+RC T=Timer*100,
return iY1;
}
//=================================================================
//
// StepLoop: StepCount
// Temperature Read: display at Music menu recommended.
//=================================================================
PEDOMETER_APP_CODE
void StepLoops(void)
{
bool bStatus_AXIS;
unsigned char iAccXData, iAccYData,iG_CountPEAK;
unsigned char iAcce_Sample;
unsigned char iAcce1_LPFcount0,iAcce0_LPFcount0,iAcce1_HPFcount0,iAcce0_HPFcount0,iAcceFilter0;
//INT iSportMode=0;
GetAcceleration(); // Read the data first
iAccXData=MXC6202DataOut.Bytes.XaccMSB;
iAccXData=MXC6202DataOut.Bytes.XaccLSB+(iAccXData<<8);
iAccYData=MXC6202DataOut.Bytes.YaccMSB;
iAccYData=MXC6202DataOut.Bytes.YaccLSB+(iAccYData<<8);
if (iAccYData>0X0900) bStatus_AXIS=1;//2304
if (iAccYData<0X0700) bStatus_AXIS=1;//1792
if (iAccXData>0X0900) bStatus_AXIS=0;
if (iAccXData<0X0700) bStatus_AXIS=0;
if(bStatus_AXIS)
iAcce_Sample=iAccYData;
else
iAcce_Sample=iAccXData;
iAcce_Sample*=0x10;
//BodyHeight=stc_iAcce1_LPFcount1;//Test Show
iAcce1_LPFcount0=AccLPF(iAcce_Sample,stc_iAcce1_LPFcount1);
iAcce0_LPFcount0=AccLPF(iAcce1_LPFcount0,stc_iAcce0_LPFcount1);
iAcce1_HPFcount0=AccHPF(iAcce0_LPFcount0,stc_iAcce0_LPFcount1,stc_iAcce1_HPFcount1);
iAcce0_HPFcount0=AccHPF(iAcce1_HPFcount0,stc_iAcce1_HPFcount1,stc_iAcce0_HPFcount1);
iAcceFilter0=iAcce0_HPFcount0/0x10;
//BodyWeight=iAcceFilter0;//Test Show
if (iAcceFilter0>0x000800 && iAcceFilter0>stc_iG_CountUP)
stc_iG_CountUP=iAcceFilter0;
if (iAcceFilter0<0x000800 && iAcceFilter0<stc_iG_CountDOWN)
stc_iG_CountDOWN=iAcceFilter0;
if (iAcceFilter0>=0x000800 && stc_iAcceFilter1<0x000800)
{
stc_iG_CountDOWN=0x000800-stc_iG_CountDOWN;
iG_CountPEAK=stc_iG_CountDOWN;
stc_iG_CountDOWN=0x000800;
if (iG_CountPEAK>SENS_PEDO)
stc_bStatUp=1;
else
stc_bStatUp=0;
}
if (iAcceFilter0<=0x000800 && stc_iAcceFilter1>0x000800)
{
stc_iG_CountUP=stc_iG_CountUP-0x000800;
iG_CountPEAK=stc_iG_CountUP;
stc_iG_CountUP=0x000800;
if (iG_CountPEAK>SENS_PEDO)
stc_bStatDown=1;
else
stc_bStatDown=0;
}
// StepCounter++;//test
if ( stc_bStatUp && stc_bStatDown )
{
StepCounter++;
// g_wMeter+= g_iStepLength;
stc_bStatUp=0;stc_bStatDown=0;
//
// if (iG_CountPEAK<SENS_WALK)
// iSportMode=0X00;
// if (iG_CountPEAK>SENS_WALK && iG_CountPEAK<SENS_JOGG)
// iSportMode=0X01;
// if (iG_CountPEAK>SENS_JOGG)
// iSportMode=0X02;
// if (iSportMode==0X00)
// stc_iStepDistance += STRI_WALK;
// if (iSportMode == 0X01)
// stc_iStepDistance += STRI_JOGG;
// if (iSportMode == 0X02)
// stc_iStepDistance += STRI_RUNN;
}
stc_iAcce0_LPFcount1=iAcce0_LPFcount0;
stc_iAcce1_LPFcount1=iAcce1_LPFcount0;
stc_iAcce0_HPFcount1=iAcce0_HPFcount0;
stc_iAcce1_HPFcount1=iAcce1_HPFcount0;
stc_iAcceFilter1=iAcceFilter0;
}
//***************************************************************************************************
/*
$Log: Pedometer.c,v $
*
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -