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

📄 keyscan.c

📁 3510 TFT彩屏的测试程序
💻 C
字号:
/*--------------------------------------------------------------------------------
**工程名称:3*4键盘扫描测试程序
**编译器:ICCAVR6.31A pro
**日期:2005.10.10
**作者:coole

**芯片类型:M16
**时钟频率:内部8M

---------------------------------------------------------------------------------*/
#include "keyscan.h"
#include "3510i.h"
#include "buzzpr.h"

extern 	uchar fBuzzring;
extern	uchar BuzzringCnt;
extern	uchar BuzzringTime;
extern 	LCD_BGColor;

//**************************************************************
const		uchar	Convert[]={0,1,4,7,10,2,5,8,11,3,6,9,12};
uchar 	flag1;
#define 	fkeyreq   		0	//按键请求
#define 	fkeyeff   		1	//按键有效
#define 	fkeyhid   		2	//按键屏蔽
#define 	fkeysucc  		3	//连键判断
#define	finputeff		4	//按键输入有效

uchar 	MenuLevel;
uchar	MenuItemMax;
uchar 	MenuSelect[3];

uchar 	KeyNow,KeyOld,KeyCode,KeyCnt;
uchar Get_Key_Value(void)
{
	uchar  i,keyvalue,keynum;
	keynum=0xff;
    	DDRD  = 0xf0;//低四位为输入,高四位为输出
    	for(i=0;i<3;i++)
    	{
    		PORTD = 0xff;
    		clr_bit(PORTD,4+i);//将第i列输出低电平
    		delay_nus(20);
    		keyvalue=PIND&0x0f;
    		if(keyvalue!=0x0f)
    		{
    			switch(keyvalue)
    			{
    				case 	0x0e:keynum=13-(3-i)*4;break;
    				case	0x0d:keynum=14-(3-i)*4;break;
    				case	0x0b:keynum=15-(3-i)*4;break;
    				case	0x07:keynum=16-(3-i)*4;break;
    				default:break;
    			}

    		}
    	}
    	DDRD  = 0xff;
    	PORTD = 0xff;
    	return  keynum;//return  0xff;
}

//**************************************//
//	函数名称:void Key_Scan()
//	输--入:无
//	输--出:无
//	功--能:按键扫描
//	影响标志:
//	创--建:
//	修--改:
//**************************************//
void Key_Scan(void)
{
	uchar temp;
	temp=Get_Key_Value();
	if(temp!=0xff)
	{
		KeyNow=Convert[temp];
		//LCD_WriteEnglishChar((KeyNow+48),10 , 50);
	}
	else
	{
		KeyNow=0;
		KeyCode=0;
		KeyOld=0;
	}
	if(KeyNow)
	{
		if(KeyNow!=KeyCode)
		{
			KeyCode=KeyNow;
			KeyCnt=0;
		}
		else
		{	//起滤波作用,修改这里的数字可以调整按键的灵敏度
			KeyCnt++;
			if(KeyCnt>5)
			{
				KeyCnt=0;
				set_bit(flag1,fkeyreq);
			}
		}
	}
	if(get_bit(flag1,fkeyreq))
	{
		clr_bit(flag1,fkeyreq);
		if(KeyCode!=KeyOld)
		{
			//无连键
			if(!(get_bit(flag1,fkeyhid)))
			{
				set_bit(flag1,fkeyhid); //有按键时,设置按键屏蔽,屏蔽掉其它按键
				KeyOld=KeyCode;
				set_bit(flag1,fkeyeff);
			}
			//keyccnt=40;
		}
		else
		{
			//有连键现象
			set_bit(flag1,fkeyhid);
			/*if((KeyCode==3)||(KeyCode==4))		//这里的数字对应有连键现象的键值
			{
				keyccnt--;
				if(keyccnt==0)
				{
					keyccnt=6;
					set_bit(flag1,fkeyeff);
					set_bit(flag1,fkeysucc);
				}
			}*/
		}
	}
	if(!KeyNow) 	//没有任何按键时,清除按键屏蔽
		clr_bit(flag1,fkeyhid);            	                     
}
//**************************************//
//	函数名称:void Key_Pr()
//	输--入:KeyCode
//	输--出:data_buffer[0]
//	功--能:按键处理
//	影响标志:
//	创--建:
//	修--改:
//**************************************//
void Key_Pr(void)
{
	if(get_bit(flag1,fkeyeff))
	{
		fBuzzring|=(1<<fbuzzeff)|(1<<fbuzzring);
		BuzzringCnt=2;
		clr_bit(flag1,fkeyeff);
		set_bit(flag1,finputeff);
		if(KeyOld==10)
			KeyOld=0;
		//******************
		//**各按键功能处理
		//******************
		switch(KeyOld)
		{
			case 1: //confirm键
			{	
				++MenuLevel;
				if(MenuLevel==1)	//enter the menu 
				{
					
				}
				LCD_BGColor=0xff;
				LCD_EraseBlock(0,0,97,66);
				LCD_BGColor=0b11100000;
				LCD_EraseBlock(10,10,87,56);
				LCD_WriteEnglishString("Confirm Key",10 , 25);
				break;
			}
			case 2://up
			{
				LCD_BGColor=0b11100000;
				LCD_EraseBlock(10,10,87,56);
				LCD_WriteEnglishString("Up Key",10 , 25);
				break;
			}
			case 3://cancel
			{
				if(MenuLevel>0)
					--MenuLevel;
				else
					MenuLevel=0;
				
				LCD_BGColor=0b11100000;
				LCD_EraseBlock(10,10,87,56);
				LCD_WriteEnglishString("Cancel Key",10 , 25);
				break;
			}
			case 4: //left
			{
				LCD_BGColor=0b11100000;
				LCD_EraseBlock(10,10,87,56);
				LCD_WriteEnglishString("Left Key",10 , 25);
				break;
			}
			case 5://confirm
			{
				LCD_BGColor=0b11100000;
				LCD_EraseBlock(10,10,87,56);
				LCD_WriteEnglishString("Confirm Key",10 , 25);
				break;
			}
			case 6://right
			{
				LCD_BGColor=0b11100000;
				LCD_EraseBlock(10,10,87,56);
				LCD_WriteEnglishString("Right Key",10 , 25);
				break;
			}
			case 7: //
			{
				//LCD_WriteEnglishString("KeyValue=7",10 , 25);
				break;
			}
			case 8://down
			{
				LCD_BGColor=0b11100000;
				LCD_EraseBlock(10,10,87,56);
				LCD_WriteEnglishString("Down Key",10 , 25);
				break;
			}
			case 9://
			{
				//LCD_WriteEnglishString("KeyValue=9",10 , 25);
				break;
			}
			case 0: //
			{
				//LCD_WriteEnglishString("KeyValue=0",10 , 25);
				break;
			}
			case 0x0b://Time
			{
				LCD_BGColor=0b11100000;
				LCD_EraseBlock(10,10,87,56);
				LCD_WriteEnglishString("KeyValue=*",10 , 25);
				break;
			}
			case 0x0c://Temp
			{
				LCD_BGColor=0b11100000;
				LCD_EraseBlock(10,10,87,56);
				LCD_WriteEnglishString("KeyValue=#",10 , 25);
				break;
			}
			default:break;
		}
	}
}
/*--------------------------------------------延时函数------------------------------------*/					
//1us延时函数
void delay_1us(void)
{
	NOP();
}

//n us 延时函数
void delay_nus(unsigned int n)
{
	unsigned int i;
	for(i=0;i<n;i++)
		delay_1us();
}

//1ms延时函数
void delay_1ms(void)
{
	unsigned int i;
	for(i=0;i<600;i++);
}

//n ms延时函数
void delay_nms(unsigned int n)
{
	unsigned int i;
	for(i=0;i<n;i++)
		delay_1ms();
}

⌨️ 快捷键说明

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