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

📄 keyboard.c

📁 用于测试步进电机
💻 C
📖 第 1 页 / 共 2 页
字号:
//////////////////////////////////////////////////////////
#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 + -