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

📄 phonebook_interface.c

📁 利用61板、SPR模组、SPLC501液晶模组和4×4键盘建立手机通讯录模型
💻 C
字号:
//======================================================
// 文件名称:	PhoneBook_Interface.c
// 功能描述:	通讯录操作界面,包括添加、删除、显示、查询通讯录条目的程序
// 维护记录:	2006-09-20	v1.0
//======================================================

#include "..\include\splc501user.h"
#include "..\include\LCD_Chinese.h"
#include "..\include\CommonFunc.h"
#include "..\include\PY.h"
#include "..\include\PhoneBook.h"
#include "..\include\VoiceDial.h"
#include "..\include\Flash.h"

//========================================================================
//	语法格式:	void PB_Add(void)
//	实现功能:	新增一个通讯录条目
//	参数:		无
//	返回值:	无
//========================================================================
void PB_Add(void)
{
	PHONEBOOK PB_Item={0xffff,"","","","","",0,0,0,0}, *p_PB_Item;

	LCD501_ClrScreen(0);

	p_PB_Item = &PB_Item;
	
	LCD501_ClrScreen(0);
	if(p_PB_Idx->ItemNum==PB_MAX_ITEM)					// 如果条目已经达到最大数量
	{
		LCD501_SetPos(16, 48);
		LCD501_Print("存储区已满!");
		DelayMS(600);
		return;
	}
	/// 提示输入条目信息
	p_PB_Item->Flag_Del = 0;							
	LCD501_SetPos(0,0);
	LCD501_Print("姓名: ");
	PY_GetString(p_PB_Item->Name, sizeof(p_PB_Item->Name)-1);
	if(p_PB_Item->Name[0] == '\0')
		return;

	LCD501_ClrScreen(0);
	LCD501_SetPos(0,0);
	LCD501_Print("电话1: ");
	PY_GetString(p_PB_Item->Tel_1, sizeof(p_PB_Item->Tel_1)-1);
	LCD501_ClrScreen(0);
	LCD501_SetPos(0,0);
	LCD501_Print("电话2: ");
	PY_GetString(p_PB_Item->Tel_2, sizeof(p_PB_Item->Tel_2)-1);
	LCD501_ClrScreen(0);
	LCD501_SetPos(0,0);
	LCD501_Print("Email: ");
	PY_GetString(p_PB_Item->Email, sizeof(p_PB_Item->Email)-1);
	LCD501_ClrScreen(0);
	LCD501_SetPos(0,0);
	LCD501_Print("备注: ");
	PY_GetString(p_PB_Item->Other, sizeof(p_PB_Item->Other)-1);
	
	/// 如果仍有语音拨号空间则提示是否创建语音拨号
	if(p_PB_Idx->Voice_Num<PB_MAX_VOICE)
		p_PB_Item->VoiceIdx = Voice_Train(p_PB_Item);
	else
		p_PB_Item->VoiceIdx = 0xffff;

	p_PB_Item = PB_Item_Insert(p_PB_Item);

	LCD501_ClrScreen(0);
	LCD501_SetPos(24, 48);
	LCD501_Print("添加成功!");
	DelayMS(600);
}

//========================================================================
//	语法格式:	void PB_Del(PHONEBOOK *p_PB_Item)
//	实现功能:	删除当前通讯录条目
//	参数:		p_PB_Item	待删除条目的指针
//	返回值:	无
//========================================================================
void PB_Del(PHONEBOOK *p_PB_Item)
{
	unsigned int KeyCode;

	LCD501_ClrScreen(0);

	LCD501_SetPos(0,0);
	LCD501_Print("◆ ");
	LCD501_PrintPacked(p_PB_Item->Name);
	LCD501_SetPos(16, 32);
	LCD501_Print("确定删除?");
	LCD501_SetPos(16, 48);
	LCD501_Print("1-是  2-否");
	while(1)
	{
		KeyCode = Key_GetCh();
		switch(KeyCode)
		{
			case '1':
				PB_Item_Del(p_PB_Item);
				LCD501_ClrScreen(0);
				LCD501_SetPos(16, 32);
				LCD501_Print("条目已删除");
				DelayMS(600);
				return;
			case '2': case 'n':
				return;
			default:
				break;
		}
	}
}

