📄 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 vipstart1(void)
{ ration_mode_a=vip_mode_a;
if(state1==0x00 && k1key)
{ state1=0x02;ration_num_a=0;setdotok=0;
if(!ration_mode_a)
{ bbyte=dotmode[decimal_a]; //小数点--元
if(a0) multiple_a=10;
else if(a3)multiple_a=100;
else multiple_a=1;
}
else
{ //升
bbyte=dotmode[decimal_a]; //小数点
if(a4) multiple_a=100;
else if(a1)multiple_a=1000;
else multiple_a=1;
}
//disp_vip_a();
}
}
/**********************************************************
*功能:定量
***********************************************************/
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
if(k1key)
{
if(state1==0){state1=06;ration_mode_a=1;menu1=2;disp_total_a();break;}
if(state1==6){if(menu1==1)menu1=2;else menu1=1;disp_total_a();break;}
}
else
{
if(state1==0){state1=7;ration_mode_a=0;menu1=2;disp_total_a();break;}
}
break;
case 2: //钮:MENU
if(k1key && !locknooil_a)
{ if(state1==0){temp_mema=1;state1=4;menu1=1;disp_memu1_oil();}
else if(state1==4){menu1++;if(menu1>7)menu1=1;multiple_a=1;ration_num_a=0;disp_memu1_oil();}
if(state1==4 && menu1==4){temp_mema=1;disp_lock_a();}
}
else
{ ration_num_a=0;
if(state1==0){state1=3;menu1=1;disp_memu1_set();}
else if(state1==3){temp_mema=0;menu1++;if(menu1>10)menu1=1;if(state1==3 && menu1==10)multiple_a=1;disp_memu1_set();}
else if(state1==8){menu1++;if(menu1>4)menu1=1;disp_memu1_important();}
if(state1==3 && menu1==8)
{ bbyte=dotmode[decimal_a];
if (a2) multiple_a=1000;
else if(a5) multiple_a=100;
else multiple_a=1;
ration_num_a=0;
setdotok=0;
}
}
break;
case 3: //钮:ENTER
//if(state1==2) {state1=0;break;}
if(state1==4 && menu1==2)
{ if(pass_check(0))
{ if(locknooil_a){state1=0;locknooil_a=0;prn1time=1;disp_return_a();}
else {locknooil_a=1;multiple_a=1;ration_num_a=0;disp_lock_a();}
}
else if(!locknooil_a){state1=0;prn1time=1;disp_return_a();}
else {locknooil_a=1;multiple_a=1;ration_num_a=0;disp_lock_a();}
break;
}
if(state1==4 && menu1==4)
{ if(pass_check(0) || temp_mema==2)
{ if(temp_mema==1){temp_mema=2;ration_num_a=0;multiple_a=1;ration_num_a=0;}
else if(temp_mema==2){temp_mema=3;ration_pulse_a=ration_num_a;multiple_a=1;ration_num_a=0;} //新密码暂存
else if(temp_mema==3){temp_mema=4;}
disp_lock_a();
}
else{state1=0;prn1time=1;disp_return_a();}
break;
}
if(state1==3 && menu1==10)
{
if(ration_num_a==5604 && multiple_a==10000)setpas_a=1;
else setpas_a=0;
if((ration_num_a==4321 || ration_num_a==5604) && multiple_a==10000){state1=8;menu1=1;disp_memu1_important();}
}
if(state1==8 && menu1==2){gun1.sum_sale=ration_num_a;pt=&gun1.sum_sale;writebyteseq(25,pt,4);disp_memu1_important();disp_memu1_important();accumulative_total_list_a();}
if(state1==8 && menu1==3){gun1.sum_liter=ration_num_a;pt=&gun1.sum_liter;writebyteseq(21,pt,4);disp_memu1_important();disp_memu1_important();accumulative_total_list_a();}
if(state1==8 && menu1==4) eeprom_ipl(); //EEPROM初始化程序
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 1:
break;
default:
if(!locknooil_a){state1=0;prn1time=1;disp_return_a();}
break;
}
if(save_ok){save_ok=0;backup_sysdata();}
break;
case 5: //PPU
print_proof(0); //打印加油票据A
break;
case 6: //钮:7
vipstart1();
switch (state1)
{ case 2:
if(!setdotok){if(ration_num_a<100000) {ration_num_a*=10;ration_num_a+=7*multiple_a;}}
else {if(multiple_a!=0) {ration_num_a+=7*multiple_a;multiple_a/=10;}}
disp_vip_a();
break;
case 4:
if(menu1==1) disp_eeprom_history(0,7); //查询前10次
else if(menu1==2 || menu1==4){ration_num_a+=7*multiple_a;if(multiple_a<10000) multiple_a*=10;disp_lock_a();}
break;
case 3:
if(menu1==8)
{
if(!setdotok){if(ration_num_a<100000) {ration_num_a*=10;ration_num_a+=7*multiple_a;}}
else {if(multiple_a!=0) {ration_num_a+=7*multiple_a;multiple_a/=10;}}
price_a=ration_num_a; //设置的单价
disp_memu1_set();
}
if(menu1==9) set_time(7);
if(menu1==10){ration_num_a+=7*multiple_a;if(multiple_a<10000)multiple_a*=10;disp_pass_vital(0);}
break;
case 8:
if(menu1==2 ||menu1==3){ration_num_a*=10;ration_num_a+=7;disp_memu1_important();}
break;
}
break;
case 7: //钮:8
vipstart1();
switch (state1)
{ case 2:
if(!setdotok){if(ration_num_a<100000) {ration_num_a*=10;ration_num_a+=8*multiple_a;}}
else {if(multiple_a!=0) {ration_num_a+=8*multiple_a;multiple_a/=10;}}
disp_vip_a();
break;
case 4:
if(menu1==1) disp_eeprom_history(0,8); //查询前10次
else if(menu1==2 || menu1==4){ration_num_a+=7*multiple_a;if(multiple_a<10000)multiple_a*=10;disp_lock_a();}
break;
case 3:
if(menu1==8)
{
if(!setdotok){if(ration_num_a<100000) {ration_num_a*=10;ration_num_a+=8*multiple_a;}}
else {if(multiple_a!=0) {ration_num_a+=8*multiple_a;multiple_a/=10;}}
price_a=ration_num_a; //设置的单价
disp_memu1_set();
}
if(menu1==9) set_time(8);
if(menu1==10){ration_num_a+=8*multiple_a;if(multiple_a<10000)multiple_a*=10;disp_pass_vital(0);}
break;
case 8:
if(menu1==2 ||menu1==3){ration_num_a*=10;ration_num_a+=8;disp_memu1_important();}
break;
}
break;
case 8: //钮:9
vipstart1();
switch (state1)
{ case 2:
if(!setdotok){if(ration_num_a<100000) {ration_num_a*=10;ration_num_a+=9*multiple_a;}}
else {if(multiple_a!=0) {ration_num_a+=9*multiple_a;multiple_a/=10;}}
disp_vip_a();
break;
case 4:
if(menu1==1) disp_eeprom_history(0,9); //查询前10次
else if(menu1==2 || menu1==4){ration_num_a+=9*multiple_a;if(multiple_a<10000)multiple_a*=10;disp_lock_a();}
break;
case 3:
if(menu1==8)
{
if(!setdotok){if(ration_num_a<100000) {ration_num_a*=10;ration_num_a+=9*multiple_a;}}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -