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

📄 key.c

📁 键盘按键程序,C语言编写的
💻 C
字号:
#define KEY
#include "includes.h"

void KeyBufIn(unsigned char kcode)
{
	EA=0; 
	if(KeyNRead < KEY_BUF_SIZE)        
	{               
		KeyNRead++;             
		KeyBuf[KeyBufInIx++] = kcode;   
		if (KeyBufInIx >= KEY_BUF_SIZE)	
		{        
			KeyBufInIx = 0;
		}
		EA=1;                                
	} 
	else					              
	{                                     
		EA=1;                 
	}
}
unsigned char KeyDecode(void)
{
	unsigned char col;
	unsigned char row;
	unsigned char offset;
	unsigned char done;
	unsigned char col_id;
	unsigned char msk;	
	done=FALSE;
	row=0;
	while (row < KEY_MAX_ROWS && !done)   
	{             
		KeySelRow(row);                                        
		if(KeyIsKeyDown())			           
		{                         
			done = TRUE;                               
		}
		else
		{
			row++;                                            
		}
	}
	col=KeyGetCol();                                                 
	offset = 0;                        
/*
	if (col & KEY_SHIFT1_MSK)		             
	{         
		offset += KEY_SHIFT1_OFFSET;
	}
	if (col & KEY_SHIFT2_MSK)		            
	{                       
		offset += KEY_SHIFT2_OFFSET;
	}
	if (col & KEY_SHIFT3_MSK)		            
	{                       
		offset += KEY_SHIFT3_OFFSET;
	}
*/
	msk=0x01;                                    
	col_id=0;                                               
	done=FALSE;
	while(col_id < KEY_MAX_COLS && !done)                       
	{          
		if (col&msk)					         
		{                              
			done=TRUE;                   
		} 
		else 
		{
			col_id++;
			msk <<= 1;
		}
	}
//	return (row*KEY_MAX_COLS + offset + col_id);     
	return (row*KEY_MAX_COLS + col_id);
}
/*
void KeyFlush(void)
{
	while(KeyHit())		
	{                           
		KeyGetKey();        	
	}
}
*/
unsigned char KeyGetKey(void)
{
	unsigned char kcode;
	EA=0;                        
	if(KeyNRead > 0)			                
	{                          
		KeyNRead--;             	                 
		kcode=KeyBuf[KeyBufOutIx];                       
		KeyBufOutIx++;
		if(KeyBufOutIx >= KEY_BUF_SIZE)              
		{       
		    KeyBufOutIx = 0;
		}
		EA=1;                                         
		return (kcode);                       
	}
	else 
	{
	    EA=1;                                        
	    return (0xff);                         
	}
}
/*
unsigned int KeyGetKeyDownTime(void)
{
    unsigned int tmr;
    EA=0;
    tmr = KeyDownTmr;
    EA=1;
    return(tmr * KEY_SCAN_TASK_DLY);
}
*/
unsigned char KeyHit(void)
{
    unsigned char hit;
    EA=0;
    hit=(unsigned char)(KeyNRead > 0) ? TRUE : FALSE;
    EA=1;
    return(hit);
}
void  KeyInit(void)
{
	KeySelRow(KEY_ALL_ROWS);                                                   
	KeyScanState = KEY_STATE_UP;                           
	KeyNRead     = 0;                                                
	KeyDownTmr   = 0;
	KeyBufInIx   = 0;                            
	KeyBufOutIx  = 0;                           
}
unsigned char KeyIsKeyDown(void)
{
	if (KeyGetCol() & ((1 << KEY_MAX_COLS) - 1))	
	{         
		EA=0;
		KeyDownTmr++;                                             
		EA=1;
		return(TRUE);
	} 
	else 
	{
		return (FALSE);
	}
}
//键盘扫描任务,定时调用
void KeyScanTask(void)
{
	unsigned char kcode;
	switch (KeyScanState) 
	{
		case KEY_STATE_UP:                          
			if(KeyIsKeyDown())					//是否有键按下                   
			{                     
				KeyScanState=KEY_STATE_DEBOUNCE;//进入下一状态(判断是否回弹) 
				KeyDownTmr=0;                	                     
			}
		break;		
		case KEY_STATE_DEBOUNCE:                    
			if(KeyIsKeyDown())					//键是否仍然按下                   
			{                     
				kcode=KeyDecode();      		//键值译吗            
				KeyBufIn(kcode);                               
				KeyRptStartDlyCtr=KEY_RPT_START_DLY;//进入下一状态(等待启动自动重复)   
				KeyScanState=KEY_STATE_RPT_START_DLY;
			} 
			else 
			{
				KeySelRow(KEY_ALL_ROWS);                                  
				KeyScanState=KEY_STATE_UP;     	//返回上一状态(等待按下)           
			}
		break;	
		case KEY_STATE_RPT_START_DLY:
			if(KeyIsKeyDown())					              
			{                     
				if(KeyRptStartDlyCtr > 0)		   
				{          
					KeyRptStartDlyCtr--;        //启动自动重复计时   
					if(KeyRptStartDlyCtr == 0)    
					{     
						kcode=KeyDecode();                    
						KeyBufIn(kcode);                       
						KeyRptDlyCtr=KEY_RPT_DLY;//进入下一状态(等待下一次重复)            
						KeyScanState=KEY_STATE_RPT_DLY;
					}
				}
			} 
			else 
			{
				KeyScanState=KEY_STATE_DEBOUNCE;         
			}
		break;		
		case KEY_STATE_RPT_DLY:
			if(KeyIsKeyDown())				               
			{                     
				if(KeyRptDlyCtr > 0)		
				{               
					KeyRptDlyCtr--;    		//下一次重复计时 
					if(KeyRptDlyCtr == 0)	            
					{          
						kcode=KeyDecode();	            
						KeyBufIn(kcode);   	                
						KeyRptDlyCtr = KEY_RPT_DLY;//重装计数值  
					}
				}
			}
			else 
			{
				KeyScanState = KEY_STATE_DEBOUNCE;          
			}
		break;
	}
}
unsigned char KeyGetCol(void)
{
	unsigned char i;
	i=XBYTE[0x7f1d];
    return (~i);			
}
void KeySelRow(unsigned char row)
{
    if(row == KEY_ALL_ROWS) 
	{
        XBYTE[0x7f1d]=0x00;                                           
    } 
	else 
	{
        XBYTE[0x7f1d]=~(1<<row);                                    
    }
}

⌨️ 快捷键说明

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