⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 funcsm.c

📁 本人编写的无线电话程序,给予PIC18C801设计,包括了uCOS的移植以及菜单,自己设计的拼音注入法,完整地一级汉字库,希望对大家有所帮助
💻 C
📖 第 1 页 / 共 2 页
字号:
			*ctr--;
			return(it);
		}
		return(pSMTbl[it].Next);					
	}
}

/*

INT8U MFunc_CheckSM(void){
	INT8U CurItem,err,i,chrTemp,Ctr;
	//INT8U rom * pMsg;
	INT8U rom * pSml;
	INT8U rom * pLge;
	
	OSSemPend(DisplaySem, 0, &err);
	Display_SM(0);
	if(err == OS_NO_ERR){
		Display_Menu_Icon(0,&PIC_READ);
		Display_Menu_Icon(1,&PIC_RETURN);
		Do_Clear_Screen(6,32,7,95);	//clear the menu index field
	}
	OSSemPost(DisplaySem);
	CurItem = SystemFile.SMTblHead;
	if(CurItem >= SMTBLLEN){
		OSSemPend(DisplaySem,0,&err);
		if(err == OS_NO_ERR){
			app_printf(TextNoRecord,3,2,0);//MenuDisplayName(2,3,TextNoRecord);
		}
		OSSemPost(DisplaySem);
	}
	Ctr=0;
	for(;;){
		if(CurItem < SMTBLLEN){
			OSSemPend(DisplaySem,0,&err);
			Func_DisplayNumAndTime(&(SystemFile.SMTbl[CurItem].chrOtherSideNum[0]), 8, &(SystemFile.SMTbl[CurItem].Time));
			Func_DisplaySmallIndex (Ctr+1);
			OSSemPost(DisplaySem);
		}

		switch(MFunc_WaitForInput(0)){
			case 0xff:
				return(1);
			case KEY_FUNC1:	//Enter 
				if(CurItem >= SMTBLLEN) break;
				chrTemp = MFunc_ReadSM(&CurItem);
				if(chrTemp == 1){//exit due to MSG_MENU_CANCEL
					return(1);
				}
				else {
					OSSemPend(DisplaySem,0,&err);
					if(err == OS_NO_ERR){
						Display_Menu_Icon(0,&PIC_READ);
					 	Display_Menu_Icon(1,&PIC_RETURN);
						Do_Clear_Screen(6,32,7,95);	//clear the menu index field
					}
					OSSemPost(DisplaySem);
					if(chrTemp == 0){//cancel key
					}
					else if((chrTemp & 0xf0) == 0xf0){
						switch(chrTemp & 0x0f){
							case 0:		//delete
								if(CurItem == SystemFile.SMTblHead){//the first one 
									SystemFile.SMTbl[CurItem].chrOtherSideNum[0] = 0xff;
									//mark the SM "empty"
									FileSave(SYS_FILE_ID,
											(INT16U)((INT24U)&(SystemFile.SMTbl[CurItem].chrOtherSideNum[0]) - (INT24U)&SystemFile),
											&(SystemFile.SMTbl[CurItem].chrOtherSideNum[0]),
											1);
									SystemFile.SMTblHead = SystemFile.SMTbl[CurItem].Next;
									Save_Domain(79,&SystemFile.SMTblHead);
									chrTemp = SystemFile.SMTblHead;
									for(i=0; i<SMTBLLEN; i++){
										if(SystemFile.SMTbl[chrTemp].Next >= SMTBLLEN){//reach the end nod
											Ctr = i;
											CurItem = chrTemp;
											break;
										}
										chrTemp = SystemFile.SMTbl[chrTemp].Next;
									}
								}
								else{
									//find the item before CurItem
									chrTemp = SystemFile.SMTblHead;
									for(i=0; i<SMTBLLEN; i++){
										if(SystemFile.SMTbl[chrTemp].Next == CurItem){
											Ctr = i;
											break;
										}
										chrTemp = SystemFile.SMTbl[chrTemp].Next;
									}
									SystemFile.SMTbl[chrTemp].Next = SystemFile.SMTbl[CurItem].Next;
									SystemFile.SMTbl[CurItem].chrOtherSideNum[0] = 0xff;
									//mark the SM "empty"
									FileSave(SYS_FILE_ID,
											(INT16U)((INT24U)&(SystemFile.SMTbl[CurItem].chrOtherSideNum[0]) - (INT24U)&SystemFile),
											&(SystemFile.SMTbl[CurItem].chrOtherSideNum[0]),
											1);
									FileSave(SYS_FILE_ID,
											(INT16U)((INT24U)&(SystemFile.SMTbl[chrTemp].Next) - (INT24U)&SystemFile),
											&(SystemFile.SMTbl[CurItem].Next),
											1);
									CurItem = chrTemp;
								}
								break;

							case 1:
								CurText=tmpCurText;
								CurTextLen = 0;
								if(SystemFile.SMTbl[CurItem].chrProperty==SM_UNICODE){
									CurTextLen=(SystemFile.SMTbl[CurItem].SMLength)>>1;		// word_len=char_len/2
									for(i=0;i<CurTextLen; i++){
										CurText[i]=(SystemFile.SMTbl[CurItem].SMContent[i<<1]);	//High-byte ahead
										CurText[i]=(CurText[i]<<8)+SystemFile.SMTbl[CurItem].SMContent[(i<<1)+1];
									}
								}
								else{
									CurTextLen=SystemFile.SMTbl[CurItem].SMLength;
									for(i=0;i<CurTextLen; i++){
										CurText[i]=SystemFile.SMTbl[CurItem].SMContent[i];
									}
								}
								
								CurPhoneNumLen=0;
								for(i=0;i<12;i++){
									err=SystemFile.SMTbl[CurItem].chrOtherSideNum[i];
									if((err>>4)>9)
										break;
									else
										CurPhoneNum[CurPhoneNumLen++]=(err>>4)+0x30;
									if((err & 0x0F)>9)
										break;
									else
										CurPhoneNum[CurPhoneNumLen++]=(err & 0x0F)+0x30;
								}
								return(MFunc_EditSMS());
								break;

							case 2:		//send
								CurPhoneNumLen = 0;
								chrTemp=EnterPhoneEdit();
								if(chrTemp == 0){//exit because of cancel
								}
								else if (chrTemp == 2){//exit because of enter
									pSml = OSMemGet(pMemSml, &err);
									if(err == OS_NO_ERR){
										pLge = OSMemGet(pMemLge, &err);
										if(err == OS_NO_ERR){
											((MSG_HEAD *)pSml)->Msg_ID = MSG_SM_SEND;
											((MSG_HEAD *)pSml)->Origin = peventMenu;
											((MSG_HEAD *)pSml)->pmemME = pMemSml;
											((MSG_HEAD *)pSml)->Attached = TRUE;
											((MSG_HEAD *)pSml)->pMem = pLge;
											((MSG_HEAD *)pSml)->pmemATT = pMemLge;
											*pLge++ = CurPhoneNumLen;
											//copy the number of destination
											for(i = 0; i< CurPhoneNumLen; i++){
												*pLge++ = CurPhoneNum[i];
												if(i>32) break;
											}
											//copy the SM contents
											for(i=0; i<SystemFile.SMTbl[CurItem].SMLength; i++){
												*pLge++ = SystemFile.SMTbl[CurItem].SMContent[i];
												if(i>142) break;
											}
											((MSG_HEAD *)pSml)->LenOfAttach = 1+CurPhoneNumLen + (SystemFile.SMTbl[CurItem].SMLength & 0xfffe);	//if the length is odd, convert it to even
											OSQPost(peventWICCmd, pSml);
										}
										else OSMemPut(pMemSml,pSml);
									}
								}
								else{//exit because of MSG_MENU_CANCEL message
									CurMenu=MENU_ROOT;
									OSSemPend(DisplaySem, 0, &err);
									if(err == OS_NO_ERR){
										MenuDisplayKey(CurMenu);
										Do_Clear_Screen(6,32,7,95);	//clear the menu index field
									}
									OSSemPost(DisplaySem);
									return(1);
								}
								break;
							case 3:		//text answer
								CurText=tmpCurText;
								CurTextLen = 0;
								CurPhoneNumLen=0;
								for(i=0;i<12;i++){
									err=SystemFile.SMTbl[CurItem].chrOtherSideNum[i];
									if((err>>4)>9)
										break;
									else
										CurPhoneNum[CurPhoneNumLen++]=(err>>4)+0x30;
									if((err & 0x0F)>9)
										break;
									else
										CurPhoneNum[CurPhoneNumLen++]=(err & 0x0F)+0x30;
								}
								return(MFunc_EditSMS());
								break;
							case 4:		//call back
								MFunc_DirectCall(SystemFile.SMTbl[CurItem].chrOtherSideNum,12);
								//
								CurMenu=MENU_ROOT;
								OSSemPend(DisplaySem, 0, &err);
								if(err == OS_NO_ERR){
									MenuDisplayKey(CurMenu);
									Do_Clear_Screen(6,32,7,95);	//clear the menu index field
								}
								OSSemPost(DisplaySem);
								break;
							case 5:		//cut number
								break;
						}
					}
				}
				if(CurItem >= SMTBLLEN){
					OSSemPend(DisplaySem,0,&err);
					if(err == OS_NO_ERR) Do_Clear_Screen(2,0,5,127);
					//	Disp_Word(2,0,0x65e0,02);	//display "NO RECORD"
					//	Disp_Word(2,16,0x8bb0,02);
					//	Disp_Word(2,32,0x5f55,02);
					//}
					OSSemPost(DisplaySem);
					app_printf(TextNoRecord,3,2,0);
				}
				break;
			case KEY_FUNC2:	//Cancel
				return(0);
			case KEY_C:		//delete last number
				return(0);
			case KEY_UP:
				if(CurItem < SMTBLLEN){
					chrTemp = SystemFile.SMTblHead;
					if(CurItem != SystemFile.SMTblHead){
						for(i=0; i<SMTBLLEN; i++){
							if(SystemFile.SMTbl[chrTemp].Next == CurItem){
								Ctr = i;
								CurItem = chrTemp;
								break;
							}
							chrTemp = SystemFile.SMTbl[chrTemp].Next;
						}
					}
					else{
						for(i=0; i<SMTBLLEN; i++){
							if(SystemFile.SMTbl[chrTemp].Next >= SMTBLLEN){//reach the end nod
								Ctr = i;
								CurItem = chrTemp;
								break;
							}
							chrTemp = SystemFile.SMTbl[chrTemp].Next;
						}
					}
				}
				break;
			case KEY_DOWN:
				if(CurItem < SMTBLLEN){
					CurItem = SystemFile.SMTbl[CurItem].Next;
					Ctr++;
					if(CurItem >= SMTBLLEN){
						CurItem = SystemFile.SMTblHead;
						Ctr = 0;
					}
				}
				break;
		}
	}
}


INT8U MFunc_OperateSM(INT16U rom *pItems, INT8U Num);
INT8U MFunc_DisplayString(INT8U X, INT8U coding, INT8U len, INT8U rom * ptr);

#pragma romdata EXTRAM
INT8U rom LenSave[10];
INT8U rom LenPtr;
#pragma romdata CCODE
INT16U rom OperSMItem1[] = {0x5220,0x9664,0x0000};					//delete
INT16U rom OperSMItem2[] = {0x7F16,0x8F91,0x0000}; 					//Edit SMS,zwm added
INT16U rom OperSMItem3[] = {0x53d1,0x9001,0x0000};					//send
INT16U rom OperSMItem4[] = {0x6587,0x672c,0x56de,0x7b54,0x0000};	//text answer
INT16U rom OperSMItem5[] = {0x56de,0x53eb,0x0000};					//call back
INT16U rom OperSMItem6[] = {0x526a,0x5207,0x53f7,0x7801,0x0000}; 	//cut number

INT16U rom OperPBItem1[] = {0x7f16,0x8f91,0x0000};					//edit
INT16U rom OperPBItem2[] = {0x5220,0x9664,0x0000};					//delete

#pragma code MYCODE
INT8U MFunc_ReadSM(INT8U * item){
	INT8U cur,line,pos,len,i,FinishShowed,err,godown;
	INT8U rom *ptr;
	//INT8U rom *pMsg;
	
	cur = *item;
	ptr = &SystemFile.SMTbl[cur].SMContent[0];
	line = 2;
	pos = 0;
	len = SystemFile.SMTbl[cur].SMLength;
	LenPtr = 0;
	FinishShowed = FALSE;
	godown = TRUE;
	OSSemPend(DisplaySem,0,&err);
	if(err == OS_NO_ERR){
		Display_Menu_Icon(0,&PIC_SELECTION);
		Display_Menu_Icon(1,&PIC_RETURN);
		Do_Clear_Screen(6,32,7,95);	//clear the menu index field
	}
	OSSemPost(DisplaySem);
	for(;;){
	  if(godown == TRUE){
		if(len == 0 ){
			if(FinishShowed == FALSE){
				OSSemPend(DisplaySem,0,&err);
				if(err == OS_NO_ERR){
					Do_Clear_Screen(line,0,5,127);
					MenuDisplayName(line,6,TextSmsOver);
					//Disp_Word(line,0, 0x002a, 0x00);
					//Disp_Word(line,8, 0x002a, 0x00);
					//Disp_Word(line,8*2, 0x7ed3, 0x02);
					//Disp_Word(line,8*2+16, 0x675f, 0x02);
					//Disp_Word(line,8*2+16*2, 0x002a, 0x00);
					//Disp_Word(line,8*3+16*2, 0x002a, 0x00);
				}

				LenSave[LenPtr] = 0;	//save the num of word in corrent screen
				LenPtr++;
				OSSemPost(DisplaySem);
				FinishShowed = TRUE;
				if(line == 2) line = 4;
				else line = 2;
			}
		}
		else{
			OSSemPend(DisplaySem,0,&err);
			if(err == OS_NO_ERR){
				Do_Clear_Screen(line,0,line+1,127);
				i = MFunc_DisplayString(line, SystemFile.SMTbl[cur].chrProperty, len, ptr);
			}
			OSSemPost(DisplaySem);
			LenSave[LenPtr] = i;	//save the num of word in corrent screen
			LenPtr++;
			len -= i;
			ptr += i;
			if(line == 2) line = 4;
			else line = 2;
		}
	  }
		
		if(line == 2 || FinishShowed == TRUE){
			switch(MFunc_WaitForInput(0)){
				case 0xff:
					return(1);
				case KEY_FUNC1:	//Enter 
					i = MFunc_OperateSM(OperSMItem1, 6);
					OSSemPend(DisplaySem,0,&err);
					if(err == OS_NO_ERR){
						Display_Menu_Icon(0,&PIC_SELECTION);
						Display_Menu_Icon(1,&PIC_RETURN);
					}
					OSSemPost(DisplaySem);
					if(i == 0xff){	//due to message MSG_MENU_CANCEL
						CurMenu=MENU_ROOT;
						OSSemPend(DisplaySem, 0, &err);
						if(err == OS_NO_ERR){
							MenuDisplayKey(CurMenu);
							Do_Clear_Screen(6,32,7,95);	//clear the menu index field
						}
						OSSemPost(DisplaySem);
						return (1);
					}
					else if(i == 0xfe){	//doe to cancel
						if(line == 2){
							LenPtr --;
							len += LenSave[LenPtr];
							ptr -= LenSave[LenPtr];
							LenPtr --;
							len += LenSave[LenPtr];
							ptr -= LenSave[LenPtr];
						}
						else{
							LenPtr --;
							len += LenSave[LenPtr];
							ptr -= LenSave[LenPtr];
						}
						FinishShowed = FALSE;
						godown = TRUE;
						line = 2;
					}
					else if (i < 6){	//zwm changed
						return (0xf0+i);
					}
					break;
				case KEY_FUNC2:	//Cancel
					return(0);
				case KEY_C:		//Cancel
					return(0);
				case KEY_UP:
					if(LenPtr >=3){
						if(line == 2){
							for(i=0; i<4; i++){
								LenPtr --;
								len += LenSave[LenPtr];
								ptr -= LenSave[LenPtr];
							}
						}
						else{
							for(i=0; i<3; i++){
								LenPtr --;
								len += LenSave[LenPtr];
								ptr -= LenSave[LenPtr];
							}
						}
						FinishShowed = FALSE;
						godown = TRUE;
						line = 2;
					}
					else godown = FALSE;
					break;
				case KEY_DOWN:
					if(FinishShowed == FALSE){
						line = 2;
						godown = TRUE;
					}
					break;
			}
		}
	}
}


#pragma romdata EXTRAM
INT16U rom * ItemSave[10];

#pragma code MYCODE
INT8U MFunc_OperateSM(INT16U rom *pItems, INT8U Num){
	INT8U changecontent,Focus,err,CurItem,pos,i,retval;
	INT8U rom *pMsg;
	
	//display the button name
	OSSemPend(DisplaySem, 0, &err);
	if(err == OS_NO_ERR){
		Display_Menu_Icon(0,&PIC_ACKNOWLEDGE);
		Display_Menu_Icon(1,&PIC_RETURN);
		Do_Clear_Screen(6,32,7,95);	//clear the menu index field
		Do_Clear_Screen(2,0,5,127);
	}
	OSSemPost(DisplaySem);
	for(i=0; i<Num; i++){
		ItemSave[i] = pItems;
		do{
			pItems++;
		}while(*pItems != 0);
		pItems++;
	}	
	
	Focus = 0;	
	CurItem = 0;
	changecontent = TRUE;
	i = 0;
	for(;;){
	  if(changecontent == TRUE){
	  	pos = 32;
		OSSemPend(DisplaySem, 0, &err);
		if(err == OS_NO_ERR){
			Do_Clear_Screen(2,32,5,95);	//clear the menu
			pItems = ItemSave[i];
			do{
				Disp_Word(2,pos,*pItems,0x02);
				pItems++;
				pos += 16;
			}while(*pItems != 0);
			pItems++;
			pItems = ItemSave[i+1];
			pos = 32;
			do{
				Disp_Word(4,pos,*pItems,0x02);
				pItems++;
				pos += 16;
			}while(*pItems != 0);
			pItems++;			
		}
		OSSemPost(DisplaySem);
	  }
		MFunc_Set_Focus(Focus);
		pMsg = OSQPend(peventMenu,0,&err);
		if((INT24U)pMsg > PTR_MAX){
			if((INT24U)pMsg == MSG_MENU_CANCEL){
				return(0xff);
			}
		}
		else{
			retval = 0xff;
			switch(((MSG_KEYPRESS *)pMsg)->Key){
				case KEY_FUNC1:	//Enter 
					retval = CurItem;
					//return(CurItem);
					break;
				case KEY_FUNC2:	//Cancel
					retval = 0xfe;
					//return(0xfe);
					break;
				case KEY_C:		//Cancel
					retval = 0xfe;
					//return(0xfe);
					break;
				case KEY_UP:
					if(CurItem != 0){
						CurItem--;
						if(Focus == 1){
							Focus = 0;
							changecontent = FALSE;
						}
						else{	//Fucus == 0
							changecontent = TRUE;
							i = i-1;
						}
					}
					else changecontent = FALSE;
					break;
				case KEY_DOWN:
					if(CurItem < Num-1){
						CurItem++;
						if(Focus == 0){
							Focus = 1;
							changecontent = FALSE;
						}
						else{	//Fucus == 1
							i++;
							changecontent = TRUE;
						}
					}
					else changecontent = FALSE;
					break;
			}
			Func_Clear_Msg(pMsg);
			if(retval != 0xff) return(retval);
		}
	}
}

*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -