📄 键盘扫描程序(屏蔽了硬件).txt
字号:
#include"iom16.h"
#include <intrinsics.h>
#define uchar unsigned char
#define uint unsigned int
/************键盘接口定义*****************/
#define KEY_DDR DDRB
#define KEY_PORT PORTB
#define KEY_PIN PINB
/***********键盘子程序定义****************/
uchar get_key(void);
uchar key_scan(void);
/************键盘变量定义***************/
uchar temp=0;
uchar key=0;
uchar key_value;
uchar key_scan(void)
{
KEY_DDR= 0xF0; //行扫描,高四位输出0,键按下,则对应的值为0
KEY_PORT= 0x0F; //低四位输入,内部电阻上拉,没有键按下时为高
delay_nms(30); //延时等待稳定
temp = KEY_PIN&0x0F; //屏蔽高四位
if(temp==0x0F)
{
return 0; //当低四位全为高则无按键返回
}
else
{
delay_nms(30);
temp = KEY_PIN&0x0F; //延时去抖后再检测
if(temp==0x0F)
return 0;
else
key=temp;
}
//翻转
KEY_DDR = 0x0F; //列扫描,低四位输出0,键按下,则对应的值为0
KEY_PORT = 0xF0; //高四位输入,内部电阻上拉,没有键按下时为高
delay_nms(30); //延时等待稳定
temp = KEY_PIN&0xF0; //屏蔽低四位
if(temp==0xF0)
{
return 0; //当高四位全为高则无按键返回
}
else //这里不再延时再扫描,因为已经确定了不是抖动才会进入本步操作。
{
key |= temp; //高低位的键值进入KEY
}
KEY_DDR = 0x00; /*输出复位*/
KEY_PORT = 0xFF;
return key;
}
/*-----------------------------------
**模块:键值计算
**功能:对获得的键码换算成实际值
**备注:调用key_scan()子程序
------------------------------------*/
uchar get_key()
{
unsigned char i=0;
i=key_scan();
switch (i)
{ /*将按键码转换成键值*/
case 0x00: return 0xc7;
case 0x77: return '1';
case 0xB7: return '4';
case 0xD7: return '7';
case 0xE7: return '*';
case 0x7B: return '2';
case 0xBB: return '5';
case 0xDB: return '8';
case 0xEB: return '0';
case 0x7D: return '3';
case 0xBD: return '6';
case 0xDD: return '9';
case 0xED: return '#';
case 0x7E: return 'A';
case 0xBE: return 'B';
case 0xDE: return 'C';
case 0xEE: return 'D';
default : return 0x21;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -