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

📄 nedu_sub_state.c

📁 一个基于单片机的小型操作系统
💻 C
📖 第 1 页 / 共 3 页
字号:
					default:
						OS_ENTER_CRITICAL();
						Sub_Mode = TCH_INVALIDE;
						OS_EXIT_CRITICAL();
							break;
				}
			}
			else if(Sub_Mode == TCH_K_5)
			{
				Delay(10000);
				switch(number)
				{
					case 1:	
						OS_ENTER_CRITICAL();
						Sub_Mode = TCH_K_M;
						OS_EXIT_CRITICAL();
							break;
					case 2:	
						OS_ENTER_CRITICAL();
						Sub_Mode = TCH_K_N;
						OS_EXIT_CRITICAL();
							break;
					case 3:	
						OS_ENTER_CRITICAL();
						Sub_Mode = TCH_K_O;
						OS_EXIT_CRITICAL();
							break;
					default:
						OS_ENTER_CRITICAL();
						Sub_Mode = TCH_INVALIDE;
						OS_EXIT_CRITICAL();
							break;
				}
			}
			else if(Sub_Mode == TCH_K_6)
			{
				Delay(10000);
				switch(number)
				{
					case 1:	
						OS_ENTER_CRITICAL();
						Sub_Mode = TCH_K_P;
						OS_EXIT_CRITICAL();
							break;
					case 2:	
						OS_ENTER_CRITICAL();
						Sub_Mode = TCH_K_Q;
						OS_EXIT_CRITICAL();
							break;
					case 3:	
						OS_ENTER_CRITICAL();
						Sub_Mode = TCH_K_R;
						OS_EXIT_CRITICAL();
							break;
					default:
						OS_ENTER_CRITICAL();
						Sub_Mode = TCH_INVALIDE;
						OS_EXIT_CRITICAL();
							break;
				}
			}
			else if(Sub_Mode == TCH_K_7)
			{
				Delay(10000);
				switch(number)
				{
					case 1:	
						OS_ENTER_CRITICAL();
						Sub_Mode = TCH_K_S;
						OS_EXIT_CRITICAL();
							break;
					case 2:	
						OS_ENTER_CRITICAL();
						Sub_Mode = TCH_K_T;
						OS_EXIT_CRITICAL();
							break;
					case 3:	
						OS_ENTER_CRITICAL();
						Sub_Mode = TCH_K_U;
						OS_EXIT_CRITICAL();
							break;
					default:
						OS_ENTER_CRITICAL();
						Sub_Mode = TCH_INVALIDE;
						OS_EXIT_CRITICAL();
							break;
				}
			}
			else if(Sub_Mode == TCH_K_8)
			{
				Delay(10000);
				switch(number)
				{
					case 1:	
						OS_ENTER_CRITICAL();
						Sub_Mode = TCH_K_V;
						OS_EXIT_CRITICAL();
							break;
					case 2:	
						OS_ENTER_CRITICAL();
						Sub_Mode = TCH_K_W;
						OS_EXIT_CRITICAL();
							break;
					case 3:	
						OS_ENTER_CRITICAL();
						Sub_Mode = TCH_K_X;
						OS_EXIT_CRITICAL();
							break;
					default:
						OS_ENTER_CRITICAL();
						Sub_Mode = TCH_INVALIDE;
						OS_EXIT_CRITICAL();
							break;
				}
			}
			else if(Sub_Mode == TCH_K_9)
			{
				Delay(10000);
				switch(number)
				{
					case 1:	
						OS_ENTER_CRITICAL();
						Sub_Mode = TCH_K_Y;
						OS_EXIT_CRITICAL();
							break;
					case 2:	
						OS_ENTER_CRITICAL();
						Sub_Mode = TCH_K_Z;
						OS_EXIT_CRITICAL();
							break;
					case 3:	
						OS_ENTER_CRITICAL();
						Sub_Mode = TCH_K_DOT;
						OS_EXIT_CRITICAL();
							break;
					default:
						OS_ENTER_CRITICAL();
						Sub_Mode = TCH_INVALIDE;
						OS_EXIT_CRITICAL();
							break;
				}
			}
			else if(Sub_Mode == TCH_K_0)
			{
				Delay(10000);
				switch(number)
				{
					case 1:	
						OS_ENTER_CRITICAL();
						Sub_Mode = TCH_K_COMA;
						OS_EXIT_CRITICAL();
							break;
					case 2:	
						OS_ENTER_CRITICAL();
						Sub_Mode = TCH_K_EQU;
						OS_EXIT_CRITICAL();
							break;
					case 3:	
						OS_ENTER_CRITICAL();
						Sub_Mode = TCH_K_AT;
						OS_EXIT_CRITICAL();
							break;
					default:
						OS_ENTER_CRITICAL();
						Sub_Mode = TCH_INVALIDE;
						OS_EXIT_CRITICAL();
							break;
				}
			}
		}

		if(Sub_Mode <= 0x5a && Sub_Mode >= 0x2a)   							//读取数据
		{	
			if(flag && Sub_Mode >= 0x41 && Sub_Mode <= 0x5a)				//输入为字母
			{	
				OS_ENTER_CRITICAL();								//关中断
				Sub_Mode+=0x20; 				//切换为小写
				OS_EXIT_CRITICAL(); 
			}               	
			if(line == 0) 				//第一行在输入
			{ 
				if(index < 19)			// 如果name数组没有越界
					rec.name[index++]=Sub_Mode;//往name数组里面存数据
			}
			else if(line == 1)			//第2行在输入
			{	
				if(index1 < 15 )		// 如果telnum数组没有越界
                          		/****如果输入的是0-9的数字或者“-”,往telnum数组里面存数据****/
					if ((Sub_Mode >=0x30 && Sub_Mode <=0x39)||Sub_Mode ==0x2d)
						rec.telnum[index1++]=Sub_Mode;
			}
			else if(line == 2)			//第3行在输入
			{	
				if(index2 < 15)			// 如果plmnum数组没有越界
					if(Sub_Mode >=0x30 && Sub_Mode <=0x39)	//往plmnum数组里面存数据,只能是数字
						rec.plmnum[index2++]=Sub_Mode;
			}
			else if(line == 3)			//第4行在输入
			{	
				if(index3 < 24)			// 如果mail数组没有越界
					rec.mail[index3++]=Sub_Mode;//往mail数组里面存数据
			}
		}//end if

	    switch(Sub_Mode)
		{		
			case TCH_K_Line1: 				//点击姓名输入栏
				line=0;							//将line置零   
				LCD_Clear(CLR_ALL);
				LCD_loard_tig(PDA_SETREC);
				break;
			case TCH_K_Line2: 				//点击电话号码输入栏
				line=1;							//将line置1   
				LCD_Clear(CLR_ALL);
				LCD_loard_tig(PDA_SETREC);
				break;	
			case TCH_K_Line3:				//点击手机号码输入栏
				line=2;							//将line置2  
				LCD_Clear(CLR_ALL);
				LCD_loard_tig(PDA_SETREC);
				break;	
			case TCH_K_Line4:				//点击邮箱输入栏
				line=3;							//将line置3  
				LCD_Clear(CLR_ALL);
				LCD_loard_tig(PDA_SETREC);
				break;							
			case TCH_RETURN: 				//返回
				line=0;							//将line置零   
				return; 						//返回		
			case TCH_K_Esc: 				//返回上一级操作界面, 返回之前将用户输入的记录清空
				line=0;							//将line置零 
				return;							//返回
			case TCH_K_Del:   				//往前删除一个字符
				if(line == 0)
				{	
					if(index > 0)
					{
						rec.name[--index]=0x0;   	//在当前行往前删除一个字符
						
					}
				}
				else if(line == 1)
				{
				    if(index1 > 0)
				    {
						rec.telnum[--index1]=0x0;	//在当前行往前删除一个字符	           
					}
				}
				else if(line==2)
				{
				    if(index2 > 0)
					rec.plmnum[--index2]=0x0;	//在当前行往前删除一个字符                       
				}
				else if(line==3)
				{
				    if(index3 > 0)
					rec.mail[--index3]=0x0;		//在当前行往前删除一个字符      
				}
				LCD_Clear(CLR_ALL);							//清除屏幕
				LCD_loard_tig(PDA_SETREC);					//初始化所有显示缓冲区
				break;
			case TCH_K_ENTER:   				// ENTER 键事件处理
				if(rec.name[0]==0x0 )
				{
					line=0;							// 姓名为空,跳到第一行,继续输入
				}
				else if(rec.telnum[0]==0x0 )
				{
					line=1;							// 电话号码为空,跳到第2行,继续输入
				}
				else if(rec.plmnum[0]==0x0)
				{
					line=2;							// 手机号码为空,跳到第3行,继续输入
				}
				else if(rec.mail[0]==0x0)
				{
					line=3;							// 邮箱为空,跳到第4行,继续输入
				}	
				else  if(rec.name[0]!=0x0 && rec.telnum[0]!=0x0 && rec.plmnum[0]!=0x0 && rec.mail[0]!=0x0)	//姓名,电话号码,手机号码,邮箱都不为空
				{
					InsertALine(file,filename,rec);	//调用插入方法,将用户输入的记录数据插入文件
					line=0;							// 然后将line置零  
					return;							//返回
				}
				LCD_Clear(CLR_ALL);
				LCD_loard_tig(PDA_SETREC);
				break;
			case TCH_K_Sft:	 					// Sft键事件处理,/按Sft键转换字母的大小写	
				flag = !flag;						//改变标志值       	   	    				   		    	    			    		
				break;		
		}//end switch	
	OS_ENTER_CRITICAL();								//关中断
	Sub_Mode = TCH_INVALIDE;
	OS_EXIT_CRITICAL(); 								//开中断
	OSTimeDly(1); 										//延时
	}//end while
	return;
}
/*
**********************************************************************************************************************
*                       DIS_MIAN
*
* 作者:朱成果
*
* 时间:2006年5月15日
*
* 描述:显示主菜单。
*
* 参数:无
*
* 返回值:无
* 
***********************************************************************************************************************
*/
void dis_main(void)
{
	LCD_Clear(CLR_ALL);
	LCD_loard_tig(PDA_VERSION);
	LCD_loard_tig(PDA_MAINPAGE);
	return;
}
/*
**********************************************************************************************************************
*                       DIS_TIME
*
* 作者:朱成果
*
* 时间:2006年6月5日
*
* 描述:显示系统时间。
*
* 参数:无
*
* 返回值:无
* 
***********************************************************************************************************************
*/
void dis_time(void)
{
	int i;
	OS_CPU_SR  cpu_sr;
	U32 bcolour=0xDB;			//显示背景色
	U32 fcolour=0x00;			//显示前景色
	U32 t_offset=0x5a0;			//条目间距
	U32* pList_t;				//显示指针
	
	LCD_Clear(CLR_ALL);			//显示背景
	LCD_loard_tig(PDA_SYSTIME);
	LCD_loard_tig(PDA_VERSION);
	LCD_loard_tig(BT_RETURN);
    
	for(;;)
	{
		Rtc_Read();
		pList_t =(U32*)0xc005588;
		BCDU32toAsc(HexToInt((U32)RTC_data.year));
		(void)LCD_Prints(intstr,fcolour,pList_t,bcolour);
		BCDU8toAsc(HexToInt((U8)RTC_data.month));
		pList_t += t_offset;
		(void)LCD_Prints(intstr,fcolour,pList_t,bcolour);
		BCDU8toAsc(HexToInt(RTC_data.day));
		pList_t += t_offset;
		(void)LCD_Prints(intstr,fcolour,pList_t,bcolour);
		BCDU8toAsc(HexToInt(RTC_data.hour));
		pList_t += t_offset;
		(void)LCD_Prints(intstr,fcolour,pList_t,bcolour);
		BCDU8toAsc(HexToInt(RTC_data.min));
		pList_t += t_offset;
		(void)LCD_Prints(intstr,fcolour,pList_t,bcolour);
		BCDU8toAsc(HexToInt(RTC_data.sec));
		pList_t += t_offset;
		(void)LCD_Prints(intstr,fcolour,pList_t,bcolour);

		for(i=0;i<200;i++)
		{
			if(Sub_Mode == TCH_RETURN || Sub_Mode == TCH_K_ENTER)
			{
				OS_ENTER_CRITICAL();
				Sub_Mode = TCH_INVALIDE;
				OS_EXIT_CRITICAL(); 
				return;
			}
			OSTimeDly(5);
		}

	}//end for
	return;
}
/*
**********************************************************************************************************************
*                       SUB_DIS_DATE
*
* 作者:胡仲华 曹攀
*
* 时间:2007年7月3日
*
* 描述:日历打印程序。即显示指定年月的日历到LCD上。
*
* 参数:U32 year	:指定的年份。
*		 U32 month	:指定的月份。
*
* 返回值:无
* 
***********************************************************************************************************************
*/
void sub_dis_date(U32 year,U8 month,U8 data)
{
	U32 bcolour=0xff;					//背景色
	U32 fcolour=0x00;					//前景色
	U32 d_offset=0x5a0;					//日显示时向下偏移量
	U32 r_offset=6;						//日显示时向右偏移量
	U32* pList_d=(U32*)0xc00a028;		//日显示指针
	U32* pList_m=(U32*)0xc005bd0;		//月显示指针
	U32* pList_y=(U32*)0xc005b78;		//年显示指针
	U8 i=1;
	int j;
	int week;							//本月首天的星期
	U8 days;							//本月天数

	BCDU32toAsc(year);
	(void)LCD_Prints(intstr,fcolour,pList_y,bcolour);		//向LCD上输出年份
	BCDU8toAsc(month);
	(void)LCD_Prints(intstr,fcolour,pList_m,bcolour);		//向LCD上输出月份
	
	getDate(year,month,&week,&days);
	if(data > days)
		data = days;
	
	for(j=0;j<6;j++)										//清空日期显示部分
	{
		(void)LCD_Prints("                    ",fcolour,pList_d,bcolour);
		pList_d+=d_offset;
	}
	/*向LCD上输出日历*/
	pList_d = r_offset*week+(U32*)0xc00a028;
	
	/***输出日历第一行***/
	for(j = week;j<7;j++)
	{	
		if(i == data)
		{
			fcolour=0xff;
			bcolour=0x33;
		}
		BCDU8toAsc(i);
		(void)LCD_Prints(intstr,fcolour,pList_d,bcolour);
		i++;
		pList_d += r_offset;
		fcolour=0x00;
		bcolour=0xff;
	}
	/***输出日历其余行***/
	do
	{     
		pList_d -= 42;
		pList_d += d_offset;
		for(j = 0;j < 7;j++)
		{	
			if(i <= days)
			{
				if(i == data)
				{
					fcolour=0xff;
					bcolour=0x33;
				}
				BCDU8toAsc(i);
				(void)LCD_Prints(intstr,fcolour,pList_d,bcolour);
				i++;
				pList_d += r_offset;
				fcolour=0x00;
				bcolour=0xff;
			}
		}
		
	}while(i <= days);

}
/*
**********************************************************************************************************************
*                       DIS_DATE
*
* 作者:胡仲华 曹攀
*
* 时间:2007年7月3日
*
* 描述:显示系统日历。按"上一月","下一月","返回"进行对应的操作。
*
* 参数:无
*
* 返回值:无
* 
***********************************************************************************************************************
*/
void dis_date(void)
{
	OS_CPU_SR  cpu_sr;
	U32	year;			//要显示日历的年份
	U8 month;			//要显示日历的月份
	U8 data;			//要显示日历的日期
	
	LCD_Clear(CLR_ALL);					//显示背景
	LCD_loard_tig(PDA_VERSION);
	LCD_loard_tig(PDA_SYSDATE);
	
	/****向LCD上输出当前年月的日历****/
	year=(U32)RTC_data.year;
	month=(U8)RTC_data.month;
	data=(U8)RTC_data.day;
	year=HexToInt(year);
	month=HexToInt(month);
	data=HexToInt(data);
	sub_dis_date(year,month,data);
	
	OS_ENTER_CRITICAL();
	Sub_Mode = TCH_INVALIDE;
	OS_EXIT_CRITICAL();

	while(1)
	{
		if(Sub_Mode == TCH_RETURN||Sub_Mode == TCH_K_ENTER)		//如果当前子状态为TCH_RETURN,则返回主菜单。
		{
			OS_ENTER_CRITICAL();
			Sub_Mode = TCH_INVALIDE;
			OS_EXIT_CRITICAL(); 
			return;
		}
		if(Sub_Mode == TCH_PREV || Sub_Mode == TCH_K_9)			//如果当前子状态为TCH_PREV,则在LCD上显示上个月的日历。
		{
			month--;
			//month小于等于0,则显示上一年12月
			if(month<1)
			{
				year--;
				month=12;
			}
			//日历显示上边界为1999.1
			if(year == 1998)
			{
				year = 1999;
				month = 1;
			}
			sub_dis_date(year,month,data);
		}
		else if(Sub_Mode == TCH_NEXT || Sub_Mode == TCH_K_3)	//如果当前子状态为TCH_NEXT,则在LCD上显示下个月的日历。
		{
			month++;
			//month大于等于12,则显示下一年1月
			if(month>12)
			{
				year++;
				month=1;
			}
			//日历显示下边界为2098.12
			if(year == 2099)
			{
				year = 2098;
				month = 12;
			}
			sub_dis_date(year,month,data);
		}
			OS_ENTER_CRITICAL();
			Sub_Mode = TCH_INVALIDE;
			OS_EXIT_CRITICAL(); 
			OSTimeDly(200); 
	}//end while
}

//the end of sub_state module

⌨️ 快捷键说明

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