//========================================================================
//	语法格式:	void PB_Detail(PHONEBOOK *p_PB_Item)
//	实现功能:	查看当前条目的详细内容
//	参数:		p_PB_Item	条目指针
//	返回值:	无
//========================================================================
void PB_Detail(PHONEBOOK *p_PB_Item)
{
	unsigned int KeyCode;
	unsigned int Flag_Page;
	
	LCD501_ClrScreen(0);

	Flag_Page = 1;
	while(1)
	{
		if(Flag_Page==1)					// 第一页
		{
			LCD501_ClrScreen(0);
			LCD501_SetPos(0,0);
			LCD501_Print("◆ ");
			LCD501_PrintPacked(p_PB_Item->Name);
			LCD501_SetPos(0,16);
			LCD501_Print("T1:");
			LCD501_PrintPacked(p_PB_Item->Tel_1);
			LCD501_SetPos(0,32);
			LCD501_Print("T2:");
			LCD501_PrintPacked(p_PB_Item->Tel_2);
			LCD501_SetPos(0,48);
			LCD501_Print("@:");
			LCD501_PrintPacked(p_PB_Item->Email);
		}
		else								// 第二页
		{
			LCD501_ClrScreen(0);
			LCD501_SetPos(0,0);
			LCD501_Print("◆ ");
			LCD501_PrintPacked(p_PB_Item->Name);
			LCD501_SetPos(0,16);
			LCD501_Print("@:");
			if(p_PB_Item->Email[13]!='\0')
				LCD501_PrintPacked(p_PB_Item->Email+13);
			LCD501_SetPos(0,32);
			LCD501_Print("备注:");
			LCD501_PrintPacked(p_PB_Item->Other);
		}
		while((KeyCode=Key_GetCh())=='\0');
		switch(KeyCode)
		{
			case 'u': case 'd': case 'y': 
				Flag_Page = (Flag_Page==1)?2:1;
				break;
			case 'n': case '*': case '#':
				return;
			default:
				break;	
		}
	}
}


//========================================================================
//	语法格式:	void PB_ItemMenu(PHONEBOOK *p_PB_Item)
//	实现功能:	显示当前条目的可操作选项
//	参数:		p_PB_Item	条目指针
//	返回值:	无
//========================================================================
const unsigned char *PB_MenuString[]={
		"查看信息","编辑条目","删除条目","设定语音拨号","取消语音拨号"
	};
void PB_ItemMenu(PHONEBOOK *p_PB_Item)
{
	unsigned int CurItem, ItemCount;
	const unsigned char *PB_MenuItem[4];
	
	PB_MenuItem[0] = PB_MenuString[0];
	PB_MenuItem[1] = PB_MenuString[1];
	PB_MenuItem[2] = PB_MenuString[2];
	
	ItemCount = 4;
	if(p_PB_Item->VoiceIdx!=0xffff)
		PB_MenuItem[3] = PB_MenuString[4];
	else if(p_PB_Idx->Voice_Num < PB_MAX_VOICE)
		PB_MenuItem[3] = PB_MenuString[3];
	else
		ItemCount = 3;
		
	while(1)
	{
		CurItem = ShowMenu(PB_MenuItem, ItemCount);
		switch(CurItem)
		{
		case 0:						// 查看
			PB_Detail(p_PB_Item);
			return;
		case 1:						// 编辑(保留功能)
			//PB_Edit(p_PB_Item);
			break;
		case 2:						// 删除
			PB_Del(p_PB_Item);
			return;
		case 3:						// 更改语音拨号状态
			if(ItemCount==4)
				PB_SwitchVoice(p_PB_Item);
			return;
		case 4:
			return;
		default:
			break;
		}		
	}
}

//========================================================================
//	语法格式:	void PB_List(void)
//	实现功能:	显示通讯录条目列表
//	参数:		无
//	返回值:	无
//========================================================================
void PB_List(void)
{
	PHONEBOOK *p_PB_Temp, *p_PB_Page, *p_PB_Cur;
	unsigned int i, TempFlag,KeyCode;
	
	LCD501_ClrScreen(0);

	p_PB_Cur = p_PB_Idx->FirstItem;
	
	while(1)
	{
		/// 如果没有记录则返回
		if(p_PB_Idx->ItemNum==0)
		{
			LCD501_SetPos(8,48);
			LCD501_Print("没有任何记录!");
			DelayMS(600);
			return;
		}
		/// 跳过当前页之前的条目	
		p_PB_Page = p_PB_Idx->FirstItem;
		while(1)
		{
			p_PB_Temp = p_PB_Page;
			for(i=0; i<4; i++)
			{
				if(p_PB_Temp == p_PB_Cur)break;
				p_PB_Temp = p_PB_Temp->NextItem;
			}
			if(i<4)break;
			p_PB_Page = p_PB_Page->NextItem;
		}
		/// 显示一页内容
		LCD501_ClrScreen(0);
		p_PB_Temp = p_PB_Page;
		for(i=0; i<4; i++)
		{
			LCD501_SetPos(0, i<<4);
			if(p_PB_Temp->Flag_Del==0xffff)
				break;
			else if(p_PB_Temp == p_PB_Cur)
				LCD501_Print("◆ ");
			else
				LCD501_Print("   ");
			LCD501_PrintPacked(p_PB_Temp->Name);
			if(p_PB_Temp->VoiceIdx!=0xffff)
			{
				LCD501_SetPos(120, i<<4);
				LCD501_Print("*");
			}
			p_PB_Temp = p_PB_Temp->NextItem;
		}
		/// 等待按键操作
		TempFlag = 1;
		while(TempFlag)
		{
			KeyCode = Key_GetCh();
			switch(KeyCode)
			{
				case 'u':
					p_PB_Cur = p_PB_Cur->PreItem;
					if(p_PB_Cur->Flag_Del==0xffff)
						p_PB_Cur = p_PB_Idx->LastItem;
					TempFlag = 0;
					break;
				case 'd':
					p_PB_Cur = p_PB_Cur->NextItem;
					if(p_PB_Cur->Flag_Del==0xffff)
						p_PB_Cur = p_PB_Idx->FirstItem;
					TempFlag = 0;
					break;
				case 'y': case '#':
					PB_ItemMenu(p_PB_Cur);					
					if(p_PB_Cur->Flag_Del==0xffff)		//如果条目被删除
					{
						p_PB_Cur = p_PB_Cur->NextItem;
						if(p_PB_Cur->Flag_Del==0xffff)
							p_PB_Cur = p_PB_Idx->FirstItem;
					}
					TempFlag = 0;
					break;
				case 'n': case '*':
					return;					
				default:
					break;
			}
		}
	}
}
	
//========================================================================
//	语法格式:	void PB_Search(void)
//	实现功能:	搜索通讯录条目
//	参数:		无
//	返回值:	无
//========================================================================
void PB_Search(void)
{
	PHONEBOOK *p_PB_Temp, *p_PB_Cur, *p_PB_Page;
	unsigned char Name[sizeof(p_PB_Temp->Name)], i, Flag_Temp, KeyCode;
	
	LCD501_ClrScreen(0);

	/// 提示输入搜索关键字
	LCD501_SetPos(0, 0);
	LCD501_Print("搜索姓名: ");
	PY_GetString(Name, sizeof(p_PB_Temp->Name)-1);
		
	p_PB_Cur = PB_Item_Search(Name, p_PB_Idx->FirstItem, 1);

	while(1)
	{
		// 跳过指针所在页之前的部分
		if(p_PB_Cur==NULL)				// 如果没有找到条目则返回
		{
			LCD501_ClrScreen(0);
			LCD501_SetPos(0,48);
			LCD501_Print("没找到任何记录!");
			DelayMS(600);
			return;
		}
		p_PB_Page = PB_Item_Search(Name, p_PB_Idx->FirstItem, 1);
		while(1)											
		{
			p_PB_Temp = p_PB_Page;		
			for(i=0; i<4; i++)
			{
				if(p_PB_Temp == p_PB_Cur)break;
				p_PB_Temp = PB_Item_Search(Name, p_PB_Temp->NextItem, 1);
			}
			if(i<4)break;
			p_PB_Page = p_PB_Temp;
		}
		LCD501_ClrScreen(0);
		///	显示一页内容
		p_PB_Temp = p_PB_Page;
		for(i=0; i<4; i++)
		{
			LCD501_SetPos(0, i<<4);
			if(p_PB_Temp==NULL)
				break;
			else if(p_PB_Temp == p_PB_Cur)
				LCD501_Print("◆ ");
			else
				LCD501_Print("   ");
			LCD501_PrintPacked(p_PB_Temp->Name);
			if(p_PB_Temp->VoiceIdx!=0xffff)
			{
				LCD501_SetPos(120, i<<4);
				LCD501_Print("*");
			}
			p_PB_Temp = PB_Item_Search(Name, p_PB_Temp->NextItem, 1);
		}
		/// 等待按键输入
		Flag_Temp = 1;
		while(Flag_Temp)
		{
			KeyCode = Key_GetCh();
			switch(KeyCode)
			{
				case 'u':								// 上一条
					p_PB_Cur = PB_Item_Search(Name, p_PB_Cur->PreItem, 0);
					if(p_PB_Cur==NULL)
						p_PB_Cur = PB_Item_Search(Name, p_PB_Idx->LastItem, 0);
					Flag_Temp = 0;
					break;
				case 'd':								// 下一条
					p_PB_Cur = PB_Item_Search(Name, p_PB_Cur->NextItem, 1);
					if(p_PB_Cur==NULL)
						p_PB_Cur = PB_Item_Search(Name, p_PB_Idx->FirstItem, 1);
					Flag_Temp = 0;
					break;
				case 'y': case '#':						// 确定
					PB_ItemMenu(p_PB_Cur);
					if(p_PB_Cur->Flag_Del==0xffff)		//如果该条目被删除
						p_PB_Cur = PB_Item_Search(Name, p_PB_Idx->FirstItem, 1);
					Flag_Temp = 0;
					break;
				case 'n': case '*':						// 取消
					return;					
				default:
					break;
			}
		}
	}	
}

