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

📄 tskmenu.c

📁 本人编写的无线电话程序,给予PIC18C801设计,包括了uCOS的移植以及菜单,自己设计的拼音注入法,完整地一级汉字库,希望对大家有所帮助
💻 C
📖 第 1 页 / 共 4 页
字号:
							Do_Clear_Screen(6,32,7,95);	//clear the menu index field
							MenuDisplayPinYin(tmpval);	//display PinYin
					}
					else if((CurInputMethod==ENGLISH && MenuTimerRunning==0)||
									(CurInputMethod==PINYIN && HanZiSel==0 && CurInputCharsLen==0)){
						if(CurTextLen>0){
							if(CurTextIstPos==CurTextLen-1)
								CurTextIstPos=0xFF;
							else if(CurTextIstPos!=0xFF)
								CurTextIstPos++;
	
							Do_Clear_Screen(2,0,3,127);
							MenuDisplayText();
						}
					}
				break;
				
				case '*':
					if(CurInputMethod==ENGLISH && MenuTimerRunning==0){
						if(CurInputCase==UPPER_CASE)
							CurInputCase=LOWER_CASE;
						else
							CurInputCase=UPPER_CASE;
					}
				break;
				
				case '#':
					if(CurInputMethod==PINYIN && HanZiSel==0 && CurInputCharsLen>0){
						tmpval=GetPYNode(tmpkey);
						HanZiSel=1;
						LetterLinePos=0;
						tmpval=HanZiSelNum>MAX_DISP_HANZI_SEL ? MAX_DISP_HANZI_SEL : HanZiSelNum;
						Do_Clear_Screen(4,0,5,127);
						app_printf(pLetterLine,tmpval,4,0);
					}
				break;

				default:
			   		if(tmpkey <= '9' && tmpkey >= '0'){
			   			if(CurInputMethod==PINYIN){	
			   				if(HanZiSel==1 && tmpkey>='1' && tmpkey<=MAX_DISP_HANZI_SEL+0x30 && (HanZiSelNum-LetterLinePos)!=0){
			   					if((tmpkey-0x31)<(HanZiSelNum-LetterLinePos)){
									if(CurTextIstPos==0xFF)
				   						CurText[CurTextLen++]=pLetterLine[LetterLinePos+tmpkey-0x31];
									else{
										for(i=CurTextLen;i>CurTextIstPos;i--)
											CurText[i]=CurText[i-1];
										CurText[CurTextIstPos++]=pLetterLine[LetterLinePos+tmpkey-0x31];
										CurTextLen++;
									}
			   						
									Do_Clear_Screen(2,0,5,127);
									Do_Clear_Screen(6,32,7,95);
									MenuDisplayText();
									HanZiSel=0;						//准备输入拼音
									LetterLinePos=0;				//待选汉字清零
									CurInputCharsLen=0;				//拼音清零
			   					}
			   				}
			   				else if(HanZiSel==0 &&  tmpkey>='2' && CurInputCharsLen<6){
			   					tmpval=GetPYNode(tmpkey);			   	//CurInputChars[CurInputCharsLen++]=tmpkey;
								Do_Clear_Screen(6,32,7,95);	//clear the menu index field
								MenuDisplayPinYin(tmpval);		//Display PinYin
			   				}
			   			}
			   			else if(CurInputMethod==ENGLISH){		//英文处理
			   				if(tmpkey!=PrevKey){				//上一个键值所代表的字母已取;或者快速按其它键
								MenuTimerRunning=TIMER_ENGLISH_INPUT_VAL;			//反正要(重新)启动定时,省去可能的停止定时步骤
									
								if(PrevKey!=0){				//PrevKey==0表示键值所代表的字母已因超时被取走,或刚开始时无键值。
									if(CurTextIstPos==0xFF)
										CurText[CurTextLen++]=pLetterLine[LetterLinePos];
									else{
										for(i=CurTextLen;i>CurTextIstPos;i--)
											CurText[i]=CurText[i-1];
										CurText[CurTextIstPos++]=pLetterLine[LetterLinePos];
										CurTextLen++;
									}
								}

								if(CurInputCase==LOWER_CASE)		//小写
									pLetterLine=MenuEditLowerKey[tmpkey-0x30];
								else								//大写
									pLetterLine=MenuEditUpperKey[tmpkey-0x30];
								LetterLinePos=0;
								PrevKey=tmpkey;
								
								Do_Clear_Screen(2,0,5,127);

								MenuDisplayText();
								app_printf(pLetterLine,0,4,0);
								Disp_Word(4,LetterLinePos<<3,pLetterLine[LetterLinePos],(PIX8|PIX_REVERSE));	//Highlight
							}
							else{					//if(tmepkey==PrevKey)	//MenuTimerRunning=1 肯定!否则,PrevKey==0x00
								LetterLinePos=(LetterLinePos+1)%LetterLineLen[tmpkey-0x30];	//这里要用到各自的长度

								if(CurInputCase==LOWER_CASE)		//小写
									pLetterLine=MenuEditLowerKey[tmpkey-0x30];
								else								//大写
									pLetterLine=MenuEditUpperKey[tmpkey-0x30];
									
								Do_Clear_Screen(4,0,5,127);
								app_printf(pLetterLine,0,4,0);
								Disp_Word(4,LetterLinePos<<3,pLetterLine[LetterLinePos],(PIX8|PIX_REVERSE));	//Highlight
								MenuTimerRunning=TIMER_ENGLISH_INPUT_VAL;						//尽管已经MenuTimerRunning==1,但为防万一。
							}
			   			
			   			}	//	end of 英文处理
			   			else if(CurInputMethod==SYMBOL && tmpkey>='1' && tmpkey<='8'){		//从1开始计数,一行共有8个符号
							if(CurTextIstPos==0xFF)
								CurText[CurTextLen++]=MenuEditSymbol[CurLineNo][tmpkey-0x31];
							else{
								for(i=CurTextLen;i>CurTextIstPos;i--)
									CurText[i]=CurText[i-1];
								CurText[CurTextIstPos++]=MenuEditSymbol[CurLineNo][tmpkey-0x31];
								CurTextLen++;
							}

							Do_Clear_Screen(2,0,3,127);
							MenuDisplayText();
			   			}
			   		}
				break;
		}
	}			//End of "for"
}


