基于msp430f5438的矩阵按键扫描法度模范[讲义]
基于msp430F5438的矩阵按键扫描程序
** 功能: 矩阵按键扫描程序
*************************************************/
#include "msp430x54x.h"
/*************************************************
**宏定义
*************************************************/
#define uint unsigned int // 定义数据
类型缩写
#define uchar unsigned char
#define KEY_IN P4IN // 定义端
口寄存器
#define KEY_OUT P4OUT
#define KEY_DIR P4DIR
#define B0 (0x01) // 位定义
#define B1 (0x02)
#define B2 (0x04)
#define B3 (0x08)
#define B4 (0x10)
#define B5 (0x20)
#define B6 (0x40)
#define B7 (0x80)
/*************************************************
**函数申明
*************************************************/
uchar Scan(void); // 矩阵键盘扫描
void Delay(uint delay_num); // 延时函数
uint Translate(uchar code); // 扫描码翻译
/*************************************************
**全局变量定义
*************************************************/
uchar key_code; // 返回的键盘扫描码
uint key_value; // 键盘对应的数字
const uchar key_table[17]={ // 扫描码译码
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
0xFF, // 无按键按下 // 高四位为扫描行,低四位为扫描列
0x7E, // K1
0x7D, // K2
0x7B, // K3
0x77, // K4
0xBE, // K5
0xBD, // K6
0xBB, // K7
0xB7, // K8
0xDE, // K9
0xDD, // K10
0xDB, // K11
0xD7, // K12
0xEE, // K13
0xED, // K14
0xEB, // K15
0xE7, // K16
};
/*************************************************
**函数(模块)名称: main()
**功能: 调用对键盘扫描程序,初始化I/O口
**调用函数清单: scan(),Translate() **调用本函数清单: 无
**输入参数: 无
**输出参数: 无
**函数返回值说明: 无
**使用的资源 看门狗 I/O端口模块
**其它说明: 无
*************************************************/
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // 停止看门狗
KEY_DIR = (B7 + B6 + B5 + B4); // 设置IO
口高4位为输出,低4位为输入
KEY_OUT = 0x00; // IO口高4位输出低电平
while(1)
{
key_code = Scan(); // 调用扫描程序,返回扫描码
key_value = Translate(key_code); // 调用扫描码翻译函数,返回键盘数字
if(key_value != 0) // 是否有键按下
{
_NOP(); // 在这里设置断点,观察扫描码和键盘数字
}
}
}
/*************************************************
**函数(模块)名称: Scan()
**功能: 查询按键状态,返回键值 **调用函数清单: Delay();
**调用本函数清单: 无
**输入参数: 无
**输出参数: 键盘扫描码 **函数返回值说明: 无
**使用的资源 I/O端口
**其它说明:
*************************************************/
uchar Scan(void)
{
uint i;
uchar col_scan = 0; // 行扫描变量
uchar key_code = 0xFF; // 扫描码
KEY_OUT = 0x00; // 4行全部置零,判断是否有键按下
if((KEY_IN & 0x0F) != 0x0F) // 判断是否有键按下
{
Delay(5000); // 延时20毫秒键盘消抖
if((KEY_IN & 0x0F) != 0x0F) // 再次判断按键是否有效
{
key_code = KEY_IN & 0x0F; // 保存列扫描码
col_scan = B7; // 先扫描第一行
for(i=4 ;i>0; i--) // 扫描行
{
KEY_OUT = 0xFF & (~col_scan); // 扫描的相
应行置低电平
if((KEY_IN & 0x0F) != 0x0F) // 是否这一行有键按下
{
break;
}
col_scan = col_scan >> 1; // 扫描下一行
}
col_scan = (~col_scan) & 0xF0; // 得到行扫描码
key_code |= col_scan; // 得到完整键盘扫描码
KEY_OUT = 0x00; // 4行全部置零,判断是否有键按下
while((KEY_IN & 0x0F) != 0x0F); // 等待按键释放
}
}
return (key_code); // 返回键值
}
/*************************************************
**函数(模块)名称: Translate
**功能: 扫描码翻译
**调用函数清单: 无
**调用本函数清单: 无
**输入参数: 无
**输出参数: 键盘对应的数字,如果输出为0说明无键按下
**函数返回值说明: 无
**使用的资源 无
**其它说明:
*************************************************/
uint Translate(uchar code)
{
uchar key_cd = code; // 扫描码
uint key_val; // 键盘数
字
for(key_val=0; key_val<=16; key_val++) // 查找扫描码表,得到键盘数字
{
if(key_table[key_val] == key_cd) // 扫描码是否相符
{
break;
}
}
return (key_val);
}
/*************************************************
**函数(模块)名称: Delay()
**功能: 延时
**调用函数清单: 无
**调用本函数清单: 无
**输入参数: 延时循环次数
**输出参数: 无
**函数返回值说明: 无
**使用的资源 无
**其它说明:
*************************************************/
void Delay(uint delay_num)
{
uint i;
for(i=delay_num; i>0; i--); // 循环延时
}