📄 keyboard.c
字号:
#include"keyboard.h"
#include"..\config\function_declaration.h"
#include"..\lxi\socket.h"
void ch451_init(void)
{
uchar i;
uint command = 0x0402; //0x0402命令:键盘扫描使能
EA = 0;
LOAD = 0; //命令开始
for(i=0;i<12;i++) //送入12位数据,低位在前
{
DIN = command & 1;
DCLK = 0;
command >>= 1;
DCLK = 1; //上升沿有效
}
LOAD = 1; //加载数据
EA = 1;
}
uchar read_key_value(void)
{
uchar i;
uchar command,keycode; //定义命令字,和数据存储器
EA = 0; //关中断
command = 0x07; //输入读CH451命令字
LOAD = 0;
for(i=0;i<4;i++)
{
DIN = command & 1; //送入最低位
DCLK = 0;
command >>= 1; //右移一位
DCLK = 1; //产生时钟上升沿锁通知CH451输入位数据
}
LOAD = 1; //产生加载上升沿通知CH451处理命令数据
keycode = 0; //清除keycode
for(i=0;i<7;i++)
{
keycode <<= 1; //数据移入keycode,高位在前,低位在后
keycode |= DOUT; //从高到低读入CH451的数据
DCLK = 0; //产生时钟下升沿通知CH451输出下一位
DCLK = 1;
}
EA = 1;
return keycode; //返回键值
}
void keyboard(void) interrupt 18
{
uchar i,key_value;
char j;
uint power_10;
EIE2 = 0x00; //IE6(for keyboard)中断禁止
key_value = read_key_value();
if(Oper==1)
{
if(key_value==OPER_KEY)
Oper = 0;
P3IF = 0x00;
EIE2 = 0x10; //IE6(for keyboard)中断允许
return;
}
switch(key_value)
{
case MENU_KEY:
{
Interface = MENU_SCREEN;
Line = 1;
Input = 0;
lcd_clear();
interface_menu();
}
break;
case OPER_KEY:
{
Oper = 1;
}
break;
case ESC_KEY:
{
if(Interface==MAIN_SCREEN)
{
for(i=0;i<5;i++)
{
value_u_tmp[i] = value_u[i];
value_i_tmp[i] = value_i[i];
value_fi_tmp[i] = value_fi[i];
}
for(i=0;i<2;i++)
{
value_f_tmp[i] = value_f[i];
}
Line = 0;
interface_main();
}
if(Interface==RS232C_SCREEN)
{
if(Line==1)
{
for(i=0;i<6;i++)
{
value_baudrate_tmp[i] = value_baudrate[i];
}
}
if(Line==2)
{
value_datadigit_tmp[0] = value_datadigit[0];
}
if(Line==3)
{
value_stopdigit_tmp[0] = value_stopdigit[0];
}
Line = 0;
interface_rs232c();
}
if(Interface==LXI_SCREEN)
{
if(Line==1)
{
for(i=0;i<15;i++)
{
value_ip_tmp[i] = value_ip[i];
}
}
if(Line==2)
{
for(i=0;i<15;i++)
{
value_mask_tmp[i] = value_mask[i];
}
}
if(Line==3)
{
for(i=0;i<15;i++)
{
value_gateway_tmp[i] = value_gateway[i];
}
}
if(Line==4)
{
for(i=0;i<15;i++)
{
value_dns_tmp[i] = value_dns[i];
}
}
Line = 0;
interface_lxi();
}
Input = 0;
}
break;
case BACKSPACE_KEY:
{ if(value_count==0)
break;
if(Input==1)
{
Cursor--;
display_digit(Cursor,Yy_value,'_');
if(Interface==MAIN_SCREEN)
{
if(Line==1)
{
if(point_exist==0)
{
value_u_tmp[value_count] = '0';
value_count--;
value_u_tmp[value_count] = '.';
}
else
{
value_count--;
value_u_tmp[value_count] = '0';
}
}
if(Line==2)
{
if(point_exist==0)
{
value_i_tmp[value_count] = '0';
value_count--;
value_i_tmp[value_count] = '.';
}
else
{
value_count--;
value_i_tmp[value_count] = '0';
}
}
if(Line==3)
{
value_count--;
value_f_tmp[value_count] = '0';
}
if(Line==4)
{
if(point_exist==0)
{
value_fi_tmp[value_count] = '0';
value_count--;
value_fi_tmp[value_count] = '.';
}
else
{
value_count--;
value_fi_tmp[value_count] = '0';
}
}
}
if(Interface==RS232C_SCREEN)
{
if(Line==1)
{
value_count--;
value_baudrate_tmp[value_count] = 0x00;
}
if(Line==2)
{
value_count--;
value_datadigit_tmp[value_count] = 0x00;
}
if(Line==3)
{
value_count--;
value_stopdigit_tmp[value_count] = 0x00;
}
}
if(Interface==LXI_SCREEN)
{
if(Line==1)
{
value_count--;
value_ip_tmp[value_count] = '0';
}
if(Line==2)
{
value_count--;
value_mask_tmp[value_count] = '0';
}
if(Line==3)
{
value_count--;
value_gateway_tmp[value_count] = '0';
}
if(Line==4)
{
value_count--;
value_dns_tmp[value_count] = '0';
}
}
}
}
break;
case ADDSUB_KEY:
{
}
break;
case ENTER_KEY:
{
if(Interface==MAIN_SCREEN)
{
for(i=0;i<5;i++)
{
value_u[i] = value_u_tmp[i];
value_i[i] = value_i_tmp[i];
value_fi[i] = value_fi_tmp[i];
}
for(i=0;i<2;i++)
{
value_f[i] = value_f_tmp[i];
}
Line = 0;
interface_main();
//**************************计算电压和电流值**********************
i = 0;
voltage = 0;
power_10 = 10;
while(value_u[i]!='.')
{
voltage = voltage*10 + (value_u[i] - 0x30);
i++;
}
i = i + 1;
while(i < 5)
{
voltage = voltage + ((float)value_u[i] - 0x30)/power_10;
power_10 = power_10*10;
i++;
}
i = 0;
current = 0;
power_10 = 10;
while(value_i[i]!='.')
{
current = current*10 + (value_i[i] - 0x30);
i++;
}
i++;
while(i < 5)
{
current = current + ((float)value_i[i] - 0x30)/power_10;
i++;
}
power = voltage*current;
i = 0;
j = 0;
while(power >= 10)
{
power = power/10;
j++;
}
while(j >= 0)
{
value_p[i] = power;
power = power - value_p[i];
value_p[i] = value_p[i] + 0x30;
power = power*10;
i++;
j--;
}
value_p[i] = '.';
i++;
while(i < 5)
{
value_p[i] = power;
power = power - value_p[i];
value_p[i] = value_p[i] + 0x30;
power = power*10;
i++;
}
Line = 0;
interface_main();
}
if(Interface==RS232C_SCREEN)
{
if(Line==1)
{
for(i=0;i<6;i++)
{
value_baudrate[i] = value_baudrate_tmp[i];
}
}
if(Line==2)
{
value_datadigit[0] = value_datadigit_tmp[0];
}
if(Line==3)
{
value_stopdigit[0] = value_stopdigit_tmp[0];
}
Line = 0;
interface_rs232c();
//**************************改变串口波特率**********************
if(value_baudrate[0]=='1')
{
if(value_baudrate[1]=='1') //115200
timer1_init(0xFA);
if(value_baudrate[1]=='9') //19200
timer1_init(0xDC);
}
if(value_baudrate[0]=='5') //57600
timer1_init(0xF4);
if(value_baudrate[0]=='3') //38400
timer1_init(0xEE);
if(value_baudrate[0]=='9') //9600
timer1_init(0xB8);
if(value_baudrate[0]=='4') //4800
timer1_init(0x70);
}
if(Interface==LXI_SCREEN)
{
if(Line==1)
{
for(i=0;i<15;i++)
{
value_ip[i] = value_ip_tmp[i];
}
i = 0;
w3100_ip[0] = 0;
while(value_ip[i]!='.')
{
w3100_ip[0] = w3100_ip[0]*10 + (value_ip[i] - 0x30);
i++;
}
i++;
w3100_ip[1] = 0;
while(value_ip[i]!='.')
{
w3100_ip[1] = w3100_ip[1]*10 + (value_ip[i] - 0x30);
i++;
}
i++;
w3100_ip[2] = 0;
while(value_ip[i]!='.')
{
w3100_ip[2] = w3100_ip[2]*10 + (value_ip[i] - 0x30);
i++;
}
i++;
w3100_ip[3] = 0;
while(value_ip[i]!=0x00)
{
w3100_ip[3] = w3100_ip[3]*10 + (value_ip[i] - 0x30);
i++;
}
setIP(w3100_ip);
sysinit(0x03,0x03);
}
if(Line==2)
{
for(i=0;i<15;i++)
{
value_mask[i] = value_mask_tmp[i];
}
i = 0;
w3100_ip[0] = 0;
while(value_ip[i]!='.')
{
w3100_ip[0] = w3100_ip[0]*10 + (value_ip[i] - 0x30);
i++;
}
i++;
w3100_ip[1] = 0;
while(value_ip[i]!='.')
{
w3100_ip[1] = w3100_ip[1]*10 + (value_ip[i] - 0x30);
i++;
}
i++;
w3100_ip[2] = 0;
while(value_ip[i]!='.')
{
w3100_ip[2] = w3100_ip[2]*10 + (value_ip[i] - 0x30);
i++;
}
i++;
w3100_ip[3] = 0;
while(value_ip[i]!=0x00)
{
w3100_ip[3] = w3100_ip[3]*10 + (value_ip[i] - 0x30);
i++;
}
setsubmask(w3100_ip);
sysinit(0x03,0x03);
}
if(Line==3)
{
for(i=0;i<15;i++)
{
value_gateway[i] = value_gateway_tmp[i];
}
i = 0;
w3100_ip[0] = 0;
while(value_ip[i]!='.')
{
w3100_ip[0] = w3100_ip[0]*10 + (value_ip[i] - 0x30);
i++;
}
i++;
w3100_ip[1] = 0;
while(value_ip[i]!='.')
{
w3100_ip[1] = w3100_ip[1]*10 + (value_ip[i] - 0x30);
i++;
}
i++;
w3100_ip[2] = 0;
while(value_ip[i]!='.')
{
w3100_ip[2] = w3100_ip[2]*10 + (value_ip[i] - 0x30);
i++;
}
i++;
w3100_ip[3] = 0;
while(value_ip[i]!=0x00)
{
w3100_ip[3] = w3100_ip[3]*10 + (value_ip[i] - 0x30);
i++;
}
setgateway(w3100_ip);
sysinit(0x03,0x03);
}
if(Line==4)
{
for(i=0;i<15;i++)
{
value_dns[i] = value_dns_tmp[i];
}
}
Line = 0;
interface_lxi();
}
Input = 0;
}
break;
case A_KEY:
{
switch(Interface)
{
case MAIN_SCREEN:
{
Line = 1;
Input = 1;
Yy_value = 24;
value_count = 0;
point_exist = 0;
for(i=0;i<5;i++)
{
value_u_tmp[i] = '0';
}
interface_main();
}
break;
case MENU_SCREEN:
{
if(Line==1)
{
Line = 0;
Interface = MAIN_SCREEN;
lcd_clear();
interface_main();
}
if(Line==2)
{
Line = 1;
Interface = COMMUNICATION_SCREEN;
lcd_clear();
interface_communication();
}
}
break;
case COMMUNICATION_SCREEN:
{
if(Line==1)
{
Line = 0;
Interface = RS232C_SCREEN;
lcd_clear();
interface_rs232c();
}
if(Line==3)
{
Line = 0;
Interface = LXI_SCREEN;
lcd_clear();
interface_lxi();
}
}
break;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -