📄 mkey.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 + -