//Function of editing SMS
//Pre-operation: assign "CurText","CurTextLen","CurPhoneNum" and "CurPhoneNumLen".
INT8U MFunc_EditSMS(INT8U type)
{
	INT8U 		i,retval;
	INT8U		tmpkey;
	INT8U 		err;
	INT8U rom * pSml;
	INT8U rom * pLge;
	
	retval=EnterTextEdit();
	if(retval==2){	//return from "PIC_ACKNOWLEDGE"

		//Begin from "EnterPhoneEdit()"
		retval=EnterPhoneEdit();
		if(retval==2 || retval==0){
			if(retval==2){
				Do_Clear_Screen(4,0,5,127);
				Disp_Word(2,CurPhoneNumLen*6,' ',PIX8);
				Display_Menu_Icon(0,&PIC_SEND);
			}
			else{
				Do_Clear_Screen(2,0,5,127);
				Display_Menu_Icon(0,&PIC_RETURN);
				app_printf(TextQSave,3,2,0);
			}
			Display_Menu_Icon(1,&PIC_SAVE);

			tmpkey=MFunc_WaitForInput(0);
			
			switch(tmpkey){
				case 0xFF:
					return(1);

				case KEY_FUNC1: 
					if(retval==2){		//retval==2 means PhoneNumber has been entered.
						retval=0;
						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;
								for(i = 0; i< CurPhoneNumLen; i++){
									*pLge++ = CurPhoneNum[i];
								}
								for(i=0; i<CurTextLen; i++){
									*pLge++=(INT8U)((CurText[i]>>8) & 0xFF);
									*pLge++=(INT8U)(CurText[i]& 0xFF);
									if(i>71) break;
								}

								((MSG_HEAD *)pSml)->LenOfAttach = 1+CurPhoneNumLen + (CurTextLen<<1);
								OSQPost(peventWICCmd, pSml);
								
								MFunc_WaitSendResult();
							}
							else{				//Can't allocate large-size memory
								OSMemPut(pMemSml,pSml);
							}
						}
					}
					break;
					
				case KEY_FUNC2:	//Save SMS
					pLge = OSMemGet(pMemLge, &err);
					if(err == OS_NO_ERR){
						pSml = pLge;//just save the pointer
						*pLge++ = CurPhoneNumLen;
						for(i = 0; i< CurPhoneNumLen; i++){
							*pLge++ = CurPhoneNum[i];
						}
						Func_GetSysTime((NM_TIME *)pLge);
						pLge += sizeof(NM_TIME);
						*pLge++ = SM_UNICODE;
						*pLge++ = CurTextLen*2;
						for(i=0; i<CurTextLen; i++){
							*pLge++=(INT8U)((CurText[i]>>8) & 0xFF);
							*pLge++=(INT8U)(CurText[i]& 0xFF);
							if(i>71) break;
						}
						MFunc_SaveSM(pSml, 1);
						OSMemPut(pMemLge, pSml);
					}
					break;
				case KEY_C:		//Cancel
					retval=0;
					break;
			}	//End of "switch()"
		}			//End of "EnterPhoneEdit()"
	}				//End of "EnterTextEdit()"
	return(retval);
}