//========================================================================
//	语法格式:	unsigned int PB_SwitchVoice(PHONEBOOK *p_PB_Item)
//	实现功能:	切换某条目的语音拨号属性,设定/取消语音拨号
//	参数:		待处理的条目指针
//	返回值:	切换后该条目对应的语音序号,若被取消则返回0xffff
//========================================================================
unsigned int PB_SwitchVoice(PHONEBOOK *p_PB_Item)
{
	PHONEBOOK_IDX PB_Idx;
	unsigned int VoiceIdx, KeyCode, Flag_Temp, i;
	
	LCD501_ClrScreen(0);

	if(p_PB_Item->VoiceIdx==0xffff)
	{
		VoiceIdx = Voice_Train(p_PB_Item);
	}
	else
	{			
		LCD501_SetPos(16, 32);
		LCD501_Print("取消语音拨号?    1-是  2-否");
		Flag_Temp = 1;
		while(Flag_Temp != 0)
		{
			KeyCode = Key_GetCh();
			switch(KeyCode)
			{
			case '1':
				VoiceIdx = 0xffff;
				Flag_Temp = 0;
				break;
			case '2': case 'n': case '*':
				VoiceIdx = p_PB_Item->VoiceIdx;
				Flag_Temp = 0;
				break;
			default:
				break;
			}
		}
	}
	if(VoiceIdx==p_PB_Item->VoiceIdx)			// 没有更改
		return VoiceIdx;
	
	/// 更新PB_IDX
	PB_Idx.ItemNum = p_PB_Idx->ItemNum;
	PB_Idx.FirstItem = p_PB_Idx->FirstItem;
	PB_Idx.LastItem = p_PB_Idx->LastItem;
	for(i=0; i<PB_MAX_VOICE; i++)
	{
		PB_Idx.Voice_PBAddr[i] = p_PB_Idx->Voice_PBAddr[i];
	}
	
	if(VoiceIdx==0xffff)						// 语音拨号被取消
	{
		PB_Idx.Voice_Num = p_PB_Idx->Voice_Num - 1;
		PB_Idx.Voice_PBAddr[p_PB_Item->VoiceIdx] = NULL;
	}
	else										// 语音拨号被设定
	{
		PB_Idx.Voice_Num = p_PB_Idx->Voice_Num + 1;
		PB_Idx.Voice_PBAddr[VoiceIdx] = p_PB_Item;
	}
	Flash_Modify((unsigned int)p_PB_Idx, (unsigned int*)&PB_Idx, sizeof(PHONEBOOK_IDX));
	Flash_Modify((unsigned int)&p_PB_Item->VoiceIdx, &VoiceIdx, sizeof(unsigned int));
	return VoiceIdx;
}

⌨️ 快捷键说明

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