/************************************光标在备注处菜单**********************************************/ static char PhoneHandleBeiZhu(char *msg) { FILE *fp; u8 dispbuff[30]; int numPhone; clear_lcd(); fp=fopen("PhoneBook","rb"); if(fp!=NULL){ //如果有记录,则先把记录读到phonebuff 。 #ifdef DEBUG_PRINTF printf("open PhoneBook success!!\n"); #endif fread(dispbuff,10,1,fp); }else{ text_out_to_row_x_Language2(2,40,"没有记录","没有记录"); goto tuichu; } numPhone=*msg; //如果msg==NULL,则会引起segmentation fault。 fseek(fp,10+numPhone*98+12+18+18+20,SEEK_SET); fread(dispbuff,sizeof(dispbuff),1,fp); fclose(fp); text_out_to_row_x_Language2(0,40,"【备注】","【备注】"); my_DisplayBuff(dispbuff,1,2); tuichu: SetBLOverTime(10); SetAutoExitTime(10); WaitkeyAndAutoExit(10); return 0; }
static char PhoneHandleNameDelete(char *msg) { char temp; #ifdef DEBUG_PRINTF printf("msg=%d\n",*msg); #endif temp=PhoneDeleteARecord(*msg); clear_lcd(); if(temp==RIGHT_return){ text_out_to_row_x_Language2(2,46,"已删除","Deleted"); }else{ text_out_to_row_x_Language2(2,40,"删除失败","Delete failure"); } return (WaitkeyAndAutoExit(10)); }
static char PhoneExplorer(char *msg) { EFILE efile; u8 dispbuff[50]; int i; struct OperateDisplay disp={0,0, 0,0,MaxRowOneScr ,1}; unsigned char keyval; loop: clear_lcd(); keyval=EepromFile_ReadData(dispbuff,10,file_phonebook); if(keyval==EepromFile_ReadOk){ //如果有记录,则先把记录读到phonebuff 。 disp.MenuTotal=atoi((sc8*)dispbuff); if(disp.MenuTotal==0){ text_out_to_row_x_Language2(40,2,"没有记录","No record"); goto tuichu; } }else{ text_out_to_row_x_Language2(2,40,"没有记录","No record"); goto tuichu; } keyval=EepromFile_Open(file_phonebook,&efile); while(1){ if(disp.flashflag){ disp.flashflag=0; for(i=disp.StartLine;i<disp.EndLine&&i<disp.MenuTotal+disp.StartLine;i++){ EepromFile_Seek(&efile,10+(disp.Menucnt-disp.curFlashRow+i)*98,EepromFile_SEEK_SET); EepromFile_read(dispbuff,12,&efile); steaddraw_pic_to_row_x(PhoneNameIco,0,i,12,12); text_out_to_row_x_fillSpace(i,16,dispbuff); } DispHighLightRow_to_x(16,disp.curFlashRow); //高亮 } keyval=GetKeyValue(); if(keyval == KEY_NONE) continue; KeyEventPost(); switch(keyval){ case KEY_UP: my_OperateDisplay_KEY_UP(&disp); break; case KEY_DOWN: my_OperateDisplay_KEY_DOWN(&disp); break; case KEY_Enter: case KEY_RIGHT: if(HandlePhoneSelection(disp.Menucnt)==KEY_ReturnInitInterface){return KEY_ReturnInitInterface;} disp.flashflag=1; //fclose(fp); goto loop; case KEY_ReturnPrevious: case KEY_ReturnInitInterface: case KEY_WaitTimeout: //fclose(fp); return keyval; } } tuichu: return (WaitkeyAndAutoExit(10)); }
/************************************记录详情**********************************************/ static char HandlePhoneSelection(char numPhone) { static u8 PhoneNumber[18],PhoneName[12],PhoneZuoJi[18],PhoneEmail[20],PhoneBeiZhu[30]; EFILE efile; char dispbuff[11]; u8 retval; static struct FunctionMenuAddIco2 Menu[5]={ {PhoneNameIco, PhoneName, PhoneHandleName}, {PhoneNumberIco,PhoneNumber,PhoneHandleNumber}, {PhoneZuoJiIco, PhoneZuoJi, PhoneHandleZuoJi}, {PhoneEmailIco, PhoneEmail, PhoneHandleEmail}, {PhoneBeiZhuIco,PhoneBeiZhu,PhoneHandleBeiZhu}, }; struct OperateAddIco2 MenuOp={Menu,5,0 ,0,0,MaxRowOneScr, 1,0,0}; if(Language[0]==LOCAL_LANGUAGE){ strcpy((char *)PhoneNumber,(const char *)con_Chinese_PhoneNumber); strcpy((char *)PhoneName,(const char *)con_Chinese_PhoneName); strcpy((char *)PhoneZuoJi,(const char *)con_Chinese_PhoneZuoJi); strcpy((char *)PhoneEmail,(const char *)con_Chinese_PhoneEmail); strcpy((char *)PhoneBeiZhu,(const char *)con_Chinese_PhoneBeiZhu); //strcpy((char *)PhoneSave,(const char *)con_Chinese_PhoneSave); } else{ strcpy((char *)PhoneNumber,(const char *)con_English_PhoneNumber); strcpy((char *)PhoneName,(const char *)con_English_PhoneName); strcpy((char *)PhoneZuoJi,(const char *)con_English_PhoneZuoJi); strcpy((char *)PhoneEmail,(const char *)con_English_PhoneEmail); strcpy((char *)PhoneBeiZhu,(const char *)con_English_PhoneBeiZhu); //strcpy((char *)PhoneSave,(const char *)con_English_PhoneSave); } loop: retval=EepromFile_ReadData((unsigned char *)dispbuff,10,file_phonebook); if(retval!=EepromFile_ReadOk){ //如果有记录,则先把记录读到phonebuff 。 clear_lcd(); text_out_to_row_x_Language2(2,40,"没有记录","No record"); return WaitkeyAndAutoExit(10); } retval=EepromFile_Open(file_phonebook,&efile); EepromFile_Seek(&efile,10+numPhone*98,EepromFile_SEEK_SET); EepromFile_read(PhoneName,PhoneNameSize,&efile); EepromFile_read(PhoneNumber,PhoneNumberSize,&efile); EepromFile_read(PhoneZuoJi,PhoneZuoJiSize,&efile); EepromFile_read(PhoneEmail,PhoneEmailSize,&efile); EepromFile_read(PhoneBeiZhu,PhoneBeiZhuSize,&efile); while(1){ MenuHandler_AddIco2(&MenuOp); if(MenuOp.RetVal==KEY_Enter){ MenuOp.FucRetVal=MenuOp.Menu->MenuFuc(&numPhone); if(MenuOp.FucRetVal==KEY_WaitTimeout||MenuOp.FucRetVal==KEY_ReturnInitInterface){CurProc=CurProc_Return;return MenuOp.FucRetVal;} else{ clear_lcd(); MenuOp.flashflag=1; goto loop; } }else{ return MenuOp.RetVal; } } #undef PhoneNumber #undef PhoneName #undef PhoneZuoJi #undef PhoneEmail #undef PhoneBeiZhu //#undef PhoneSave }
/************************************光标在姓名处菜单**********************************************/ static s8 PhoneHandleNameXiuGai(s8 *msg) { static u8 PhoneNumber[18],PhoneName[12],PhoneZuoJi[18],PhoneEmail[20],PhoneBeiZhu[30],PhoneSave[5]; char temp[50]; int numPhone; EFILE efile; static struct FunctionMenuAddIco Menu[6]={ {PhoneNameIco, PhoneName, PhoneNameSize, PhoneAddName}, {PhoneNumberIco,PhoneNumber,PhoneNumberSize,PhoneAddNumber}, {PhoneZuoJiIco, PhoneZuoJi, PhoneZuoJiSize, PhoneAddZuoJi}, {PhoneEmailIco, PhoneEmail, PhoneEmailSize, PhoneAddEmail}, {PhoneBeiZhuIco,PhoneBeiZhu,PhoneBeiZhuSize,PhoneAddBeiZhu}, {PhoneSaveIco, PhoneSave, PhoneSaveSize, PhoneAddSave} }; struct OperateAddIco MenuOp={Menu,6,0,0,0,MaxRowOneScr,1,0}; if(Language[0]==LOCAL_LANGUAGE){ strcpy((char *)PhoneNumber,(const char *)con_Chinese_PhoneNumber); strcpy((char *)PhoneName,(const char *)con_Chinese_PhoneName); strcpy((char *)PhoneZuoJi,(const char *)con_Chinese_PhoneZuoJi); strcpy((char *)PhoneEmail,(const char *)con_Chinese_PhoneEmail); strcpy((char *)PhoneBeiZhu,(const char *)con_Chinese_PhoneBeiZhu); strcpy((char *)PhoneSave,(const char *)con_Chinese_PhoneSave); } else{ strcpy((char *)PhoneNumber,(const char *)con_English_PhoneNumber); strcpy((char *)PhoneName,(const char *)con_English_PhoneName); strcpy((char *)PhoneZuoJi,(const char *)con_English_PhoneZuoJi); strcpy((char *)PhoneEmail,(const char *)con_English_PhoneEmail); strcpy((char *)PhoneBeiZhu,(const char *)con_English_PhoneBeiZhu); strcpy((char *)PhoneSave,(const char *)con_English_PhoneSave); } clear_lcd(); temp[0]=EepromFile_ReadData((unsigned char *)temp,10,file_phonebook); if(temp[0]!=EepromFile_ReadOk){ //如果有记录,则先把记录读到phonebuff 。 clear_lcd(); text_out_to_row_x_Language2(2,40,"没有记录","No record"); return KEY_ReturnPrevious; } EepromFile_Open(file_phonebook,&efile); numPhone=*msg; //如果msg==NULL,则会引起segmentation fault。 EepromFile_Seek(&efile,10+numPhone*98,EepromFile_SEEK_SET); EepromFile_read(PhoneName,PhoneNameSize,&efile); EepromFile_read(PhoneNumber,PhoneNumberSize,&efile); EepromFile_read(PhoneZuoJi,PhoneZuoJiSize,&efile); EepromFile_read(PhoneEmail,PhoneEmailSize,&efile); EepromFile_read(PhoneBeiZhu,PhoneBeiZhuSize,&efile); while(1){ MenuHandler_AddIco(&MenuOp); if(MenuOp.RetVal==KEY_Enter){ if(MenuOp.Menucnt==MenuOp.MenuTotal-1){ if(PhoneDeleteARecord(numPhone)==RIGHT_return){ MenuOp.FucRetVal=MenuOp.Menu->MenuFuc((u8 *)Menu,0); } return MenuOp.FucRetVal; }else{ strcpy(temp,(sc8*)(MenuOp.Menu->MenuStr)); MenuOp.FucRetVal=MenuOp.Menu->MenuFuc(MenuOp.Menu->MenuStr,MenuOp.Menu->size); if(strlen((sc8*)(MenuOp.Menu->MenuStr))==0){ strcpy((s8*)(MenuOp.Menu->MenuStr),temp); } } if(MenuOp.FucRetVal==KEY_WaitTimeout||MenuOp.FucRetVal==KEY_ReturnInitInterface){CurProc=CurProc_Return;return MenuOp.FucRetVal;} else{clear_lcd();MenuOp.flashflag=1;} }else{ return MenuOp.RetVal; } } #undef PhoneNumber #undef PhoneName #undef PhoneZuoJi #undef PhoneEmail #undef PhoneBeiZhu #undef PhoneSave }
//按拼音排序保存一个记录 static u8 PhoneAddSave(u8 *receive,u16 size) { char phonebuff[4096],*pphonebuff,*endphonebuff; char bufftemp[100]; struct FunctionMenuAddIco *MenuPhoneAdd; int num; int i; clear_lcd(); DrawTitle_to_row_Language2(2,"正在保存...","saving..."); MenuPhoneAdd=(struct FunctionMenuAddIco *)receive; EepromFile_ReadData((unsigned char *)phonebuff,sizeof(phonebuff)-1,file_phonebook); pphonebuff=phonebuff; memset(bufftemp,0,sizeof(bufftemp)); memcpy(bufftemp,pphonebuff,10); pphonebuff+=10; num=atoi((sc8*)bufftemp); endphonebuff=pphonebuff+num*98; //endphonebuff 指向最后一条记录后面的空白处 if(endphonebuff>&phonebuff[sizeof(phonebuff)-200]){ text_out_to_row_x_Language2(3,40,"电话本已满","Phone book full"); goto tuichu; } memset(bufftemp,0,50); //按拼音次序找到要写入记录的位置 for(i=0;i<num;i++){ memcpy(bufftemp,pphonebuff,12); if(strcmp(bufftemp,(sc8*)MenuPhoneAdd->MenuStr)>0)break; pphonebuff+=98; } while(endphonebuff>pphonebuff){ //把要写入记录位置处的所有记录向后移一个记录的位置 memcpy(bufftemp,endphonebuff-98,98); memcpy(endphonebuff,bufftemp,98); endphonebuff-=98; } memcpy(pphonebuff,MenuPhoneAdd->MenuStr,12); //读入要写入记录的信息 MenuPhoneAdd++;pphonebuff+=12; memcpy(pphonebuff,MenuPhoneAdd->MenuStr,18); MenuPhoneAdd++;pphonebuff+=18; memcpy(pphonebuff,MenuPhoneAdd->MenuStr,18); MenuPhoneAdd++;pphonebuff+=18; memcpy(pphonebuff,MenuPhoneAdd->MenuStr,20); MenuPhoneAdd++;pphonebuff+=20; memcpy(pphonebuff,MenuPhoneAdd->MenuStr,30); num++; memset(bufftemp,0,10); sprintf(bufftemp,"%d",num); memcpy(phonebuff,bufftemp,10); i=EepromFile_WriteData((unsigned char*)phonebuff,num*99+100,file_phonebook); if(i==EepromFile_WriteOk){ DrawTitle_to_row_Language2(3,"电话记录保存成功","save success"); }else{ DrawTitle_to_row_Language2(3,"电话记录保存失败","save failure"); } tuichu: return (WaitkeyAndAutoExit(10)); }
static char Calculator(char *msg)//2.计算器 { unsigned char abuff[50]; //因为abuff 要做结果存储,所以要申请大一点,否则如果数值太大,会segmentation fault unsigned char bbuff[22]; signed char jjcc[2]={0,0}; signed char input09,inputcnt; signed char inputFlag; unsigned char keyval; enum {WaitFirst,WaitFirst_inputed,WaitSecond,WaitSecond_inputed}ope; ope=WaitFirst; inputcnt=0; clear_lcd(); text_out_to_row_x_Language2(0,34,"【计算器】","Calculator"); draw_line(0,12,132,12,1); draw_line(0,11,132,11,1); text_out_to_row_fillSpace(1,"0"); while(1){ keyval=GetKeyValue(); if(keyval==0)continue; KeyEventPost(); inputFlag=0; switch(keyval){ case KEY0: inputFlag=1; input09= '0';break; //号码键 case KEY1: inputFlag=1; input09= '1';break; case KEY2: inputFlag=1; input09= '2';break; case KEY3: inputFlag=1; input09= '3';break; case KEY4: inputFlag=1; input09= '4';break; case KEY5: inputFlag=1; input09= '5';break; case KEY6: inputFlag=1; input09= '6';break; case KEY7: inputFlag=1; input09= '7';break; case KEY8: inputFlag=1; input09= '8';break; case KEY9: inputFlag=1; input09= '9';break; case KEYJING: inputFlag=1; input09= '.';break; //小数点键 case KEY_UP: inputFlag=2; input09= '+';break; //加 case KEY_DOWN: inputFlag=2; input09= '-';break; //减 case KEY_LEFT: inputFlag=2; input09= '*';break; //乘 case KEY_RIGHT: inputFlag=2; input09= '/';break; //除 case KEYXING: inputFlag=2; input09= '&';break; case KEY_Enter: //等于键 if(ope==WaitSecond_inputed){ if(strlen((char const *)abuff)<sizeof(bbuff)-3){ calculate_result(abuff,(char const *)bbuff,(char const *)jjcc); }else{ clear_area_to_row(1,3); text_out_to_row_fillSpace(2,"数据太大!无法计算!"); } ope=WaitFirst_inputed; inputcnt=0; }else{ //如果只是输入了第一个数据,按确认则清0。 clear_area_to_row(1,3); text_out_to_row_fillSpace(1,"0"); ope=WaitFirst; inputcnt=0; } break; case KEY_DEL: //删除返回键 if(inputcnt){ inputcnt--; if(ope==WaitFirst_inputed){abuff[inputcnt]=0;text_out_to_row_fillSpace(1,abuff);} else if(ope==WaitSecond_inputed){bbuff[inputcnt]=0;text_out_to_row_fillSpace(3,bbuff);} }else{ //return 1; } case KEY_ReturnInitInterface: case KEY_ReturnPrevious: KeyIsResponse(); return keyval; } if(inputFlag==1&&inputcnt<sizeof(bbuff)-3){ //如果有0到9.输入并且没有超过规定的位数 if(inputcnt==0&&input09=='.'){ if(ope==WaitFirst||ope==WaitFirst_inputed){ope=WaitFirst_inputed;abuff[inputcnt++]='0';abuff[inputcnt++]='.';abuff[inputcnt]=0;text_out_to_row_fillSpace(1,abuff);} else if(ope==WaitSecond||ope==WaitSecond_inputed){ope=WaitSecond_inputed;bbuff[inputcnt++]='0';bbuff[inputcnt++]='.';bbuff[inputcnt]=0;text_out_to_row_fillSpace(3,bbuff);} }else if(inputcnt!=0||input09!='0'){ //如果输入的第一个数不为0 if(ope==WaitFirst||ope==WaitFirst_inputed){ope=WaitFirst_inputed;abuff[inputcnt++]=input09;abuff[inputcnt]=0;text_out_to_row_fillSpace(1,abuff);} else if(ope==WaitSecond||ope==WaitSecond_inputed){ope=WaitSecond_inputed;bbuff[inputcnt++]=input09;bbuff[inputcnt]=0;text_out_to_row_fillSpace(3,bbuff);} } } if(inputFlag==2){ if(ope==WaitFirst_inputed||ope==WaitSecond){ //如果输入了第一个并在等待第二个时,可以更换运算符。 if(input09=='&'){if(jjcc[0]=='+')jjcc[0]='-';else if(jjcc[0]=='-')jjcc[0]='*';else if(jjcc[0]=='*')jjcc[0]='/';else jjcc[0]='+';} else jjcc[0]=input09; text_out_to_row_x_fillSpace(2,6,(unsigned char const *)jjcc); ope=WaitSecond; inputcnt=0; }else if(ope==WaitSecond_inputed){ //如果输入了第二个数据,则计算出结果,并可以连算。 calculate_result(abuff,(char const *)bbuff,(char const *)jjcc); if(input09=='&')jjcc[0]='+'; else jjcc[0]=input09; text_out_to_row_x_fillSpace(2,6,(unsigned char const *)jjcc); ope=WaitSecond; inputcnt=0; } } #ifdef DEBUG_PRINTF printf("inputFlag=%d, inputcnt=%d\n",inputFlag,inputcnt); #endif KeyIsResponse(); } }