//Display Text,including SMS and Name
//Before this function is called,"CurText","CurTextIstPos" and "CurTextLen" should be assigned value.
void MenuDisplayText()
{
	INT8U 	startpos,endpos;
	INT8U	i,finding;
	INT8U	count;
	INT8U	PosY,chpos;
	rom INT8U	*pchar;
	
	if(CurTextLen<=0)
		return;

	startpos=0;
	endpos=0;
	finding=0;

	while(finding==0 || endpos==0){
		count=0;
		for(i=0;i<16;){
			if((CurText[startpos+count]>>8)!=0)		//Chinese Character
				i+=2;
			else
				i++;
			if(i>16){			//Only PIX8 left,cannot display a Chinese Character
				if(finding)
					endpos=startpos+count;
				else
					startpos+=count;
				break;			//break from "for"
			}
			else{
				count++;
				if(startpos+count>CurTextIstPos){
					finding=1;
					if(i==16)
						endpos=startpos+count;
				}
				else{
					if(i==16)
						startpos+=count;
				}
			}
			if(startpos+count>=CurTextLen){
				finding=1;		//ready to break from "while"
				endpos=CurTextLen;
				break;			//break from "for"
			}
		}
	}

	PosY=0;
	pchar=(rom INT8U *)&CurText[startpos];
	
	for(i=0;i<endpos-startpos;i++){
		if(i+startpos==CurTextIstPos)
			finding=PIX_REVERSE;
		else
			finding=0x00;

		chpos=i<<1;
		if(pchar[chpos+1]==0){
			(void)Disp_Word(2,PosY,(INT16U)(pchar[chpos]),PIX8|finding);
			PosY+=8;
		}
		else{
			(void)Disp_Word(2,PosY,*((rom INT16U *)(&(pchar[chpos]))),PIX16|finding);
			PosY+=16;
		}
	}
	if(PosY<120 && CurTextIstPos==0xFF)
		(void)Disp_Word(2,PosY,'_',PIX8);											//显示光标
}



void MFunc_DirectCall(INT8U rom * ptrData, INT8U Len){
	INT8U rom * pSml;
	INT8U i,err;
	
	pSml = OSMemGet(pMemSml, &err);
	if(err == OS_NO_ERR) {
		((MSG_HEAD *)pSml)->Msg_ID = MSG_VOICE_DIRECTCALL;
		((MSG_HEAD *)pSml)->pmemME = pMemSml;
		((MSG_HEAD *)pSml)->Attached = FALSE;
		((MSG_HEAD *)pSml)->LenOfBody = Len;
		for(i = 0; i < Len; i++){
			((MSG_DIRECTCALL *)pSml)-> Num[i] = *ptrData++;
		}
		OSQPost(peventDVS, (OS_EVENT *) pSml);
	}
}

void MFunc_WaitSendResult()
{
	INT8U err;
	INT8U rom *pMsg;

	Do_Clear_Screen(2,0,5,127);
	app_printf(TextSending,0,2,16);

	for(;;){
		pMsg=OSQPend(peventMenu,1000,&err);
		if(err==OS_TIMEOUT){
			Do_Clear_Screen(2,0,3,127);
			app_printf(TextSendFail,0,2,16);
			OSTimeDly(200);
			break;
		}
		else if((INT24U)pMsg >= PTR_MAX){
			if((INT24U)pMsg == MSG_SM_SENDSUCC){
				Do_Clear_Screen(2,0,3,127);
				app_printf(TextSendSucc,0,2,16);
				OSTimeDly(200);
				break;
			}
			else if((INT24U)pMsg == MSG_SM_SENDFAIL){
				Do_Clear_Screen(2,0,3,127);
				app_printf(TextSendFail,0,2,16);
				OSTimeDly(200);
				break;
			}
		}
		else{
			Func_Clear_Msg(pMsg);			
		}
	}
}

⌨️ 快捷键说明

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