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

📄 key.c

📁 一个采用Keil C编写的嵌入式单片机按键驱动
💻 C
字号:
//键盘引脚与参数定义
//sbit KEY_1    = P1^7;
//sbit KEY_2    = P1^6;
//sbit KEY_3    = P1^5;
//sbit KEY_4    = P1^4;
//改动后的
#define KEYALL    0Xf0  // // 1111 0000
#define KEY_P     P1
#define KEY_NO1   0X70  //扫描第1行结果 // 0111 0000
#define KEY_NO2   0Xb0	// 扫描第2行结果// 1011 0000
#define KEY_NO3   0Xd0	//扫描第3行结果 // 1101 0000
#define KEY_NO4   0Xe0	//扫描第4行结果 // 1110 0000
#define KEY_SNO1  0X7f  //扫描行为第1行 // 0111 1111
#define KEY_SNO2  0Xbf	//扫描行为第2行 // 1011 1111
#define KEY_SNO3  0Xdf	//扫描行为第3行 // 1101 1111
#define KEY_SNO4  0Xef	//扫描行为第4行 // 1110 1111
uchar code key_keyno[]={0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e}; //Mode1、2、3、4、5、Monitor、Play、Record,第九键未用



/*========================================================
名称:Scan_Key(void)
功能: 扫描小键盘和穿梭键
入口参数: 无
出口参数: 键值
==========================================================*/ 
/*
#define KEYALL    0Xf0  // // 1111 0000	//四跟线连在高4位
#define KEY_P     P1
#define KEY_NO1   0X70  //扫描第1行结果 // 0111 0000
#define KEY_NO2   0Xb0	// 扫描第2行结果// 1011 0000
#define KEY_NO3   0Xd0	//扫描第3行结果 // 1101 0000
#define KEY_NO4   0Xe0	//扫描第4行结果 // 1110 0000
#define KEY_SNO1  0X7f  //扫描行为第1行 // 0111 1111
#define KEY_SNO2  0Xbf	//扫描行为第2行 // 1011 1111
#define KEY_SNO3  0Xdf	//扫描行为第3行 // 1101 1111
#define KEY_SNO4  0Xef	//扫描行为第4行 // 1110 1111
*/
//sbit KEY_1    = P1^7;
//sbit KEY_2    = P1^6;
//sbit KEY_3    = P1^5;
//sbit KEY_4    = P1^4;
uchar Scan_Key(void)
{
uchar xdata key,temp=0x00,key_counter=0x00,scankey=0x00,returned_no=0x00;
if(Sys_scom_work_enable==1)
{
	while(1)
	{
		 WDT_CONTR = 0x37;             //喂狗,最长9秒
		 key=0x00;
		 edit_n=0x00;
		//=========扫描键盘第1行================
		KEY_P |=KEYALL;
		KEY_P &=KEY_SNO1;
		if( ( KEY_P & KEY_NO1 ) != KEY_NO1 )
			{
			Sys_delayms(10);
			KEY_P |=KEYALL;
			KEY_P &=KEY_SNO1;
			if( ( KEY_P & KEY_NO1 ) != KEY_NO1 )
				{
				 key_counter++;
				 temp =	 KEY_P;
				 temp &= KEY_NO1;
				 switch(temp)
				 	{
				 	case 0x30://0001 1000//0000 1100
						{
						key = key_keyno[0];
						}break;
				 	case 0x50://0001 0100  //0000 1010
						{
						key = key_keyno[1];
						}break;
					case 0x60://0000 1100  //0000 0110
						{
						key = key_keyno[2];
						}break;
					}
					scankey=key;
				}
			}
		
		
		//=========扫描键盘第2行================
		KEY_P |=KEYALL;
		KEY_P &=KEY_SNO2;
		if( ( KEY_P & KEY_NO2 ) != KEY_NO2 )
			{
			Sys_delayms(10);
			KEY_P |=KEYALL;
			KEY_P &=KEY_SNO2;
			if( ( KEY_P & KEY_NO2 ) != KEY_NO2 )
				{
				 key_counter++;
				 temp =	 KEY_P;
				 temp &= KEY_NO2;
				 switch(temp)
				 	{
				 	case 0x30://0001 1000 //0000 1100
						{
						key = key_keyno[3];
						}break;
				 	case 0x90://0001 0010  //0000 1001
						{
						key = key_keyno[4];
						}break;
					case 0xa0://0000 1010 //0000 0101
						{
						key = key_keyno[5];
						}break;
					}
				scankey=key;
				}
			}
		
		//=========扫描键盘第3行================
		KEY_P |=KEYALL;
		KEY_P &=KEY_SNO3;
		if( ( KEY_P & KEY_NO3 ) != KEY_NO3 )
			{
			Sys_delayms(10);
			KEY_P |=KEYALL;
			KEY_P &=KEY_SNO3;
			if( ( KEY_P & KEY_NO3 ) != KEY_NO3 )
				{
				 key_counter++;
				 temp =	 KEY_P;
				 temp &= KEY_NO3;
				 switch(temp)
				 	{
				 	case 0x50://0001 0100	//0000 1010
						{
						key = key_keyno[6];
						}break;
				 	case 0x90://0001 0010	//0000 1001
						{
						key = key_keyno[7];
						}break;
					case 0xc0://0000 0110  //0000 0011
						{
						key = key_keyno[8];	//第九键,暂时未用,保留
						}break;
					}
				scankey=key;
				}
			}
			if(scankey==0x00)//扫描穿梭键部分
			{
			edit();
			if(edit_n!=0x00)
				{
				scankey=edit_n;
				key_counter++;
				}
			}
		if(Sys_is_auto_playing==1)
		{
			if(Sys_scom_work_enable==0 || Sys_scom_play_enable==0)
			{
				Sys_is_auto_playing=0;
				Custom_doing_now_byte1=0x05;
			}
		}		
		if(scankey==0x0b)
		{
		returned_no=Sys_auto_play_enable_fun(0x0b);//返回OKOK表示已经被Scan_key_not_in_menu(void)函数处理过了
			if(returned_no==OKOK )
			{
			scankey=0x00;
			key_counter=0x00;
			}
		}else 
			{
			returned_no=Sys_auto_play_enable_fun(scankey);
			if(returned_no==OKOK )
				{
				scankey=0x00;
				key_counter=0x00;
				}
			}
		if(key_counter>=1)//已经有按键被按下//消除重键
		{
		    if(key==0x00)//按键已经松开
			break;
		}
	  }
	}
return(scankey);//返回键值
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -