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

📄 f_cr.c

📁 本人编写的无线电话程序,给予PIC18C801设计,包括了uCOS的移植以及菜单,自己设计的拼音注入法,完整地一级汉字库,希望对大家有所帮助
💻 C
字号:
#include "includes.h"
#include "file.h"
#include "f_callrecord.h"
#include "filesys.h"

#define	MENU_BOOK_END		5
#define	MENU_ROOT			0

extern INT8U rom usrpri_file[];

extern INT8U rom PIC_RETURN;		//返回(取消)
extern INT8U rom PIC_SAVE;			//保存
extern rom INT8U	CurPhoneNum[];				//电话号码(ASCII代码)
extern INT8U		CurPhoneNumLen;					//电话号码长度

extern INT8U CurMenu;
extern INT8U PrevMenu;	//used when exit from MENU_BOOK_END
extern rom INT16U	*CurText;						//文本字符串或姓名字符串指针(必须指向RAM的变量,因为可能要修改其中的内容)
extern INT8U		CurTextLen;						//文本字符串或姓名字符串的长度

//extern OS_EVENT  *rom DisplaySem;

extern INT8U rom UnreadUnacceptCall;

extern rom INT16U TextNoRecord[6];
extern rom INT16U *app_printf(rom INT16U *,INT8U,INT8U,INT8U);

extern INT8U MFunc_InsertPhoneBookItem(INT16U rom * pName, INT8U NameLen, INT8U rom * pNum, INT8U NumLen, INT8U Group);

extern void Display_Menu_Icon(INT8U LorR, INT8U rom * ptrD);
extern void Do_Clear_Screen(unsigned char startX,unsigned char startY,unsigned char endX,unsigned char endY);
extern unsigned char Disp_Word(unsigned char PosX,unsigned char PosY,unsigned int unicode,unsigned char Type);
void Func_DisplayNumAndTime(INT8U rom * ptrNum, INT8U Len, NM_TIME * ptrTime);
void Func_DisplaySmallIndex (INT8U Index);
INT8U MFunc_WaitForInput(INT8U);
INT8U EnterPhoneEdit(void);
void MFunc_DirectCall(INT8U rom * ptrData, INT8U Len);
void MenuDisplayKey(INT8U menu);



INT8U CallRecord_Check(INT8U record){
	INT8U head, tail,err,len, current,fhdl,i;
	CALLRECORDTBL * prp;

	Display_Menu_Icon(0,&PIC_SAVE);
	Display_Menu_Icon(1,&PIC_RETURN);
	Do_Clear_Screen(6,32,7,95);
	
	fhdl = file_open(usrpri_file, (INT8U rom **)(&prp));//Read_Domain(domain, (INT8U rom *)ptrRecord); //refresh the record
	switch(record){
		case UNACCEPTCALL:
			UnreadUnacceptCall = 0;
			prp = (CALLRECORDTBL *)&(((F_UserPrivate *)prp)->UnAcceptCall);
			break;
		case RECENTTXCALL:
			prp = (CALLRECORDTBL *)&(((F_UserPrivate *)prp)->RecentTxCall);
			break;
		case RECENTRXCALL:
			prp = (CALLRECORDTBL *)&(((F_UserPrivate *)prp)->RecentRxCall);
			break;
	}

	if((prp->head > CALLRECORDNUM-1) || (prp->len > CALLRECORDNUM)){
		head = 0;
		tail = 0;
		len = 0;
		current = 0;
	}
	else{
		head = prp->head;
		len = prp->len;
		tail = (head+len-1)%CALLRECORDNUM;
		current = tail;
	}
	for(;;){
		if(len == 0){
			app_printf(TextNoRecord,3,2,0);
		}
		else{
			Do_Clear_Screen(6,32,7,95);
			Do_Clear_Screen(2,0,5,127);
			
			Func_DisplayNumAndTime(&(prp->num[current][0]), 12, &(prp->time[current]));
			Func_DisplaySmallIndex (((tail + CALLRECORDNUM - current) % CALLRECORDNUM)+1);
			
			CurPhoneNumLen = app_c2a(&prp->num[current][0], 12, CurPhoneNum);
		}
		
		switch(MFunc_WaitForInput(0)){
			case 0xff:
				return(1);
			case KEY_FUNC1:	//Save
				PrevMenu=CurMenu;
				CurMenu=MENU_BOOK_END; 
				i=EnterPhoneEdit();
				CurMenu=PrevMenu;
				
				if(i==2){
					//Save to PhoneBook
					MFunc_InsertPhoneBookItem(CurText, CurTextLen, CurPhoneNum, CurPhoneNumLen, 0);
					return(0);
				}
				break;

			case KEY_FUNC2:	//Cancel
				return(0);
			case KEY_C:		//Cancel
				return(0);
			case KEY_UP:
				if(len != 0){
					if(current != tail)
						current = (current + 1)%CALLRECORDNUM;
					else
						current = head;
				}
				break;
			case KEY_DOWN:
				if(len != 0){
					if(current != head)
						current = (current + CALLRECORDNUM - 1)%CALLRECORDNUM;
					else
						current = tail;
				}
				break;
			case KEY_SEND:
				Do_Clear_Screen(2,0,5,127);
				Do_Clear_Screen(6,32,7,95);	//clear the menu index field
				CurMenu=MENU_ROOT;
				MenuDisplayKey(CurMenu);
				MFunc_DirectCall(prp->num[current],12);
				return(1);
				break;
			
		}
	}
}


