📄 key.c
字号:
///////////////////////////////////////////////////////////
//file name:key.c
//author:Liweihua
//date:2004.11.26
///////////////////////////////////////////////////////////
#include <stdio.h> /* prototype declarations for I/O functions */
#include "stdlib.h"
#include "string.h"
#include "upsd3200.h"
#include "upsd_hardware.h"
#include "datatypes.h"
#include "config.h"
#include "timers.h"
#include "key.h"
#include "lcd.h"
#include "comm.h"
#include "flash.h"
KEYCB xdata keycb;
extern PPCB xdata ppcb;
extern FLASHCB xdata flashcb;
extern LCDCB xdata lcdcb;
extern PSD_REGS PSD8xx_reg;
sbit keyint=P3^3;
unsigned char code keytn[] = {0x05,0x09,0x06,0x0A};
void key_init(void)
{
keycb.keyon_flag=KEY_NONE_ON;
keycb.menu_level=0;
keycb.mainfunc_no=0;
keycb.input_num=0;
keycb.count=0;
keycb.input_window_no=0;
keycb.event_notice=KEY_EVENT_NONE;
keycb.exit_curr_level=0;
keycb.enter_next_level=0;
keycb.msg_ack_flag=0;
keyport_init();
KEYPORTOUT = 0x73;
TCON |= 0x04;//边沿触发
return;
}
unsigned char readkey(void)
{
unsigned char i,nKey,testValue;
testValue = 0x77;
nKey = 0;
for(i=0;i<2;i++)
{
KEYPORTOUT = testValue;
if((PSD8xx_reg.IMC_A & 0x03)!=0x03)
{
if((PSD8xx_reg.IMC_A & 0x03) == 0x02)
nKey = 0;
else if((PSD8xx_reg.IMC_A & 0x03) == 0x01)
nKey = 1;
else
return 0;
nKey = keytn[i*2+nKey];
break;
}
else
testValue=0x7B;
}
KEYPORTOUT = 0x73;
TCON &= 0xF7;
return nKey;
}
void key_int_process(void) interrupt 2
{
unsigned char n,m;
unsigned char i,j;
EX1 = 0;
if(lcdcb.delay_disp_on==1)//while display delaying,do not response to any key
goto KEYEND;
if( readkey()!= 0)
{
//delay to confirm key on,get rid of dithering
for(i=0;i<25;i++)
for(j=0;j<255;j++)
;
if(readkey()!= 0)
n = readkey();
else
n = 0;
}
else
n = 0;
if(n==0)
goto KEYEND;
//compare key value with key_value[],and set the corresponding bit of keycb.keyon_flag
for(i=0;i<4;i++)
{
if(keytn[i]==n)
{
keycb.keyon_flag|=0x01<<i;
break;
}
}
if(ppcb.msg_ack_flag&AUDIO_CALL_IN)
{
if((keycb.keyon_flag&KEY_CONFIRM_ON)&&(keycb.msg_ack_flag&AUDIO_CALL_IN))
{
keycb.keyon_flag&=~KEY_CONFIRM_ON;
keycb.msg_ack_flag&=~AUDIO_CALL_IN;
ppcb.msg_ack_flag|=AGREE;
lcdcb.event_notice=SCR_EVENT_TALKING;
goto KEYEND;
}
else if(keycb.keyon_flag&KEY_CANCEL_ON)
{
keycb.keyon_flag&=~KEY_CANCEL_ON;
keycb.msg_ack_flag&=~AUDIO_CALL_IN;
ppcb.msg_ack_flag|=DISAGREE;
lcdcb.event_notice=SCR_EVENT_MYSELF_HANGUP;
goto KEYEND;
}
else
{
keycb.keyon_flag&=KEY_NONE_ON;
goto KEYEND;
}
}
switch(keycb.menu_level)
{
//main menu
case 0:
if(keycb.keyon_flag&KEY_CONFIRM_ON)
{
keycb.keyon_flag&=~KEY_CONFIRM_ON;
keycb.enter_next_level=1;
lcdcb.init_info_on=0;
lcdcb.event_notice=SCR_EVENT_MAIN_MENU;
goto KEYEND;
}
else if(keycb.keyon_flag&KEY_CANCEL_ON)
{
keycb.keyon_flag&=~KEY_CANCEL_ON;
if((lcdcb.state_msg_on==1)&&(lcdcb.init_info_on==1))
{
lcdcb.state_msg_on=0;
lcdcb.event_notice=SCR_EVENT_CLEAR_STATE_MSG;
goto KEYEND;
}
}
else
{
keycb.keyon_flag=KEY_NONE_ON;
goto KEYEND;
}
break;//case 0
case 1:
if(keycb.keyon_flag&KEY_DOWN_ON)
{
keycb.keyon_flag&=~KEY_DOWN_ON;
if(lcdcb.event_notice==SCR_EVENT_DISPLAY_FINISHED)
{
keycb.mainfunc_no++;
if(keycb.mainfunc_no==MAINFUNC_NUM_MAX)
keycb.mainfunc_no=0;
lcdcb.event_notice=SCR_EVENT_MAINFUNC_NO_DOWN;
}
goto KEYEND;
}
else if(keycb.keyon_flag&KEY_UP_ON)
{
keycb.keyon_flag&=~KEY_UP_ON;
if(lcdcb.event_notice==SCR_EVENT_DISPLAY_FINISHED)
{
if(keycb.mainfunc_no==0)
keycb.mainfunc_no=MAINFUNC_NUM_MAX-1;
else
keycb.mainfunc_no--;
lcdcb.event_notice=SCR_EVENT_MAINFUNC_NO_UP;
}
goto KEYEND;
}
else if(keycb.keyon_flag&KEY_CONFIRM_ON)
{
keycb.keyon_flag&=~KEY_CONFIRM_ON;
switch(keycb.mainfunc_no)
{
//sailor login
case 0:
if(lcdcb.shipping_logined==1)
{
keycb.enter_next_level=1;
keycb.input_window_no=1;
lcdcb.event_notice=SCR_EVENT_SUBMENU_SAILOR_LOGIN;
}
else
lcdcb.event_notice=SCR_EVENT_LOGIN_WAIT;
break;
//recode browser
case 1:
keycb.enter_next_level=1;
flashcb.event_notice=FLASH_EV_GET_ALL_RECODE_ENTRY;
break;
//call out
case 2:
//if((!(ppcb.msg_ack_flag&AUDIO_CALL_OUT))&&(!(keycb.msg_ack_flag&AUDIO_CALL_OUT))
//&&(!ppcb.msg_ack_flag&AUDIO_CALL_IN)&&(!keycb.msg_ack_flag&AUDIO_CALL_IN))
{
keycb.event_notice=KEY_EVENT_CALL_OUT;
lcdcb.event_notice=SCR_EVENT_DIALING_OUT;
}
break;
//set ip
case 3:
keycb.enter_next_level=1;
keycb.input_window_no=2;
lcdcb.event_notice=SCR_EVENT_SUBMENU_SET_IP;
break;
//set port
case 4:
keycb.enter_next_level=1;
keycb.input_window_no=2;
lcdcb.event_notice=SCR_EVENT_SUBMENU_SET_PORT;
break;
//sailor logout
case 5:
if(lcdcb.sailor_logined==1)
{
keycb.event_notice=KEY_EVENT_SAILOR_LOGOUT;
keycb.exit_curr_level=1;
keycb.mainfunc_no=0;
lcdcb.wait_disp_on=1;
lcdcb.event_notice=SCR_EVENT_SAILOR_LOGOUTING;
}
else
lcdcb.event_notice=SCR_EVENT_LOGOUT_WAIT;
break;
default:
break;
}
break;
}
else if(keycb.keyon_flag&KEY_CANCEL_ON)
{
keycb.keyon_flag&=~KEY_CANCEL_ON;
if((keycb.msg_ack_flag&AUDIO_CALL_OUT)&&(keycb.mainfunc_no==2))
{
keycb.msg_ack_flag&=~AUDIO_CALL_OUT;
ppcb.msg_ack_flag|=DISAGREE;
lcdcb.delay_disp_on=1;
lcdcb.event_notice=SCR_EVENT_MYSELF_HANGUP;
}
else
{
keycb.exit_curr_level=1;
keycb.mainfunc_no=0;
lcdcb.event_notice=SCR_EVENT_INIT_INFO;
}
goto KEYEND;
}
break;//case 1
//selecting a function in main will enter corresponding menu
//There are 6 menus under main menu:sailor regin/recode browser/call out/set ip/set port/regout
case 2:
switch(keycb.mainfunc_no)
{
//sailor login
case 0:
if(keycb.keyon_flag&KEY_DOWN_ON)
{
keycb.keyon_flag&=~KEY_DOWN_ON;
if(lcdcb.event_notice==SCR_EVENT_DISPLAY_FINISHED)
{
keycb.count++;
if(keycb.count==16)
keycb.count=0;
lcdcb.event_notice=SCR_EVENT_COUNT_DOWN;
}
goto KEYEND;
}
else if(keycb.keyon_flag&KEY_UP_ON)
{
keycb.keyon_flag&=~KEY_UP_ON;
if(lcdcb.event_notice==SCR_EVENT_DISPLAY_FINISHED)
{
if(keycb.count==0)
keycb.count=15;
else
keycb.count--;
lcdcb.event_notice=SCR_EVENT_COUNT_UP;
}
goto KEYEND;
}
else if(keycb.keyon_flag & KEY_CANCEL_ON)
{
keycb.keyon_flag&=~KEY_CANCEL_ON;
if(keycb.input_num>0)
{
keycb.input_num--;
keycb.sailor_id[keycb.input_num]=' ';
lcdcb.event_notice=SCR_EVENT_DISP_SAILOR_ID;
}
else
{
keycb.exit_curr_level=1;
keycb.count=0;
lcdcb.event_notice=SCR_EVENT_MAIN_MENU;
}
goto KEYEND;
}
else if(keycb.keyon_flag & KEY_CONFIRM_ON)
{
keycb.keyon_flag &= ~KEY_CONFIRM_ON;
if(keycb.input_num<SAILOR_ID_LEN)
{
keycb.sailor_id[keycb.input_num++]=keycb.count<=9?keycb.count+0x30:keycb.count+0x37;
lcdcb.event_notice=SCR_EVENT_DISP_SAILOR_ID;
}
else
{
keycb.count=0;
keycb.input_num = 0;
keycb.exit_curr_level=1;
keycb.event_notice = KEY_EVENT_SAILOR_LOGIN;
lcdcb.wait_disp_on=1;
lcdcb.event_notice = SCR_EVENT_SAILOR_LOGING;
}
goto KEYEND;
}
break;
//history message browser
case 1:
if(lcdcb.no_history_msg==1)
{
if(keycb.keyon_flag&(KEY_CANCEL_ON|KEY_CONFIRM_ON))
{
lcdcb.no_history_msg=0;
keycb.keyon_flag&=~KEY_CANCEL_ON;
keycb.keyon_flag&=~KEY_CONFIRM_ON;
keycb.exit_curr_level=1;
lcdcb.event_notice=SCR_EVENT_MAIN_MENU;
goto KEYEND;
}
else
{
keycb.keyon_flag=KEY_NONE_ON;
goto KEYEND;
}
}
else if(keycb.keyon_flag&KEY_UP_ON)
{
keycb.keyon_flag&=~KEY_UP_ON;
if(lcdcb.event_notice==SCR_EVENT_DISPLAY_FINISHED)
{
if(lcdcb.msg_num==0)
{
lcdcb.msg_num=flashcb.msg_sum-1;
lcdcb.event_notice=SCR_EVENT_LAST_PAGE;
}
else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -