注:此单片机型号为 STC15F2K60S2.
矩阵按键
原理
首先,把跳线帽连接1、2,使其进入矩阵按键模式。
此时,即为矩阵按键模式。
按键原理 :
由图可看出,行接口有:P30、P31、P32、P33.
——————列接口有:P44、P42、P35、P34.
以S7举例,假设要检测S7被按下,则首先要设置其左端为低电平,即设置P44为低电平并且其余端口保持高电平,再检测其右端即P30是否为低电平即可。
(原理与独立按键相似,只是要自己设置一段为低电平。)
代码
来源:蓝桥杯官方。
unsigned char Key_Read(void)
{
unsigned int Key_New;
unsigned char Key_Val;
P44 = 0; P42 = 1; P35 = 1; P34 = 1; // 第1列
Key_New = P3;
P44 = 1; P42 = 0; // 第2列
Key_New = (Key_New<<4) | (P3&0x0f);/*这里需要注意,先将P3与一个0x0f,将前面的清零,
然后再将结果与前值左移四位的数相或,或是有1则为1,其他都不变,
所以前四项保持不变,后四项看是否按下而改变。*/
P42 = 1; P35 = 0; // 第3列
Key_New = (Key_New<<4) | (P3&0x0f);
P35 = 1; P34 = 0; // 第4列
Key_New = (Key_New<<4) | (P3&0x0f);
switch(~Key_New) //因为每次只按下一个按键,就算你以为同时按下,实际上仍为依次按下。
{
case 0x8000: Key_Val = 4; break; // S4 0111 1111 1111 1111
case 0x4000: Key_Val = 5; break; // S5 1011 1111 1111 1111
case 0x2000: Key_Val = 6; break; // S6 1101 1111 1111 1111
case 0x1000: Key_Val = 7; break; // S7 1110 1111 1111 1111
case 0x0800: Key_Val = 8; break; // S8 1111 0111 1111 1111
case 0x0400: Key_Val = 9; break; // S9 1111 1011 1111 1111
case 0x0200: Key_Val = 10; break; // S10
case 0x0100: Key_Val = 11; break; // S11
case 0x0080: Key_Val = 12; break; // S12
case 0x0040: Key_Val = 13; break; // S13
case 0x0020: Key_Val = 14; break; // S14
case 0x0010: Key_Val = 15; break; // S15
case 0x0008: Key_Val = 16; break; // S16
case 0x0004: Key_Val = 17; break; // S17
case 0x0002: Key_Val = 18; break; // S18
case 0x0001: Key_Val = 19; break; // S19
default: Key_Val = 0;
}
return Key_Val;
}
自己写的代码
key.h
#ifndef __KEY_H
#define __KEY_H
#include "STC15F2K60S2.H"