📄 keyboard.c
字号:
//////////////////////////////////////////////////////////
#include <REG51STC.H>
#include <ABSACC.H>
#include "CMD16887.H"
#include <INTRINS.H>
#include "externxy.h"
/***************************************************************************
* 功能:电磁阀及蜂鸣器输出
***************************************************************************/
void dcespk_out(void)
{
AUXR |=0x02;
bbyte=alarm;
bbyte|=0x1f;
XBYTE[DXD1ADD]=bbyte; // 气缸1及蜂鸣器1输出
bbyte=alarm;
bbyte<<=3;
bbyte|=0x1f;
XBYTE[DXD2ADD]=bbyte; // 气缸2及蜂鸣器2输出
AUXR &=0xfd;
}
/**************************************************************************
* 功能:读按键A、B
***************************************************************************/
void read_key(void)
{
uchar data keymem[5]; //扫描得到的銉值
uchar data i;
bit bm;
uchar keynum_a,keynum_b;
bbyte=alarm;
bbyte|=0x1f;
bbyte &=0xfe;
AUXR |=0x02;
_nop_();
XBYTE[DXD1ADD]=bbyte; // 阀门1及蜂鸣器1输出
bbyte=alarm;
bbyte<<=3;
bbyte|=0x1f;
bbyte &=0xfe;
_nop_();
XBYTE[DXD2ADD]=bbyte; // 阀门2及蜂鸣器2输出
_nop_();
keymem[0]=XBYTE[KEY_ADD]; //读键值
/***********************/
bbyte=alarm;
bbyte|=0x1f;
bbyte &=0xfd;
_nop_();
XBYTE[DXD1ADD]=bbyte; // 阀门1及蜂鸣器1输出
bbyte=alarm;
bbyte<<=3;
bbyte|=0x1f;
bbyte &=0xfd;
_nop_();
XBYTE[DXD2ADD]=bbyte; // 阀门2及蜂鸣器2输出
_nop_();
keymem[1]=XBYTE[KEY_ADD]; //读键值
/***********************/
bbyte=alarm;
bbyte|=0x1f;
bbyte &=0xfb;
_nop_();
XBYTE[DXD1ADD]=bbyte; // 阀门1及蜂鸣器1输出
bbyte=alarm;
bbyte<<=3;
bbyte|=0x1f;
bbyte &=0xfb;
_nop_();
XBYTE[DXD2ADD]=bbyte; // 阀门2及蜂鸣器2输出
_nop_();
keymem[2]=XBYTE[KEY_ADD]; //读键值
/***********************/
bbyte=alarm;
bbyte|=0x1f;
bbyte &=0xf7;
XBYTE[DXD1ADD]=bbyte; // 阀门1及蜂鸣器1输出
bbyte=alarm;
bbyte<<=3;
bbyte|=0x1f;
bbyte &=0xf7;
XBYTE[DXD2ADD]=bbyte; // 阀门2及蜂鸣器2输出
_nop_();
keymem[3]=XBYTE[KEY_ADD]; //读键值
/***********************/
bbyte=alarm;
bbyte|=0x1f;
bbyte &=0xef;
XBYTE[DXD1ADD]=bbyte; // 阀门1及蜂鸣器1输出
bbyte=alarm;
bbyte<<=3;
bbyte|=0x1f;
bbyte &=0xef;
XBYTE[DXD2ADD]=bbyte; // 阀门2及蜂鸣器2输出
_nop_();
keymem[4]=XBYTE[KEY_ADD]; //读键值
AUXR &=0xfd;
//KEYA銉值转换
bm=1;
keynum_a=0x00;
for (i=0;i<5;i++)
{
bbyte=keymem[i];
bbyte=~bbyte;
bbyte&=0x0f;
if(bbyte!=0)
{
switch (bbyte)
{
case 1:
if(bm) {keynum_a=i+1;}
else {keynum_a=0x00;} //有多个键
break;
case 2:
if(bm) {keynum_a=i+6;}
else {keynum_a=0x00;} //有多个键
break;
case 4:
if(bm) {keynum_a=i+11;}
else {keynum_a=0x00;} //有多个键
break;
case 8:
if(bm) {keynum_a=i+16;}
else {keynum_a=0x00;} //有多个键
break;
default: {bm=0;keynum_a=0x00;} //有多个键
break;
}
}
}
if (keynum_a!=0)
{ keyinput_a++;
if (keyinput_a>5)
{ if(!keyok_a)
{ if(k1spk_time==0)k1spk_time=20; //=20产生1短音
keyok_a=1;
}
keysolve_a=keynum_a; //待处理的键值
keyinput_a=1;
}
}
else keyinput_a=0;
keynumold_a=keynum_a;
// KEYB銉值转换
bm=1;
keynum_b=0x00;
for (i=0;i<5;i++)
{
bbyte=keymem[i];
bbyte=~bbyte;
bbyte>>=4;
bbyte&=0x0f;
if(bbyte!=0)
{
switch (bbyte)
{
case 1:
if(bm) {keynum_b=i+1;}
else {keynum_b=0x00;} //有多个键
break;
case 2:
if(bm) {keynum_b=i+6;}
else {keynum_b=0x00;} //有多个键
break;
case 4:
if(bm) {keynum_b=i+11;}
else {keynum_b=0x00;} //有多个键
break;
case 8:
if(bm) {keynum_b=i+16;}
else {keynum_b=0x00;} //有多个键
break;
default: {bm=0;keynum_b=0x00;} //有多个键
break;
}
}
}
if (keynum_b!=0)
{ keyinput_b++;
if (keyinput_b>5)
{ if(!keyok_b)
{ k2spk_time=20;
keyok_b=1;
}
keysolve_b=keynum_b; //待处理的键值
keyinput_b=1;
}
}
else keyinput_b=0;
keynumold_b=keynum_b;
/******************************************************/
}
/**********************************************************
*功能:定量
***********************************************************/
void vipstart2(void)
{ ration_mode_b=vip_mode_b;
if(state2==0x00 && k2key)
{ state2=0x02;ration_num_b=0;setdotok_b=0;
if(!ration_mode_b)
{ bbyte=dotmode[decimal_b]; //小数点--元
if(a0) multiple_b=10;
else if(a3)multiple_b=100;
else multiple_b=1;
}
else
{ //升
bbyte=dotmode[decimal_b]; //小数点
if(a4) multiple_b=100;
else if(a1)multiple_b=1000;
else multiple_b=1;
}
if(!ration_mode_b)
{ bbyte=dotmode[decimal_b]; //小数点--元
if(a0) multiple_b=10;
else if(a3)multiple_b=100;
else multiple_b=1;
}
else
{ //升
bbyte=dotmode[decimal_b]; //小数点
if(a4) multiple_b=100;
else if(a1)multiple_b=1000;
else multiple_b=1;
}
//disp_vip_b();
}
}
/************************************************************
* KEYA_SOLVE
* 功能:按键处理函数
*************************************************************/
void keya_solve(void)
{
//void *pt;
if(keyok_a && keyinput_a==0)
{ //data uchar ucCurtime[7]; //日期--时间
keyok_a=0;
switch (keysolve_a)
{ case 1: //钮:TOTAL
break;
case 2: //钮:MENU
if(!electromotor){ration_num_a=0;increment_a=0;state1=3;menu1=5;disp_rev();}
break;
case 3: //钮:ENTER
if(state1==3)
{
if(increment_a<100) increment_a=100;
if(increment_a>500) increment_a=500;
disp_rev();
state1=0;
if(save_ok){save_ok=0;backup_sysdata();}
}
break;
case 4: //钮:EXIT
switch(state1)
{ case 2:
if(state1==2) {state1=0;ration_num_a=0;clr_exitdata_a();disp_key_clear_a();} //
break;
case 0:
//if(state1==0) {clr_exitdata_a();} //取消授权
//else {state1=0;prn1time=1;}
break;
case 3:
if(increment_a<200) increment_a=200;
if(increment_a>500) increment_a=500;
disp_rev();
state1=0;
break;
default:
if(!locknooil_a){state1=0;prn1time=1;disp_return_a();}
break;
}
break;
case 5: //PPU
if(state1!=3){startup(5);}
break;
case 6: //钮:7
setb_rev(7);
break;
case 7: //钮:8
setb_rev(8);
break;
case 8: //钮:9
setb_rev(9);
break;
case 9: //钮:STOP
cmdstop=1;
break;
case 10: //钮START
startup(1000);
break;
case 11: //钮:4
setb_rev(4);
break;
case 12: //钮:5
setb_rev(5);
break;
case 13: //钮:6
setb_rev(6);
break;
case 14: //小数点
break;
case 15: // V/P
break;
case 16: //钮:1
setb_rev(1);
break;
case 17: //钮:2
setb_rev(2);
break;
case 18: //钮:3
setb_rev(3);
break;
case 19: //钮:0
setb_rev(0);
break;
case 20: //CLEAR
if(!electromotor)
{
clear_worka(); clear_workb();
}
if(state1==3)
{
increment_a=0;
disp_rev();
}
break;
default:
break;
}
}
}
/************************************************************
* KEYB_SOLVE
* 功能:按键处理函数
*************************************************************/
void keyb_solve(void)
{
void *pt;
if(keyok_b && keyinput_b==0)
{ //data uchar ucCurtime[7]; //日期--时间
keyok_b=0;
switch (keysolve_b)
{ case 1: //钮:TOTAL
if(k2key)
{
if(state2==0){state2=06;ration_mode_b=1;menu2=2;disp_total_b();break;}
if(state2==6){if(menu2==1)menu2=2;else menu2=1;disp_total_b();break;}
}
else
{
if(state2==0){state2=7;ration_mode_b=0;menu2=2;disp_total_b();break;}
}
break;
case 2: //钮:MENU
if(k2key && !locknooil_b)
{ if(state2==0){temp_memb=1;state2=4;menu2=1;disp_memu2_oil();}
else if(state2==4){menu2++;if(menu2>7)menu2=1;multiple_b=1;ration_num_b=0;disp_memu2_oil();}
if(state2==4 && menu2==4){temp_memb=1;disp_lock_b();}
}
else //设置
{ ration_num_b=0;
if(state2==0){state2=3;menu2=1;disp_memu2_set();}
else if(state2==3){temp_memb=0;menu2++;if(menu2>10)menu2=1;if(state2==3 && menu2==10)multiple_b=1;disp_memu2_set();}
else if(state2==8){menu2++;if(menu2>4)menu2=1;disp_memu2_important();}
if(state2==3 && menu2==8)
{ bbyte=dotmode[decimal_b];
if (a2) multiple_b=1000;
else if(a5) multiple_b=100;
else multiple_b=1;
ration_num_b=0;
setdotok_b=0;
}
}
break;
case 3: //钮:ENTER
//if(state2==2) {state2=0;break;}
if(state2==4 && menu2==2)
{ if(pass_check(1))
{ if(locknooil_b){state2=0;locknooil_b=0;prn2time=1;disp_return_b();}
else {locknooil_b=1;multiple_b=1;ration_num_b=0;disp_lock_b();}
}
else if(!locknooil_b){state2=0;prn2time=1;disp_return_b();}
else {locknooil_b=1;multiple_b=1;ration_num_b=0;disp_lock_b();}
break;
}
if(state2==4 && menu2==4)
{ if(pass_check(1) || temp_memb==2)
{ if(temp_memb==1){temp_memb=2;ration_num_b=0;multiple_b=1;ration_num_b=0;}
else if(temp_memb==2){temp_memb=3;ration_pulse_b=ration_num_b;multiple_b=1;ration_num_b=0;} //新密码暂存
else if(temp_memb==3){temp_memb=4;}
disp_lock_b();
}
else{state2=0;prn2time=1;disp_return_b();}
break;
}
if(state2==3 && menu2==10)
{ if(ration_num_b==5604 && multiple_b==10000)setpas_b=1;
else setpas_b=0;
if((ration_num_b==4321 || ration_num_b==5604) && multiple_b==10000){state2=8;menu2=1;disp_memu2_important();}
}
break;
case 4: //钮:EXIT
switch(state2)
{ case 2:
if(state2==2) {state2=0;ration_num_b=0;clr_exitdata_b();disp_key_clear_b();} //
break;
case 0:
//if(state2==0) {clr_exitdata_b();} //取消授权
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -