📄 keyboard.c
字号:
#include<stc12c5410ad.h>
#include<buzzer.h>
#include<main.h>
#include<uart.h>
#define KEY_601 0x61
#define KEY_501 0x51
#define KEY_401 0x41
#define KEY_301 0x31
#define KEY_201 0x21
#define KEY_101 0x11
#define KEY_602 0x62
#define KEY_502 0x52
#define KEY_402 0x42
#define KEY_302 0x32
#define KEY_202 0x22
#define KEY_102 0x12
#define KEY_SURE 0x01
#define KEY_CANCLE 0x02
#define KEY_CENTER 0x03
#define KEY_SET 0x04
#define KEY_NULL 0x00
//----------------------------------
//extern variables
//-----------------------------------
extern unsigned char buzzer_timer;
extern unsigned char buzzer_timer_trigger;
extern unsigned char display_buffer[4];
extern unsigned char current_state;
extern unsigned char send_buffer[4];
void free_state_process(unsigned char key_codea) ;
void funcselect_state_process(unsigned char key_codeb);
void fourthfunc_process(unsigned char key_codec);
void callingcenter_process(unsigned char key_coded);
void eighteenthfunc_process(unsigned char key_codee);
/*-----------------------------------
golbal variables
-------------------------------------*/
unsigned char keyboard_busy = 0;
unsigned char last_key = 0;
unsigned char last_key_times = 0;
unsigned char function_index = 0;
unsigned char psw_buffer[6]={0,0,0,0,0,0};
unsigned char psw_index = 0;
//---------------------------------------------
//functions about keyboard
//---------------------------------------------
//---------------------------------------------
//keyboard initial so that we can test keyboard
//---------------------------------------------
void keyboard_initial(void)
{
P3M0 = P3M0 | 0x30; //P34 P35输入PM0=1,PM1=0
P3M1 = P3M1 & 0xcf;
P2M0 = P2M0 | 0x30; //P24 P25输入PM0=1,PM1=0
P2M1 = P2M1 & 0xcf;
}
//----------------------------------------------
//scan key board ,and return the key code
//-----------------------------------------------
unsigned char keyscan(void)
{
unsigned char key_code = 0;
unsigned char seg_temp = 0;
unsigned char bit_temp = 0;
unsigned char return_value =0;
//save current pin values
if(P21 == 1)seg_temp=seg_temp|0x80;
if(P12 == 1)seg_temp=seg_temp|0x40;
if(P15 == 1)seg_temp=seg_temp|0x20;
if(P16 == 1)seg_temp=seg_temp|0x10;
if(P17 == 1)seg_temp=seg_temp|0x08;
if(P20 == 1)seg_temp=seg_temp|0x04;
if(P14 == 1)seg_temp=seg_temp|0x02;
if(P23 == 1)bit_temp = bit_temp | 0x80;
if(P22 == 1)bit_temp = bit_temp | 0x40;
if(P11 == 1)bit_temp = bit_temp | 0x20;
if(P13 == 1)bit_temp = bit_temp | 0x10;
// test if any key pressed
P21 = 1;
P12 = 1;
P15 = 1;
P16 = 1;
P17 = 1;
P20 = 1;
P14 = 1;
P23 = 0;
P22 = 1;
P11 = 1;
P13 = 1;
if(P34 == 1){key_code = 0x61; goto con; }
if(P35 == 1){key_code = KEY_501; goto con; }
if(P24 == 1){key_code = KEY_401; goto con; }
if(P25 == 1){key_code = KEY_301; goto con; }
P23 = 1;
P22 = 1;
P11 = 0;
P13 = 1;
if(P34 == 1)key_code = KEY_602;
if(P35 == 1)key_code = KEY_502;
if(P24 == 1)key_code = KEY_402;
if(P25 == 1){key_code = KEY_302; }
con:
if(key_code != 0)goto con2;
P23 = 1;
P22 = 1;
P11 = 1;
P13 = 0;
if(P34 == 1){key_code = KEY_202; goto con2; }
if(P35 == 1){key_code = KEY_102; goto con2; }
if(P24 == 1){key_code = KEY_CANCLE; goto con2; }
if(P25 == 1){key_code = KEY_SURE; goto con2; }
P23 = 1;
P22 = 0;
P11 = 1;
P13 = 1;
if(P34 == 1)key_code = KEY_201;
if(P35 == 1)key_code = KEY_101;
if(P24 == 1)key_code = KEY_CENTER;
if(P25 == 1)key_code = KEY_SET;
con2:
//restore pins about
if(bit_temp&0x80) P23 = 1;else P23 = 0;
if(bit_temp&0x40) P22 = 1;else P22 = 0;
if(bit_temp&0x20) P11 = 1;else P11 = 0;
if(bit_temp&0x10) P13 = 1;else P13 = 0;
if(seg_temp&0x80) P21 = 1;else P21 = 0;
if(seg_temp&0x40) P12 = 1;else P12 = 0;
if(seg_temp&0x20) P15 = 1;else P15 = 0;
if(seg_temp&0x10) P16 = 1;else P16 = 0;
if(seg_temp&0x08) P17 = 1;else P17 = 0;
if(seg_temp&0x04) P20 = 1;else P20 = 0;
if(seg_temp&0x02) P14 = 1;else P14 = 0;
//judge if any key definitely pressed
//situation 1: keyboard is busy
if(keyboard_busy&&(key_code == 0)){keyboard_busy = 0;last_key = 0;return_value = key_code;}
if(keyboard_busy&&(key_code != 0)){return_value = 0; }
//situation 2:keyboard is not busy
if(!keyboard_busy&&(key_code == 0)){last_key_times = 0;last_key = 0;return_value = KEY_NULL;} //key_code ==0
if(!keyboard_busy&&(key_code != 0)) //key code !=0
{
if(key_code != last_key){
last_key = key_code;last_key_times =1;return_value = KEY_NULL;}
else{
last_key_times++;
if(last_key_times >= 4){
last_key_times = 0;
keyboard_busy = 1;
return_value = key_code;
}
else return_value = KEY_NULL;
}
}
return return_value;
}
//--------------------------------------------------
//process the key code ,come from key scan function
//--------------------------------------------------
void key_process(unsigned char key_codex)
{
if((current_state&0xf8 )== STATE_FREE)free_state_process(key_codex);
else if((current_state&0xf8) == STATE_FUNCSELECT) funcselect_state_process(key_codex);
else if((current_state&0xf8) == STATE_FOURTHFUNC){fourthfunc_process(key_codex);}
else if((current_state&0xf8) == STATE_CALLINGCENTER){callingcenter_process(key_codex);}
else if((current_state&0xf8) == STATE_EIGHTEENTHFUNC){eighteenthfunc_process(key_codex);}
else {open_buzzer(); //BEEP
buzzer_timer = 125;
buzzer_timer_trigger = 1;}
}
//--------------------------------------------------
//process the key code ,come from key process function
//--------------------------------------------------
void free_state_process(unsigned char key_codea)
{
if(current_state&0x07 == STATE_FREE_CALLING)
{
if(key_codea == KEY_CANCLE){ current_state = STATE_FREE|STATE_FREE_NOCALL;
open_buzzer(); //BEEP
buzzer_timer = 225;
buzzer_timer_trigger = 1;
display_buffer[0]=10; //CLEAR SCREEN
display_buffer[1]=10;
display_buffer[2]=10;
display_buffer[3]=10;
send_buffer[0] = COMMAND_HEADER;
send_buffer[1] = CALLGUEST_CANCLE;
rs232_send_command();
return;
}
else return;
}else ;
switch(key_codea)
{
case KEY_601:
current_state = STATE_FREE|STATE_FREE_CALLING;
open_buzzer();
buzzer_timer = 225;
buzzer_timer_trigger = 1;
display_buffer[0]=0;
display_buffer[1]=6;
display_buffer[2]=0;
display_buffer[3]=1;
send_buffer[0] = COMMAND_HEADER;
send_buffer[1] = CALLGUEST_BEGIN;
send_buffer[2] = display_buffer[1];
send_buffer[3] = display_buffer[3];
rs232_send_command();
break;
case KEY_602:
current_state = STATE_FREE|STATE_FREE_CALLING;
open_buzzer();
buzzer_timer = 225;
buzzer_timer_trigger = 1;
display_buffer[0]=0;
display_buffer[1]=6;
display_buffer[2]=0;
display_buffer[3]=2;
send_buffer[0] = COMMAND_HEADER;
send_buffer[1] = CALLGUEST_BEGIN;
send_buffer[2] = display_buffer[1];
send_buffer[3] = display_buffer[3];
rs232_send_command();
break;
case KEY_501:
current_state = STATE_FREE|STATE_FREE_CALLING;
open_buzzer();
buzzer_timer = 225;
buzzer_timer_trigger = 1;
display_buffer[0]=0;
display_buffer[1]=5;
display_buffer[2]=0;
display_buffer[3]=1;
send_buffer[0] = COMMAND_HEADER;
send_buffer[1] = CALLGUEST_BEGIN;
send_buffer[2] = display_buffer[1];
send_buffer[3] = display_buffer[3];
rs232_send_command();
break;
case KEY_502:
current_state = STATE_FREE|STATE_FREE_CALLING;
open_buzzer();
buzzer_timer = 225;
buzzer_timer_trigger = 1;
display_buffer[0]=0;
display_buffer[1]=5;
display_buffer[2]=0;
display_buffer[3]=2;
send_buffer[0] = COMMAND_HEADER;
send_buffer[1] = CALLGUEST_BEGIN;
send_buffer[2] = display_buffer[1];
send_buffer[3] = display_buffer[3];
rs232_send_command();
break;
case KEY_401:
current_state = STATE_FREE|STATE_FREE_CALLING;
open_buzzer();
buzzer_timer = 225;
buzzer_timer_trigger = 1;
display_buffer[0]=0;
display_buffer[1]=4;
display_buffer[2]=0;
display_buffer[3]=1;
send_buffer[0] = COMMAND_HEADER;
send_buffer[1] = CALLGUEST_BEGIN;
send_buffer[2] = display_buffer[1];
send_buffer[3] = display_buffer[3];
rs232_send_command();
break;
case KEY_402:
current_state = STATE_FREE|STATE_FREE_CALLING;
open_buzzer();
buzzer_timer = 225;
buzzer_timer_trigger = 1;
display_buffer[0]=0;
display_buffer[1]=4;
display_buffer[2]=0;
display_buffer[3]=2;
send_buffer[0] = COMMAND_HEADER;
send_buffer[1] = CALLGUEST_BEGIN;
send_buffer[2] = display_buffer[1];
send_buffer[3] = display_buffer[3];
rs232_send_command();
break;
case KEY_301:
current_state = STATE_FREE|STATE_FREE_CALLING;
open_buzzer();
buzzer_timer = 225;
buzzer_timer_trigger = 1;
display_buffer[0]=0;
display_buffer[1]=3;
display_buffer[2]=0;
display_buffer[3]=1;
send_buffer[0] = COMMAND_HEADER;
send_buffer[1] = CALLGUEST_BEGIN;
send_buffer[2] = display_buffer[1];
send_buffer[3] = display_buffer[3];
rs232_send_command();
break;
case KEY_302:
current_state = STATE_FREE|STATE_FREE_CALLING;
open_buzzer();
buzzer_timer = 225;
buzzer_timer_trigger = 1;
display_buffer[0]=0;
display_buffer[1]=3;
display_buffer[2]=0;
display_buffer[3]=2;
send_buffer[0] = COMMAND_HEADER;
send_buffer[1] = CALLGUEST_BEGIN;
send_buffer[2] = display_buffer[1];
send_buffer[3] = display_buffer[3];
rs232_send_command();
break;
case KEY_201:
current_state = STATE_FREE|STATE_FREE_CALLING;
open_buzzer();
buzzer_timer = 225;
buzzer_timer_trigger = 1;
display_buffer[0]=0;
display_buffer[1]=2;
display_buffer[2]=0;
display_buffer[3]=1;
send_buffer[0] = COMMAND_HEADER;
send_buffer[1] = CALLGUEST_BEGIN;
send_buffer[2] = display_buffer[1];
send_buffer[3] = display_buffer[3];
rs232_send_command();
break;
case KEY_202:
current_state = STATE_FREE|STATE_FREE_CALLING;
open_buzzer();
buzzer_timer = 225;
buzzer_timer_trigger = 1;
display_buffer[0]=0;
display_buffer[1]=2;
display_buffer[2]=0;
display_buffer[3]=2;
send_buffer[0] = COMMAND_HEADER;
send_buffer[1] = CALLGUEST_BEGIN;
send_buffer[2] = display_buffer[1];
send_buffer[3] = display_buffer[3];
rs232_send_command();
break;
case KEY_101:
current_state = STATE_FREE|STATE_FREE_CALLING;
open_buzzer();
buzzer_timer = 225;
buzzer_timer_trigger = 1;
display_buffer[0]=0;
display_buffer[1]=1;
display_buffer[2]=0;
display_buffer[3]=1;
send_buffer[0] = COMMAND_HEADER;
send_buffer[1] = CALLGUEST_BEGIN;
send_buffer[2] = display_buffer[1];
send_buffer[3] = display_buffer[3];
rs232_send_command();
break;
case KEY_102:
current_state = STATE_FREE|STATE_FREE_CALLING;
open_buzzer();
buzzer_timer = 225;
buzzer_timer_trigger = 1;
display_buffer[0]=0;
display_buffer[1]=1;
display_buffer[2]=0;
display_buffer[3]=2;
send_buffer[0] = COMMAND_HEADER;
send_buffer[1] = CALLGUEST_BEGIN;
send_buffer[2] = display_buffer[1];
send_buffer[3] = display_buffer[3];
rs232_send_command();
break;
case KEY_SET:
current_state = STATE_FUNCSELECT;
open_buzzer();
buzzer_timer = 225;
buzzer_timer_trigger = 1;
display_buffer[0]=SYMBLE_F;
display_buffer[1]=1;
display_buffer[2]=SYMBLE_SUBM;
display_buffer[3]=SYMBLE_SUBM;
function_index = 1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -