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

📄 key.c

📁 51单片机驱动320*234彩显的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
///////////////////////////////////////////////////////////
//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 + -