📄 复件 pedometer.c
字号:
nTagert[5] = '.';
score_tmp = score_tmp%10 +'0';
nTagert[6] = score_tmp;
nTagert[7] = 0;
}
PEDOMETER_APP_CODE
void Conver16To10Display(unsigned long nSource,unsigned int *nTagert)//nTagert最好设置8成员个大小
{
unsigned long score_tmp;
score_tmp = nSource;
nTagert[0] = score_tmp/10000+'0';
score_tmp = score_tmp%10000;
nTagert[1] = score_tmp/1000 +'0';
score_tmp = score_tmp%1000;
nTagert[2] = score_tmp/100 +'0';
score_tmp = score_tmp%100;
nTagert[3] = score_tmp/10 +'0';
score_tmp = score_tmp%10 +'0';
nTagert[4] = score_tmp;
nTagert[5] = 0;
}
PEDOMETER_APP_CODE
void PedometerDispInit(void)
{
unsigned int color_tmp;
unsigned int tmpbuf[8];
unsigned long score_tmp;
//------------------------------------------------------------------------------
// 以下为界面相关的初始化(测试用的简单)
//------------------------------------------------------------------------------
color_tmp = LCD_GetColor();
LCD_SetColor(0xFFFF);
#ifndef TEST_PEDOMETER_UI
DisplayPicture(0, 0, PEDOMETER_BACK_XSIZE, PEDOMETER_BACK_YSIZE, NFA_PEDOMETER_BACK);
DisplayPicture(PLAY_BATT_X, PLAY_BATT_Y, PLAY_BATT_XSIZE, PLAY_BATT_YSIZE, NFA_PLAY_BATT + (unsigned long)(PLAY_BATT_XSIZE*PLAY_BATT_YSIZE*2*(BatteryLevel)));
#endif
#ifdef TEST_PEDOMETER_UI
LCD_NFDispStringAt(PEDOMETER_TEXT_BODY_WEIGHT_X,PEDOMETER_TEXT_BODY_WEIGHT_Y, "WEIGHT:");
LCD_NFDispStringAt(PEDOMETER_TEXT_BODY_HEIGHT_X,PEDOMETER_TEXT_BODY_HEIGHT_Y, "HEIGHT:");
LCD_NFDispStringAt(PEDOMETER_TEXT_STEP_X,PEDOMETER_TEXT_STEP_Y, "STEP:");
LCD_NFDispStringAt(PEDOMETER_TEXT_XNUMBER_X,PEDOMETER_TEXT_XNUMBER_Y, "X:");
LCD_NFDispStringAt(PEDOMETER_TEXT_YNUMBER_X,PEDOMETER_TEXT_YNUMBER_Y, "Y:");
LCD_NFDispStringAt(PEDOMETER_TEXT_DISTANCE_X,PEDOMETER_TEXT_DISTANCE_Y, "DISTANCE:");
LCD_NFDispStringAt(PEDOMETER_TEXT_CONSUME_X,PEDOMETER_TEXT_CONSUME_Y, "CONSUME:");
LCD_NFDispStringAt(PEDOMETER_TEXT_TIMER_X,PEDOMETER_TEXT_TIMER_Y, "TIMER:");
LCD_NFDispStringAt(PEDOMETER_TEXT_CONSUMEPHOUR_X,PEDOMETER_TEXT_CONSUMEPHOUR_Y, "CONSUME/H:");
LCD_NFDispStringAt(PEDOMETER_TEXT_STEPPMINUTE_X,PEDOMETER_TEXT_STEPPMINUTE_Y, "STEPF/M:");
#endif
GetAcceleration();
///////////////////////////////////////////////
Xnumber=MXC6202DataOut.Bytes.XaccMSB;
Xnumber=MXC6202DataOut.Bytes.XaccLSB+(Xnumber<<8);
Ynumber=MXC6202DataOut.Bytes.YaccMSB;
Ynumber=MXC6202DataOut.Bytes.YaccLSB+(Ynumber<<8);
#ifdef TEST_PEDOMETER_UI
PDisplayBodyWeight(BodyWeight);
PDisplayBodyHeight(BodyHeight);
PDisplayStepCounter(StepCounter);
PDisplayTotalConsume(TotalConsume);
PDisplayDistance(Distance);
PDisplayTimeCounter(TimeCounter);
PDisplayConsumeRate(ConsumeRate);
PDisplayStepFreqency(StepFreqency);
PDisplayXnumber(Xnumber);
PDisplayYnumber(Ynumber);
PDisplayPauseRun(PEDOMETER_DISP_PAUSE);
#else
PDisplayTime(TimeCounter);
PDisplayStepCounter(StepCounter);
PDisplayTotalConsume(TotalConsume);
PDisplayDistance(Distance);
#endif
}
PEDOMETER_APP_CODE
void PedometerSettingDisplay(void)
{
DisplayPicture(0, 0, PEDOMETER_BACK_XSIZE, PEDOMETER_BACK_YSIZE, NFA_PEDOMETER_BACK);
DisplayPicture(PLAY_BATT_X, PLAY_BATT_Y, PLAY_BATT_XSIZE, PLAY_BATT_YSIZE, NFA_PLAY_BATT + (unsigned long)(PLAY_BATT_XSIZE*PLAY_BATT_YSIZE*2*(BatteryLevel)));
}
PEDOMETER_APP_CODE
void PedometerSetting(void)
{
unsigned int color_tmp;
unsigned int tmpbuf[4];
if(KeyFlag.bc.bKeyPressed == 0)
return;
KeyFlag.bc.bKeyPressed = 0;
if (SystemInfo.bc.bHoldOn) {
return;
}
switch(KeyVal){
case KEY_VAL_PLAY_SHORT_UP:
if(PedometerState == PEDOMETER_RUN)
{
PedometerState = PEDOMETER_PAUSE;
PedometerFreqDown();
PedometerTimerStop(PEDOMETER_TMR_CHANNEL);
#ifdef TEST_PEDOMETER_UI
PDisplayPauseRun(PEDOMETER_DISP_PAUSE);
#endif
}
else if(PedometerState == PEDOMETER_STOP)
{
PedometerState = PEDOMETER_RUN;
PedometerFreqUp();
PedometerDispInit();
#ifdef TEST_PEDOMETER_UI
PDisplayPauseRun(PEDOMETER_DISP_RUN);
#endif
PedometerTimerSetTimer(PEDOMETER_TMR_CHANNEL, 2);//设置50ms的时间中断
PedometerTimerStart(PEDOMETER_TMR_CHANNEL);
}
else
{
PedometerState = PEDOMETER_RUN;
PedometerFreqUp();
#ifdef TEST_PEDOMETER_UI
PDisplayPauseRun(PEDOMETER_DISP_RUN);
#endif
PedometerTimerStart(PEDOMETER_TMR_CHANNEL);
}
break;
case KEY_VAL_MENU_PRESS_START://退出回到主菜单
PostFun2Message(MSG_FUNCTION2_PEDOMETER,MSG_FUNCTION2_PEDOMETER_END,0,0,0/*,0,0,0*/);
break;
default:
break;
}
PedometerSettingDisplay();
}
PEDOMETER_APP_CODE
void PedometerProcess(void)
{
unsigned int imask_tmp;
unsigned int color_tmp;
unsigned int KeyValue;
unsigned int KeyState;
unsigned int tmpbuf[8];
if(PedometerState != PEDOMETER_RUN){
if(KeyFlag.bc.bKeyPressed)
KeyFlag.bc.bKeyPressed = 0;
return;
if (SystemInfo.bc.bHoldOn) {
return;
}
}
if(PedometerReadFlag != 0){
read_creg(%imask, imask_tmp);
bitclear_creg(%imask, 15);
PedometerReadFlag = 0;
write_creg(%imask, imask_tmp);
//GetAcceleration();
StepLoops();
//////////////////////////////////////////////////////////////////////////////////////////////读取相关数值
Xnumber=MXC6202DataOut.Bytes.XaccMSB;
Xnumber=MXC6202DataOut.Bytes.XaccLSB+(Xnumber<<8);
Ynumber=MXC6202DataOut.Bytes.YaccMSB;
Ynumber=MXC6202DataOut.Bytes.YaccLSB+(Ynumber<<8);
//////////////////////////////////////////////////////////////////////////////////////////////计算行走路程
Distance=BodyHeight-100;
Distance=Distance*StepCounter;
Distance=Distance/100;
//////////////////////////////////////////////////////////////////////////////////////////////计算消耗的
TotalConsume=Distance*BodyWeight;
TotalConsume=TotalConsume+(TotalConsume/1000)*36;
//////////////////////////////////////////////////////////////////////////////////////////////计算时间秒为单位
TimeCounter=TimeInterCounter/20;
//////////////////////////////////////////////////////////////////////////////////////////////计算消耗速度
ConsumeRate=TotalConsume/TimeCounter;
ConsumeRate=ConsumeRate*3600;
ConsumeRate=ConsumeRate/1000;//以千卡为单位
//////////////////////////////////////////////////////////////////////////////////////////////计算步频
StepFreqency=(60*StepCounter)/TimeCounter;
//////////////////////////////////////////////////////////////////////////////////////////////显示相关数据
#ifdef TEST_PEDOMETER_UI
PDisplayXnumber(Xnumber);
PDisplayYnumber(Ynumber);
//////////////////////////////////////////////////////////////////////////////////////////////
PDisplayStepCounter(StepCounter);
PDisplayBodyWeight(BodyWeight);
PDisplayBodyHeight(BodyHeight);
//////////////////////////////////////////////////////////////////////////////////////////////
PDisplayDistance(Distance);
PDisplayTotalConsume(TotalConsume);
if(TimeInterCounter%20==0)
PDisplayTimeCounter(TimeCounter);
PDisplayConsumeRate(ConsumeRate);
PDisplayStepFreqency(StepFreqency);
#else
//////////////////////////////////////////////////////////////////////////////////////////////
if(TimeInterCounter%20==0)
{//一秒钟刷新一次
PDisplayTime(TimeCounter);
PDisplayStepCounter(StepCounter);
PDisplayTotalConsume(TotalConsume);//已千卡为单位
PDisplayDistance(Distance);
}
#endif
//////////////////////////////////////////////////////////////////////////////////////////////
}
if(KeyFlag.bc.bKeyPressed == 0)
return;
else
KeyFlag.bc.bKeyPressed = 0;
switch(KeyVal)
{
case KEY_VAL_PLAY_SHORT_UP:
if(PedometerState != PEDOMETER_RUN)
{
PedometerState = PEDOMETER_RUN;
PedometerFreqUp();
#ifdef TEST_PEDOMETER_UI
PDisplayXnumber(Xnumber);
PDisplayPauseRun(PEDOMETER_DISP_RUN);
#endif
PedometerTimerSetTimer(PEDOMETER_TMR_CHANNEL, 2);//根据 等级来设定时间
PedometerTimerStart(PEDOMETER_TMR_CHANNEL);
PedometerTimerReset(PEDOMETER_TMR_CHANNEL2);
PedometerTimerStart(PEDOMETER_TMR_CHANNEL2);
}else
{
PedometerState = PEDOMETER_PAUSE;
PedometerFreqDown();
PedometerTimerStop(PEDOMETER_TMR_CHANNEL);
PedometerTimerStop(PEDOMETER_TMR_CHANNEL2);
PedometerKeyFlag = 0;
PedometerKeyValue = KEY_VAL_NONE;
#ifdef TEST_PEDOMETER_UI
PDisplayXnumber(Xnumber);
PDisplayPauseRun(PEDOMETER_DISP_PAUSE);
#endif
}
break;
case KEY_VAL_MENU_PRESS_START://退出Pedometer
PostFun2Message(MSG_FUNCTION2_PEDOMETER,MSG_FUNCTION2_PEDOMETER_END,0,0,0/*,0,0,0*/);
break;
default:
break;
}
if(PedometerKeyFlag != 0){
read_creg(%imask, imask_tmp);
bitclear_creg(%imask, 15);
PedometerKeyFlag = 0;
write_creg(%imask, imask_tmp);
}
}
PEDOMETER_APP_CODE
void PedometerModule(void)
{
unsigned int color_tmp;
unsigned int temp;
if (DisplayFlag == DISP_PEDOMETER) {
if (SystemInfo.bc.bBackLightOffStart) {
bitclear_creg(%imask,5);
SystemInfo.bc.bBackLightOffStart = 0;
LcdBackLightOff();
bitset_creg(%imask,5);
}
if (SystemInfo.bc.bDisplayRecovery) {
SystemInfo.bc.bDisplayRecovery = 0;
//恢复显示图片(重新解码)
PostFun2Message(MSG_FUNCTION2_PEDOMETER,MSG_FUNCTION2_PEDOMETER_INIT,0,0,0/*,0,0,0*/);
}
if (SystemInfo.bc.bHoldOn && PedometerState == PEDOMETER_RUN){//2007-1-10
PedometerState = PEDOMETER_PAUSE;
}
if (SystemInfo.bc.bBackLightOnStart == 0)
{
switch(Fun2MsgArray[1])
{
case MSG_FUNCTION2_PEDOMETER_INIT:
//LCD_Init();
if (Sys1InitFlag.word == 0xffff)
{
SysCpuSetFreq(24);
SysTimer0Set(24,25000);//SysTimer0Set(24,10000);
}
if (Sys2InitFlag.bc.bPedometerModuleInitEnable) //须对Pedometer模块进行相关初始化
{
PedometerValueInit();
}
PedometerDispInit();
PostFun2Message(MSG_FUNCTION2_PEDOMETER,MSG_FUNCTION2_PEDOMETER_STOP,0,0,0/*,0,0,0*/);
break;
case MSG_FUNCTION2_PEDOMETER_STOP:
case MSG_FUNCTION2_PEDOMETER_PAUSE:
PedometerSetting();//没有开始前,进行相关设置
//PedometerProcess();
if(PedometerState == PEDOMETER_RUN)
{
PostFun2Message(MSG_FUNCTION2_PEDOMETER,MSG_FUNCTION2_PEDOMETER_RUN,0,0,0/*,0,0,0*/);
}
break;
case MSG_FUNCTION2_PEDOMETER_RUN:
//SystemInfo.bit.bBklightOffEn = 0;
PedometerProcess();
if(PedometerState != PEDOMETER_RUN)
{
PostFun2Message(MSG_FUNCTION2_PEDOMETER,MSG_FUNCTION2_PEDOMETER_PAUSE,0,0,0/*,0,0,0*/);
}
break;
case MSG_FUNCTION2_PEDOMETER_END:
PedometerExit();
break;
default:
break;
}
}
if (SystemInfo.bc.bHoldDisplay)
{
bitclear_creg(%imask,5);
SystemInfo.bc.bHoldDisplay = 0;
bitset_creg(%imask,5);
PreDisplayFlag = DisplayFlag;
DisplayFlag = DISP_HOLD;
MusicSetFreq51();
LCD_Init(0);
DisplayPicture(0, 0, LCD_MAX_XSIZE, LCD_MAX_YSIZE, NFA_SYSTEM_LOCK + SystemInfo.bc.bHoldOn * PicPerPage);
MusicSetFreq51Return();
}
if (SystemInfo.bc.bBackLightOnStart)
{
bitclear_creg(%imask,5);
SystemInfo.bc.bBackLightOnStart = 0;
LcdBackLightOn();
KeyReset();
bitset_creg(%imask,5);
}
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
PEDOMETER_APP_CODE
void PedometerFreqUp(void)
{
MusicSetFreq51();
bitclear_creg(%imask,5);
SystemInfo.bc.bBackLightOffEn = 1;
SystemInfo.bc.bSysIdleEn = 0;
bitset_creg(%imask,5);
}
PEDOMETER_APP_CODE
void PedometerFreqDown(void)
{
bitclear_creg(%imask,5);
SystemInfo.bc.bBackLightOffEn = 0;
LightOffCounter = 0;
if ((Sys1InitFlag.word == 0xffff) || ((Sys1InitFlag.bc.bMusicModuleInitEnable == 0) && (MusicPlayInfo.PlayState != MUSIC_DECODE_PLAY))) {
SystemInfo.bc.bSysIdleEn = 1;
SysIdleCounter = 0;
}
bitset_creg(%imask,5);
MusicSetFreq51Return();
}
#ifdef TEST_PEDOMETER_UI
PEDOMETER_APP_CODE
void PDisplayPauseRun(bool PedometerPauseRun)
{
unsigned int color_tmp;
color_tmp = LCD_GetColor();
LCD_SetColor(PEDOMETER_BACK_CLOLOR);
LCD_FillRect(PEDOMETER_DISP_STATE_X, PEDOMETER_DISP_STATE_Y, PEDOMETER_DISP_STATE_X+PEDOMETER_DISP_STATE_XSIZE, PEDOMETER_DISP_STATE_Y+PEDOMETER_DISP_STATE_YSIZE);
LCD_SetColor(0xF800);
if(PedometerPauseRun==PEDOMETER_DISP_RUN)
LCD_NFDispStringAt(PEDOMETER_DISP_STATE_X, PEDOMETER_DISP_STATE_Y, "RUN");
else
LCD_NFDispStringAt(PEDOMETER_DISP_STATE_X, PEDOMETER_DISP_STATE_Y, "PAUSE");
LCD_SetColor(color_tmp);
}
PEDOMETER_APP_CODE
void PDisplayXnumber(unsigned long Xnumber)
{
unsigned int color_tmp;
unsigned int tmpbuf[8];
color_tmp = LCD_GetColor();
Conver16To10Display(Xnumber,tmpbuf);
LCD_SetColor(PEDOMETER_BACK_CLOLOR);
LCD_FillRect(PEDOMETER_NUMBER_XNUMBER_X, PEDOMETER_NUMBER_XNUMBER_Y, PEDOMETER_NUMBER_XNUMBER_X+50, PEDOMETER_NUMBER_XNUMBER_Y+16);
LCD_SetColor(0xFFFF);
LCD_NFDispStringAt(PEDOMETER_NUMBER_XNUMBER_X, PEDOMETER_NUMBER_XNUMBER_Y, tmpbuf);
LCD_SetColor(color_tmp);
}
PEDOMETER_APP_CODE
void PDisplayYnumber(unsigned long Ynumber)
{
unsigned int color_tmp;
unsigned int tmpbuf[8];
color_tmp = LCD_GetColor();
Conver16To10Display(Ynumber,tmpbuf);
LCD_SetColor(PEDOMETER_BACK_CLOLOR);
LCD_FillRect(PEDOMETER_NUMBER_YNUMBER_X, PEDOMETER_NUMBER_YNUMBER_Y, PEDOMETER_NUMBER_YNUMBER_X+50, PEDOMETER_NUMBER_YNUMBER_Y+16);
LCD_SetColor(0xFFFF);
LCD_NFDispStringAt(PEDOMETER_NUMBER_YNUMBER_X, PEDOMETER_NUMBER_YNUMBER_Y, tmpbuf);
LCD_SetColor(color_tmp);
}
PEDOMETER_APP_CODE
void PDisplayBodyWeight(unsigned long BodyWeight)
{
unsigned int color_tmp;
unsigned int tmpbuf[8];
color_tmp = LCD_GetColor();
Conver16To10Display(BodyWeight,tmpbuf);
LCD_SetColor(PEDOMETER_BACK_CLOLOR);
LCD_FillRect(PEDOMETER_NUMBER_BODY_WEIGHT_X, PEDOMETER_NUMBER_BODY_WEIGHT_Y, PEDOMETER_NUMBER_BODY_WEIGHT_X+50, PEDOMETER_NUMBER_BODY_WEIGHT_Y+16);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -