⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 keyboard.c

📁 HT1621液晶控制测试
💻 C
📖 第 1 页 / 共 3 页
字号:
//////////////////////////////////////////////////////////
#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 + -