/*
该程序用于获取4*4薄膜按键的数字
*/
/*--------------------------------------------------------------------------1--------------------------------------------------------------------------*/
/*--------------------------------------------------------------------本程序所引用库--------------------------------------------------------------------*/
// 无
/*--------------------------------------------------------------------------2--------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------变量声明-----------------------------------------------------------------------*/
/******************************常量声明******************************/
#define Num_Rows 4 // 4行
#define Num_Cols 4 // 4列
#define Membrane_Debounce_Time 200 // 薄膜按键消抖时间
/******************************引脚声明******************************/
// 4*4薄膜按键正对用户,从左往右分别为行-列,对应引脚分别为 10,9,8,7, 6,5,4,3
const int Row_Pins[Num_Rows] = { 10, 9, 8, 7 };
const int Col_Pins[Num_Cols] = { 6, 5, 4, 3 };
/******************************变量声明******************************/
// 为键盘上的每个位置赋值
const char Key_Map[Num_Rows][Num_Cols] = {
{ '1', '2', '3', 'A' },
{ '4', '5', '6', 'B' },
{ '7', '8', '9', 'C' },
{ '*', '0', '#', 'D' }
};
/******************************对象声明******************************/
// 无
/*--------------------------------------------------------------------------3--------------------------------------------------------------------------*/
/*-------------------------------------------------------------------setup()程序初始化------------------------------------------------------------------*/
void setup() {
/******************************启动串口通讯******************************/
Serial.begin(9600); // 初始化串口通信,并设置波特率为9600
/******************************设置引脚模式******************************/
for (int row = 0; row < Num_Rows; row++) {
pinMode(Row_Pins[row], INPUT); // 设置 行 为 输入模式
digitalWrite(Row_Pins[row], HIGH); // 先设定为HIGH
}
for (int col = 0; col < Num_Cols; col++) {
pinMode(Col_Pins[col], OUTPUT); // 设置 列 为 输出模式
digitalWrite(Col_Pins[col], HIGH); // 先设定为HIGH
}
}
/*--------------------------------------------------------------------------4--------------------------------------------------------------------------*/
/*-------------------------------------------------------------------loop()基础循环体-------------------------------------------------------------------*/
void loop() {
char key = getkey();
if (key != 0) { // 这里是ASCII码不为0,不是字符0
Serial.println(key);
}
}
/*--------------------------------------------------------------------------5--------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------函数定义-----------------------------------------------------------------------*/
/*
函数:得到4*3薄膜按键的对应字符
返回值:按钮按下对应的字符
*/
char getkey() {
char key = 0;
for (int col = 0; col < Num_Cols; col++) { // 遍历3列
digitalWrite(Col_Pins[col], LOW); // 将每一列变成LOW(列视为接地)
for (int row = 0; row < Num_Rows; row++) { // 每一列遍历4行
if (digitalRead(Row_Pins[row]) == LOW) { // 检测每一行是否有按钮按下,按下为LOW
delay(Membrane_Debounce_Time); // 防抖
while (digitalRead(Row_Pins[row]) == LOW) // 按着就保持为LOW,直到松手
;
key = Key_Map[row][col]; // 找到按钮按下的值
}
}
digitalWrite(Col_Pins[col], HIGH); // 将列变回HIGH
}
return key;
}