📄 key_prc.c
字号:
/***********************************************************/
/* */
/* CPU:AT89c55 20MHZ */
/* Copyright 2004.09 Comelit */
/* Author:LV_XIAO_LU */
/* */
/***********************************************************/
/* Version 1.0 */
/***********************************************************/
/* LEFT KEY LOCATE P1.7,RIGHT KEY LOCATE P1.6 */
/* FUNCTION : */
/* LEFT KEY :MOVE sign of menu */
/* RIGHT KEY: design */
/***********************************************************/
#include <reg52.h>
#include "string.h"
#include "typedef.h"
#include "define.h"
#include "variable.h"
#include "function.h"
sbit DIVA_STATUS_PORT = P3^2;
sbit MES_SW = P1^7;
sbit CALL_SW = P1^6 ;
sbit DISP_CTR_PORT = P3^5;
void Key_dummy(void);
void Key_left(void);
void Key_right(void);
void Prev_page_affirm(unsigned char mes_num);
void Key_hd(void);
void Key_scan(void);
bit Key_judge(void);
void Con_key(void);
void Key_prc( void );
unsigned char Judge_mes_num(void);
unsigned char R_judge_mes_num(void);
void In_third_menu(void);
void Return_second_menu(unsigned char mes_num);
void Get_mes_content(unsigned char scr_disp_num,unsigned char select);
void Del_mes_prc(void);
void Get_num_code(unsigned char num);
void Get_list_str(unsigned char num);
/***********************************************************/
/***********************************************************/
code unsigned int num_to_code[]=
{
0xa3b0,0xa3b1,0xa3b2,0xa3b3,0xa3b4,
0xa3b5,0xa3b6,0xa3b7,0xa3b8,0xa3b9
};
/***********************************************************/
/***********************************************************/
void (*const code key_tbl[])(void)=
{
Key_dummy,
Key_left,
Key_right
};
/***********************************************************/
/***********************************************************/
void Key_dummy(void)
{
return;
}
/***********************************************************/
/***********************************************************/
void Key_hd(void)
{
Key_scan();
if(key_tmr != 0)
key_tmr--;
else
{
key_tmr = KEY_TM;
if(Key_judge() == KEYOK)
Con_key();
}
return;
}
/***********************************************************/
/***********************************************************/
void Key_scan(void)
{
unsigned char i;
P3 = P3|0x18; //p3.3=p3.4=1
// P3=P3|0x0c; //test
key_data[0]=(~P3)&0x18; // get P3.3,P3.4
// key_data[0]=(~P3)&0x0c; //test
for(i=2;i>0;i--)
{
key_data[i]= key_data[i-1];
}
return;
}
/***********************************************************/
/***********************************************************/
bit Key_judge(void)
{
if((key_data[0] == key_data[1])&&(key_data[1] == key_data[2]))
return(1);
else
return(0);
}
/***********************************************************/
/*P3^4: 左键 P3^3:右键 */
/***********************************************************/
void Con_key(void)
{
switch(key_data[1])
{
case 0x10:
// case 0x04: //test
keyvld = LEFTKEY;
break;
case 0x08:
keyvld = RIGHTKEY;
break;
default :
keyvld = NOKEY;
break;
}
if(keyvld == NOKEY)
{
keyvld_old = keyvld ;
key_flag_F = 0;
}
else if(keyvld != keyvld_old)
{
keyvld_old = keyvld;
key_flag_F = 1;
}
return;
}
/***********************************************************/
/***********************************************************/
void Key_prc( void )
{
if((write_F == 1)||(call_disp_F == 1)) //正在写FLASH时,禁止操作
{
if(key_flag_F == 1)
key_flag_F = 0;
return;
}
else
{
if(key_flag_F == 1)
{
key_flag_F = 0;
exit_time = TM30S ;
key_tbl[keyvld]();
disp_change_F = 1 ;
}
// else
// {
// disp_change_F = 0;
// }
if((exit_time != 0)&&(call_disp_F == 0))
exit_time--;
else if((disp_mode != DUMMY_DISP)&&(exit_time == 0)) // 关机
{
disp_mode = DUMMY_DISP;
}
return;
}
}
/***********************************************************/
/* 左键为信息选择 */
/***********************************************************/
void Key_left(void)
{
switch(disp_mode)
{
case DUMMY_DISP : //如果原显示模式是待机
// if(call_disp_F == 0)
// {
disp_mode = FIRST_MENU_DISP ;
select_position = MES_READ_POSITION ;
CALL_SW = SW_ON;
sw_delay = TM60MS; //这是为了等待继电器动作完成
read_mes_F = 1;
// }
break;
case FIRST_MENU_DISP:
select_position++; //指向下一功能
if(select_position > CLOSE_POSITION )
select_position = MES_READ_POSITION ; //循环
break;
case SECOND_MENU_DISP:
select_position++;
if(scr_mes_num == 5)
{
if(list_num > 5 )
{
if(select_position > 7)
select_position = 0 ;
}
else if(select_position >6)
select_position = 0;
}
else if(mes_list == disp_tcb_list)
select_position = 0;
else if((list_num < 5)&&(select_position >scr_mes_num))
select_position = 0;
else if(select_position > (scr_mes_num+1))
select_position = 0;
break;
case THIRD_MENU_DISP:
select_position++;
if(disp_no_u == 0)
{
if(select_position > 1)
select_position = 0;
}
else
{
if(select_position >2)
select_position = 0 ;
}
break;
default:
break;
}
}
/***********************************************************/
/***********************************************************/
void Key_right(void)
{
if(disp_mode == DUMMY_DISP)
{
if(call_disp_F == 0)
{
disp_mode = FIRST_MENU_DISP ;
select_position = MES_READ_POSITION;
CALL_SW = SW_ON;
sw_delay = TM60MS;
read_mes_F = 1;
}
}
else if(disp_mode == FIRST_MENU_DISP)
{
switch(select_position)
{
case MES_READ_POSITION:
disp_mode = SECOND_MENU_DISP ;
select_position = 0 ; //指向第一条信息位置
EA = 0 ;
mes_list = disp_tcb_list ;
last_mes_list = disp_tcb_list;
EA = 1;
mes_list_old = mes_list ;
list_num = 0; //信息总条数清0
scr_mes_num = Judge_mes_num(); //这一屏提示多少条信息
mes_list_F = 1;
disp_no_u = 0 ;
break;
case CLOSE_POSITION:
disp_mode = DUMMY_DISP ;
break ;
default:
break;
}
}
else if(disp_mode == SECOND_MENU_DISP)
{
switch(scr_mes_num)
{
case 0x00: //无信息提示时处理,有二种情况,一是内存无信息,一是阅信息到最后无信息
// if(disp_tcb_list == (struct MES_CON_BLOCK code *)END)
// if(disp_tcb_list == &MES_NULL)
if((mes_list == &MES_NULL)&&(last_mes_list == &MES_NULL))
{
disp_mode = FIRST_MENU_DISP;
disp_no_u = 0 ;
}
else
{
switch(select_position)
{
case 0x00: //上页按键确认
// select_position = 0; //重新指向第一条提示信息
Prev_page_affirm(0);
disp_no_u = 0;
break;
case 0x01: //返回按键确认
disp_mode = FIRST_MENU_DISP;
disp_no_u = 0 ;
break;
default:
break;
}
select_position = 0;
}
break;
case 0x01: /* 一条信息时处理*/
switch(select_position)
{
case 0x00:
In_third_menu();
Get_mes_content(1,0);
// disp_no_u = 0;
break;
case 0x01:
if(list_num >= 5) //上页按键确认
{
Prev_page_affirm(1);
}
else //"返回"按键确认
disp_mode = FIRST_MENU_DISP;
break;
case 0x02: //"返回"按键确认
if(list_num >=5)
disp_mode = FIRST_MENU_DISP;
// disp_no_u = 0 ;
break;
default:
break;
}
select_position = 0;
break;
case 0x02: /* 二条信息时处理*/
switch(select_position)
{
case 0x00:
In_third_menu();
Get_mes_content(2,0);
break;
case 0x01:
In_third_menu();
Get_mes_content(2,1);
break;
case 0x02:
if(list_num>=5) //上页按键确认
{
Prev_page_affirm(2);
}
else //"返回"按键确认
disp_mode = FIRST_MENU_DISP;
break;
case 0x03: //"返回"按键确认
disp_mode = FIRST_MENU_DISP ;
// select_position = 0;
break;
default:
break;
}
select_position = 0;
break;
case 3: /* 三条信息时处理*/
switch(select_position)
{
case 0x00:
In_third_menu();
Get_mes_content(3,0);
break;
case 0x01:
In_third_menu();
Get_mes_content(3,1);
break;
case 0x02:
In_third_menu();
Get_mes_content(3,2);
break;
case 0x03:
if(list_num>=5) //上页按键确认
{
Prev_page_affirm(3); //传递1是由于该屏不足五条,mes_list
//指向空
}
else //"返回"按键确认
disp_mode = FIRST_MENU_DISP;
break;
case 0x04: //"返回"按键确认
select_position = 0;
disp_mode = FIRST_MENU_DISP;
// disp_no_u = 0 ;
break;
default:
break;
}
select_position = 0;
break;
case 4: /* 四条信息时处理*/
switch(select_position)
{
case 0x00:
In_third_menu();
Get_mes_content(4,0);
break;
case 0x01:
In_third_menu();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -