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

📄 jianpan.c

📁 单片机4x4键盘程序
💻 C
字号:
/***********************************矩阵键盘模块的说明*************************
子程序名称:jzkey.c
子程序功能:此模块主要应用于4*4矩阵键盘,能实时返回当前的键值
子程序调用:
          /*******************************************
          函数名称: Key_press
          功    能: 检测是否有键按下
          参    数: 无
          返回值  : pressed--有键按下时为TRUE,否则为FALSE
          /********************************************/  
          /*******************************************
          函数名称: Key_scan
          功    能: 扫描所按的键并返回键值
          参    数: 无
          返回值  : keycode--被按下键值
*******************************************************************************/

#include <iom128v.h>
#include <macros.h>
/******************数据类型宏定义******************/
#define uchar unsigned char
#define uint unsigned int
#define TRUE 1
#define FALSE 0
/******************按键常量******************/
#define KEY_DDR   DDRA			//按键方向定义
#define KEY_PORTO PORTA	  	//按键断口输出定义
#define KEY_PORTI PINA			//按键断口输入定义
#define OUT       0xFF	    //输出常量
#define IN        0xF0		  //输入常量

/*******************************************
函数名称: Delayus
功    能: 延时指定微秒(8M晶振)
参    数: US--延时的微秒数(大约,不是很精确,MS越大越准确)
返回值  : 无
/********************************************/
void Delayus(uint US)		  
{
 uint i;
 US=US*5/4;		  	 //5/4是在8MHz晶振下,通过软件仿真反复实验得到的数值
 for( i=0;i<US;i++); 
}
/*******************************************
函数名称: Delayms
功    能: 延时指定毫秒(8M晶振)
参    数: MS--延时的毫秒数
返回值  : 无
/********************************************/
void Delayms(uint MS)		  
{
 uint i,j;
 for( i=0;i<MS;i++)
 for(j=0;j<1141;j++);	//1141是在8MHz晶振下,通过软件仿真反复实验得到的数值
}
/*******************************************
函数名称: Key_press
功    能: 检测是否有键按下
参    数: 无
返回值  : pressed--有键按下时为TRUE,否则为FALSE
/********************************************/
uchar Mkey_press(void)
{
 uchar pressed;		 		
 KEY_DDR = OUT;				//定义数据端口为输出
 KEY_PORTO = 0xF0;			//输出数据(输出检测码)
 KEY_DDR = IN;				//定义数据端口为输入
 if(KEY_PORTI != 0xF0)		//检测是否有键按下
 	pressed=TRUE;			//有键按下则返回TRUE
 else
 	pressed=FALSE;			//无键按下则返回FALSE
 KEY_DDR=OUT;				//数据端口还原为输出
 return pressed;
}
/*******************************************
函数名称: Key_scan
功    能: 扫描所按的键并返回键值
参    数: 无
返回值  : keycode--被按下键值
/********************************************/
uchar Mkey_scan(void)
{
 uchar i=0x7F,keycode=0xFF;		//i为扫描码,
 Delayms(4);					//延时消抖
 if(Mkey_press()==TRUE)			//如果有键按下
 {
  	do
	{
	   i=(i<<1|i>>7);		//进行行扫描
	   KEY_DDR=0x0F;		//定义数据端口低四位为输出,高四位为输入
	   KEY_PORTO=i;			//输出扫描码	   	   
	   Delayms(5);			//防止读入出错,加入延时
	   keycode=KEY_PORTI;	//读入原始键码
	}while((keycode&0xF0)==0xF0);	//是否检测到被按下按键(扫描到就跳出循环,否则继续扫描)
	
	do
	{	
	}while(Mkey_press()==TRUE);	//等待按键释放(为了防止按一次,执行多次的现象)
	Delayms(5);				//延时消抖										`	
	switch(keycode)				//将原始键码翻译成0~F
	{
	   case 0xEE:
	   		keycode=0x1;//1
			break;
	   case 0xDE:
	   		keycode=0x2;//2
			break;
	   case 0xBE:
	   		keycode=0x3;//3
			break;
	   case 0x7E:        
	   		keycode=0xc;//上翻
			break;
	   case 0xED:
	   		keycode=0x4;//4
			break;
	   case 0xDD:
	   		keycode=0x5;//5
			break;
	   case 0xBD:
	   		keycode=0x6;//6
			break;
	   case 0x7D:
	   		keycode=0xd;//下翻
			break;
	   case 0xEB:
	   		keycode=0x7;//7
			break;
	   case 0xDB:
	   		keycode=0x8;//8
			break;
	   case 0xBB:
	   		keycode=0x9;//9
			break;
	   case 0x7B:
	   		keycode=0xe;//左移
			break;
	   case 0xE7:
	   		keycode=0xa;//功能
			break;
	   case 0xD7:
	   		keycode=0x0;//0
			break;
	   case 0xB7:
	   		keycode=0xb;//确定
			break;
	   case 0x77:
	   		keycode=0xf;//右移
			break;
	}
 }
 return keycode;  		//返回经过翻译的键码
}

⌨️ 快捷键说明

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