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

📄 mkey.c

📁 在AVR开发板驱动时钟芯片DS1302
💻 C
字号:
/*******************************************
  文件:MKEY.C
  环境:编译为ICC AVR6.25A,仿真为AVR Studio4.10 
  硬件:ATMEGA16芯片
  日期:2006年12月10日 
  功能:驱动开发板上的矩阵键盘,按不同的键,则数码管显示键码0~F
  备注:参考《AVR系列单片机C语言编程与应用实例》(清华大学出版社)
/******************************************/
#include <iom16v.h>			//包含型号头文件
#include <macros.h>			//包含"位"操作头文件
#include <stdio.h>			//标准输入输出头文件

/*******************************************
函数名称: 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(15);					//延时消抖
 if(Mkey_press()==TRUE)			//如果有键按下
 {
  	do
	{
	   i=(i<<1|i>>7);		//进行行扫描
	   KEY_DDR=0x0F;		//定义数据端口低四位为输出,高四位为输入
	   KEY_PORTO=i;			//输出扫描码	   	   
	   Delayms(1);			//防止读入出错,加入延时
	   keycode=KEY_PORTI;	//读入原始键码
	}while((keycode&0xF0)==0xF0);	//是否检测到被按下按键(扫描到就跳出循环,否则继续扫描)
	do
	{
	}while(Mkey_press()==TRUE);	//等待按键释放(为了防止按一次,执行多次的现象)
	Delayms(15);				//延时消抖
	switch(keycode)				//将原始键码翻译成0~F
	{
	   case 0xEE:
	   		keycode=0x0;
			break;
	   case 0xDE:
	   		keycode=0x1;
			break;
	   case 0xBE:
	   		keycode=0x2;
			break;
	   case 0x7E:
	   		keycode=0x3;
			break;
	   case 0xED:
	   		keycode=0x4;
			break;
	   case 0xDD:
	   		keycode=0x5;
			break;
	   case 0xBD:
	   		keycode=0x6;
			break;
	   case 0x7D:
	   		keycode=0x7;
			break;
	   case 0xEB:
	   		keycode=0x8;
			break;
	   case 0xDB:
	   		keycode=0x9;
			break;
	   case 0xBB:
	   		keycode=0xA;
			break;
	   case 0x7B:
	   		keycode=0xB;
			break;
	   case 0xE7:
	   		keycode=0xC;
			break;
	   case 0xD7:
	   		keycode=0xD;
			break;
	   case 0xB7:
	   		keycode=0xE;
			break;
	   case 0x77:
	   		keycode=0xF;
			break;
	}
 }
 return keycode;  		//返回经过翻译的键码
}

⌨️ 快捷键说明

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