📄 keycon.h
字号:
/**************************************************************
*文件名:keycon.h
*作者:刘峰雷 版本:1.0 日期:2004.6.8
*描述:实现键盘的译码
*************************************************************/
#ifndef _KEYCON_H_
#define _KEYCON_H_
#include "typeredef.h"
/*************产生键盘部分的片选信号****************/
#define KeyAdd (volatile UINT8 *)0x4FE00000
/*******************延迟函数************************/
void delay(UINT32 time)
{
UINT32 k = 0;
while(k <= time)
{
k++;
}
}
/****************************************************
*检查键盘行的状态——是否有键按下。
*若有键按下,返回false;否则,返回true。
***************************************************/
UINT32 key_status_check(void)
{
UINT32 key_line;
key_line = *KeyAdd;
if((key_line & 0xff) == 0xff)
{
return true;
}
else
{
return false;
}
}
/****************************************************
*获得键盘上面有键按下的行的行号。行号为0~7。
*否则返回值8。
***************************************************/
UINT8 key_line_check(void)
{
UINT8 key_line;
key_line = *KeyAdd;
if((key_line & 0x01) == 0x0) /*若key_line的第0位为1,则返回行号0*/
{
return 0;
}
if((key_line & 0x02) == 0x0) /*若key_line的第1位为1,则返回行号1*/
{
return 1;
}
if((key_line & 0x04) == 0x0) /*若key_line的第2位为1,则返回行号2*/
{
return 2;
}
if((key_line & 0x08) == 0x0) /*若key_line的第3位为1,则返回行号3*/
{
return 3;
}
if((key_line & 0x10) == 0x0) /*若key_line的第4位为1,则返回行号4*/
{
return 4;
}
if((key_line & 0x20) == 0x0) /*若key_line的第5位为1,则返回行号5*/
{
return 5;
}
if((key_line & 0x40) == 0x0) /*若key_line的第6位为1,则返回行号6*/
{
return 6;
}
if((key_line & 0x80) == 0x0) /*若key_line的第7位为1,则返回行号7*/
{
return 7;
}
return 8; /*默认情况下返回8*/
}
/****************************************************
*实现参数i的低四位的循环左移
***************************************************/
UINT8 crol1(unsigned char i)
{
UINT8 k;
k = i & 0x08; /*屏蔽掉除第三位外的其他位*/
k = k >> 3; /*k右移3位*/
i = i << 1; /*i左移1位*/
i = i & 0x0f; /*获取低四位*/
i = i | k; /*实现i低四位左移一位*/
return i;
}
/***********************************************************************
*获得4×8(4列8行)矩阵键盘所按下的键的序号
*各个键对应的序号如下所示:
* Display_Format MeasSetup Catalog/Sys 0x08 0x04 0x00
* 软键1 7 8 9 Enter_key 0x1F 0x01 0x1E 0x1A 0x0F
* 软键2 4 5 6 Back_key 0x1B 0x0D 0x09 0x05 0x0B
* 软键3 1 2 3 DCBias_key 0x17 0x19 0x15 0x11 0x07
* 软键4 0 . -/+ TRIG_key ===> 0x13 0x12 0x1D 0x16 0x03
* up 0x0E
* left right 0x06 0x02
* down 0x0A
**********************************************************************/
#define softkey_1 0x13 /*软键1键值*/
#define softkey_2 0x17 /*软键2键值*/
#define softkey_3 0x1B /*软键3键值*/
#define softkey_4 0x1F /*软键4键值*/
#define numkey_0 0x12 /*数字0键值*/
#define numkey_1 0x19 /*数字1键值*/
#define numkey_2 0x15 /*数字2键值*/
#define numkey_3 0x11 /*数字3键值*/
#define numkey_4 0x0D /*数字4键值*/
#define numkey_5 0x09 /*数字5键值*/
#define numkey_6 0x05 /*数字6键值*/
#define numkey_7 0x01 /*数字7键值*/
#define numkey_8 0x1E /*数字8键值*/
#define numkey_9 0x1A /*数字9键值*/
#define key_dot 0x1D /*小数点键值*/
#define key_minus_plus 0x16 /*正负号键值*/
#define arrowkey_up 0x0E /*向上光标键键值*/
#define arrowkey_down 0x0A /*向下光标键键值*/
#define arrowkey_left 0x06 /*向左光标键键值*/
#define arrowkey_right 0x02 /*向右光标键键值*/
#define enter_key 0x0F /*回车键键值*/
#define back_key 0x0B /*backspace键键值*/
#define dcbias_key 0x07 /*直流偏置键键值*/
#define trig_key 0x03 /*触发键键值*/
#define disp_format 0x08 /*disp/format键键值*/
#define meas_setup 0x04 /*meassetup键键值*/
#define catalog_sys 0x00 /*catalog/sys键键值*/
/**********************************************************
*获取键值
**********************************************************/
UINT8 get_key(void)
{
UINT8 key_code, row, column = 0, mask = 0x0;
*KeyAdd = mask;
while(1)
{
while(key_status_check()); /*判断有无键按下。*/
delay(5000); /*延迟一段时间。*/
if(key_status_check()) /*再次判断是否有键按下。*/
{
continue; /*若无,则继续循环;*/
}
else
{
break; /*若有,则中断循环。*/
}
}
/*分析按键所在的列号*/
mask = 0x0e;
while(1)
{
*KeyAdd = mask;
if(key_status_check()) /*判断该列是否有键按下。*/
{
mask = crol1(mask); /*若无,则mask移位,column加1,继续判断。*/
column++;
if(column >= 4)
column = 0;
continue;
}
else
{
break; /*若有,则中断循环*/
}
}
row = key_line_check(); /*计算按键所在的行号*/
while(!key_status_check()); /*等待键释放*/
/***********************************************/
/*计算键值:键值 = 行号 × 4 + 列号 */
/***********************************************/
switch(row)
{
case 0:
key_code = 0 + column;
break;
case 1:
key_code = 4 + column;
break;
case 2:
key_code = 8 + column;
break;
case 3:
key_code = 12 + column;
break;
case 4:
key_code = 16 + column;
break;
case 5:
key_code = 20 + column;
break;
case 6:
key_code = 24 + column;
break;
case 7:
key_code = 28 + column;
break;
}
return key_code;
}
#endif /*_KEYCON_H_*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -