📄 menu.c
字号:
//**********************************************************************//
// 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 + -