//save to call records, in BUSPHONE version, this part is needed
#pragma code MYCODE
void CallRecord_Save(INT8U rom * ptrNum, INT8U NumLen, NM_TIME * ptrCallStartTime, INT8U record){
	CALLRECORDTBL * prp;
	INT8U Temp,i,j,fhdl;
	INT16U offset;

	fhdl = file_open(usrpri_file, (INT8U rom **)(&prp));
	switch(record){
		case UNACCEPTCALL:
			prp = (CALLRECORDTBL *)&(((F_UserPrivate *)prp)->UnAcceptCall);
			offset = offsetof(F_UserPrivate,UnAcceptCall);
			break;
		case RECENTTXCALL:
			prp = (CALLRECORDTBL *)&(((F_UserPrivate *)prp)->RecentTxCall);
			offset = offsetof(F_UserPrivate,RecentTxCall);
			break;
		case RECENTRXCALL:
			prp = (CALLRECORDTBL *)&(((F_UserPrivate *)prp)->RecentRxCall);
			offset = offsetof(F_UserPrivate,RecentRxCall);
			break;
	}

	if(prp->head > CALLRECORDNUM-1 || prp->len > CALLRECORDNUM){
		prp->head = 0;
		prp->len = 0;
	}
	if(prp->len == CALLRECORDNUM){
		Temp = prp->head;
		prp->head=(prp->head+1)%CALLRECORDNUM;
	}
	else{
		Temp = (prp->head + prp->len)%CALLRECORDNUM;
		prp->len++;
	}
	
	app_a2c(ptrNum, NumLen, (INT8U rom *)&(prp->num[Temp][0]));
	
	prp->time[Temp].chrYear = ptrCallStartTime->chrYear;
	prp->time[Temp].chrMonth = ptrCallStartTime->chrMonth;
	prp->time[Temp].chrDate = ptrCallStartTime->chrDate;
	prp->time[Temp].chrHour = ptrCallStartTime->chrHour;
	prp->time[Temp].chrMinute = ptrCallStartTime->chrMinute;
	prp->time[Temp].chrSecond = ptrCallStartTime->chrSecond;
	
	file_save(	fhdl,
				offset+offsetof(CALLRECORDTBL, num[Temp][0]),
				12);
	file_save(	fhdl,
				offset+offsetof(CALLRECORDTBL, time[Temp]),
				sizeof(NM_TIME));
	file_save(	fhdl,
				offset+offsetof(CALLRECORDTBL, head),
				2*sizeof(INT8U));
}

⌨️ 快捷键说明

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