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

📄 menu.c

📁 由华邦单片机w78e516bc1来控制RC531设计的一款读写器
💻 C
📖 第 1 页 / 共 2 页
字号:
//**********************************************************************//
//      Copyright (c) 2003,上海复旦微电子股份有限公司应用系统部			//
// 									 									//
//* 文件标识:MENU.c							 						//
//* 摘要:该文件提供FM222测试系统菜单操作的程序		 	//
//* 作者: 王文清														      //
//* 完成日期: 2003年9月12日					         				      //
//* 原作者:输入原作者(或修改者)名字                                 //
//* 完成日期:											 			      //
//*********************************************************************//

#include <absacc.h>
#include <intrins.h>
#include "main.h"
#include "globe.h"
#include "lcd.h"
#include "comm.h"
#include "rc531.h"
#include "key_drv.h"
//菜单显示定义
	// 1.Request
uchar code menu0[]={0x01,0x3e,0x1b,0x28,0x34,0x38,0x28,0x36,0x37,0xff};
	// 2.Anticoll	
uchar code menu1[]={0x02,0x3e,0x0a,0x31,0x37,0x2c,0x26,0x32,0x2f,0x2f,0xff};
	// 3.Select
uchar code menu2[]={0x03,0x3e,0x1c,0x28,0x2f,0x28,0x26,0x37,0xff};
	// 4.Authent
uchar code menu3[]={0x04,0x3e,0x0a,0x38,0x37,0x2b,0x28,0x31,0x37,0xff};
	//5.Halt
uchar code menu4[]={0x05,0x3e,0x11,0x24,0x2f,0x37,0xff};
	//6.Read
uchar code menu5[]={0x06,0x3e,0x1b,0x28,0x24,0x27,0xff};
	//7.Write
uchar code menu6[]={0x07,0x3e,0x20,0x35,0x2c,0x37,0x28,0xff};
	//8.Loadkey
uchar code menu7[]={0x08,0x3e,0x15,0x32,0x24,0x27,0x2e,0x28,0x3c,0xff};	
	//9.Initival
uchar code menu8[]={0x09,0x3e,0x12,0x31,0x2c,0x37,0x2c,0x39,0x24,0x2f,0xff};
	//10.Increment
uchar code menu9[]={0x0a,0x3e,0x12,0x31,0x26,0x35,0x28,0x30,0x28,0x31,0x37,0xff};
	//11.Decrement
uchar code menu10[]={0x0b,0x3e,0x0d,0x28,0x26,0x35,0x28,0x30,0x28,0x31,0x37,0xff};
	//12.Tranfer
uchar code menu11[]={0x0c,0x3e,0x1d,0x35,0x24,0x31,0x29,0x28,0x35,0xff};
	//13.Restore
uchar code menu12[]={0x0d,0x3e,0x1b,0x28,0x36,0x37,0x32,0x35,0x28,0xff};
	//14.REG Read
uchar code menu13[]={0x0e,0x3e,0x1b,0x0e,0x10,0x1b,0x28,0x24,0x27,0xff};
	//15.Recycle  
uchar code menu14[]={0x0f,0x3e,0x1b,0x28,0x26,0x3c,0x26,0x2f,0x28,0xff};
	
//全局变量定义
uchar code ico[]={0x98,0xff};					//光标图案
uchar code space[]={0x99,0xff};				//空格
uchar code key_str[]={0xa0,0xa1,0x41,0xff};	//密码:
uchar code SNR_str[]={0x9a,0x9b,0x9c,0x41,0xff};//扇区号:
uchar code block_str[]={0x9d,0x9e,0x9f,0x41,0xff};//块地址:
uchar code data_str[]={0xa2,0xa3,0xa4,0xa5,0x41,0xff};//写入的值:
uchar code inc_str[]={0xff};
uchar code dec_str[]={0xff};
uchar code regadr_str[]={0x95,0x96,0x97,0x9e,0x9f,0x41,0xff};//寄存器地址:
uchar code regdata_str[]={0x95,0x96,0x97,0xa4,0xa5,0x41,0xff};//寄存器的值:
uchar code * p_menu[15];
uchar idata Input_Data[16];				//键盘输入数据存放区
uchar idata bytecnt;						//键盘输入字节计数
uchar idata halfbyte;						//当前键盘输入数字高低半字节位
uchar idata  block_adr;					//块地址
uchar idata  cyread;						//循环读卡标志	
uchar idata  esctrue;						//ESC按下标志
uchar idata  cancelinput;					//输入允许标志
   
uchar idata Input_Count;					//键盘输入计数
uchar idata Pre_Num;						//最近输入的数值键
uchar idata grade_status;					//输入级数状态					
#define 	n_Line			4				//一屏所能显示的行数
#define 	Menu_Num  		15				//菜单个数

//菜单结构定义
struct Menu_Status
{
	uchar      	Cur_Menu;				//当前菜单级数	
	uchar		Up_Menu;				//父菜单号
	uchar		Menu_StPos;				//当前屏幕开始菜单位置
	uchar		Menu_Pos;				//当前菜单位置
	uchar		Line;					//菜单起始行
	uchar		Col;						//菜单起始列
	uchar		c_Line;					//菜单指示光标所在显示屏的位置
}Menus;

void Disp_Menu(void);

void delay(void)
{
	uint i;
	for (i=0;i<0xffff;i++)
	{
		_nop_();		
	}	
}
/*********************************************************/
/*名称:Init_menu                                                      				*/
/*功能: 该函数实现菜单初始化过程                                            			*/ 
/*输入:                                                                                            	*/
/*  N/A															*/ 
/*输出:                                                                                            	*/
/*	N/A															*/
/*																*/
/*********************************************************/

void wait_esc()
{
	_nop_();
	if(Keyscan_rdy==1)
	{
		Keyscan_rdy=0;
		Key_Scan();
		if (KeyCounter!=0)
		{	while(!Key_Waitpro)
			Key_Scan();
		}
	}
	if(Key_Waitpro==1)
	{	
		Key_Process();
		esctrue=1;
	}
}
/*********************************************************/
/*名称:Init_menu                                                      				*/
/*功能: 该函数实现菜单初始化过程                                            			*/ 
/*输入:                                                                                            	*/
/*  N/A															*/ 
/*输出:                                                                                            	*/
/*	N/A															*/
/*																*/
/*********************************************************/

void Init_menu(void)
{	
	p_menu[0]=menu0;					//初始化菜单指针
	p_menu[1]=menu1;
	p_menu[2]=menu2;
	p_menu[3]=menu3;
	p_menu[4]=menu4;
	p_menu[5]=menu5;
	p_menu[6]=menu6;
	p_menu[7]=menu7;
	p_menu[8]=menu8;
	p_menu[9]=menu9;
	p_menu[10]=menu10;
	p_menu[11]=menu11;
	p_menu[12]=menu12;
	p_menu[13]=menu13;
	p_menu[14]=menu14;
	Menus.Up_Menu=0;					
	Menus.Cur_Menu=0;				//初始化菜单当前屏数
	cancelinput=0;
	
}

/*********************************************************/
/*名称:	Pro_Num                                                    					*/
/*功能: 该函数实现数字键处理                                            			*/ 
/*输入:                                                                                            	*/
/*  num															*/ 
/*输出:                                                                                            	*/
/*	接收数据模式下,输出Input_Data[]								*/
/*	菜单模式下,无输出												*/
/*********************************************************/

void Pro_Num(uchar num)
{	
	uchar temp;
	
	num=num & 0x0f;
	if ((Menus.Cur_Menu==2) && (cancelinput==0) )					//处在接收数据状态
	{
		temp=num*16;
		Show_EN(Curlin, Curcol, &GB8[temp]);	//显示按下键值
		if (Curcol==15)						//设置下一数字显示位置
		{
			Curcol=0;
			Curlin=Curlin+1;
		}
		else
			Curcol=Curcol+1;
		bytecnt=Input_Count/2;
		halfbyte=Input_Count%2;
		if (halfbyte==0)						//接收数据
		{
			Input_Data[bytecnt]=num;
		}
		else
		{
			Input_Data[bytecnt]=Pre_Num*16+num;
		}
		Pre_Num=num;
		Input_Count=Input_Count+1;
	}
	else if (Menus.Cur_Menu==1)					//处在菜单模式下
	{
		temp=Menus.Menu_Pos-Menus.Menu_StPos;	//擦除老的光标指示
		Show_Str(temp,0, space);
		if(num>0 && num<Menu_Num)				//跳到当前菜单	
		{	
			Menus.Menu_Pos=num-1;
			temp=Menus.Menu_StPos;
			if (Menus.Menu_Pos<Menu_Num-3)
			{
				Menus.Menu_StPos=Menus.Menu_Pos;
				Disp_Menu();
			}
			else
			{
				Menus.Menu_StPos=Menu_Num-4;
				Disp_Menu();
			}
		}
		temp=Menus.Menu_Pos-Menus.Menu_StPos;	//重绘光标指示
		Show_Str(temp,0, ico);
	}
}

