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