/*********************************************************/
/*名称:	Disp_Menu                                                 					*/
/*功能:	在LED显示菜单			                                           			*/ 
/*输入:                                                                                            	*/
/*  N/A															*/ 
/*输出:                                                                                            	*/
/*	N/A															*/
/*	 															*/
/*********************************************************/
void Disp_Menu(void)
{
	uchar i,temp;
	temp=Menus.Menu_StPos;					//菜单开始位置
	InitLCD();
	Curlin=0;
	for (i=temp;i<(temp+n_Line);i++)
	{
		Curcol=3;
		Show_Str(Curlin, Curcol, p_menu[i]);
		Curlin=Curlin+1;
	}	
}
/*********************************************************/
/*名称:	Pro_Ent                                                					*/
/*功能:	Enter键处理		                                           			*/ 
/*输入:                                                                                            	*/
/*  N/A															*/ 
/*输出:                                                                                            	*/
/*	N/A															*/
/*	 															*/
/*********************************************************/
void Pro_Ent(void)
{
	uchar  		 temp;
	//uint     	 index;
	uchar xdata *temp1;
	uchar		i;
//	uchar idata  block_adr;
//	uchar  idata Secnr;
	if (Menus.Cur_Menu==0)				//显示菜单
	{
		Menus.Cur_Menu=1;
		Menus.Menu_Pos=0;
		Menus.Menu_StPos=0;
		Disp_Menu();
		Show_Str(0, 0, ico);
	}	
	else if  (Menus.Cur_Menu==1)			//菜单选择处理
	{
		Menus.Cur_Menu=2;
		switch (Menus.Menu_Pos) 

		{
			case  0:							//request 处理
				//MIF_Halt();
				temp=Request(0x26);
				Disp_Result(CMD_REQUEST,temp);
				cancelinput=1;
				break;
			case 1:							//anticoll 处理
				temp=AntiColl();
				Disp_Result(CMD_ANTICOLL,temp);
				cancelinput=1;
				break;
			case 2:							//select 处理
				temp=Select_Card();
				Disp_Result(CMD_SELECT,temp);
				cancelinput=1;
				break;
			case 3:							//authent 处理
				InitLCD();
				Curcol=0;
				Curlin=1;
				Input_Count=0;
				Show_Str(Curlin, Curcol, SNR_str);
				
				break;
			case 4:							//halt处理		
				temp=MIF_Halt();
				Disp_Result(CMD_HALT,temp);
				cancelinput=1;
				break;
			case  5:							//read处理
				InitLCD();
				Curcol=0;
				Curlin=1;
				Input_Count=0;
				Show_Str(Curlin, Curcol, block_str);
				break;
			case  6:							//write 处理
				InitLCD();
				Curcol=0;
				Curlin=0;
				Input_Count=0;
				grade_status=0;
				Show_Str(Curlin, Curcol, block_str);
				break;
			case  7:							//Load key 处理
				InitLCD();
				Curcol=0;
				Curlin=0;
				Input_Count=0;
				grade_status=0;
				Show_Str(Curlin, Curcol, SNR_str);
				break;
			case  8:
				InitLCD();					//intival 处理
				Curcol=0;
				Curlin=0;
				Input_Count=0;
				grade_status=0;
				Show_Str(Curlin, Curcol, block_str);
				break;
			case   9:
				InitLCD();					//increment处理
				Curcol=0;
				Curlin=0;
				Input_Count=0;
				grade_status=0;
				Show_Str(Curlin, Curcol, block_str);
				break;
			case 10:
				InitLCD();					//decrement处理
				Curcol=0;
				Curlin=0;
				Input_Count=0;
				grade_status=0;
				Show_Str(Curlin, Curcol, block_str);
				break;
			case  11:
				InitLCD();					//tranfer处理
				Curcol=0;
				Curlin=0;
				Input_Count=0;
				grade_status=0;
				Show_Str(Curlin, Curcol, block_str);
				break;
			case  12:
				InitLCD();					//restore处理
				Curcol=0;
				Curlin=0;
				Input_Count=0;
				grade_status=0;
				Show_Str(Curlin, Curcol, block_str);
				break;
			 case  13:
			 	InitLCD();					//REGREAD处理
				Curcol=0;
				Curlin=0;
				Input_Count=0;
				Show_Str(Curlin, Curcol, regadr_str);
				break;

⌨️ 快捷键说明

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