/*****************************************************************************
* 描 述 : 8x8矩阵扫描函数
* 入 参 : 无
* 返回值 : 哪个按键按下的对应值
*****************************************************************************/
#include "88juzhen.h"
#include "delay.h"
#include "UART.h"
#define ROW1 P27
#define ROW2 P26
#define ROW3 P25
#define ROW4 P24
#define ROW5 P23
#define ROW6 P22
#define ROW7 P21
#define ROW8 P20
#define COL1 P02
#define COL2 P03
#define COL3 P12
#define COL4 P13
#define COL5 P14
#define COL6 P15
#define COL7 P16
#define COL8 P17
/*
#define COL1 P27
#define COL2 P26
#define COL3 P25
#define COL4 P24
#define COL5 P23
#define COL6 P22
#define COL7 P21
#define COL8 P20
#define ROW1 P17
#define ROW2 P16
#define ROW3 P15
#define ROW4 P14
#define ROW5 P13
#define ROW6 P12
#define ROW7 P03
#define ROW8 P02
*/
#define DELAY_TIME 30
u8 KeyScan(void)
{
u16 X_temp,Y_temp,temp;
u16 temp_ff00,temp_00ff;
X_temp=0xFF00; //列值赋初值
Y_temp=0x00FF; //行值赋初值
P2M1 &= 0x00; P2M0 |= 0xFF; //设置P2.0~P2.7为强推挽输出
P0M1 &= 0xF3; P0M0 |= 0x0C; //设置P0.2~P0.3为强推挽输出
P1M1 &= 0x03; P1M0 |= 0xFC; //设置P1.2~P1.7为强推挽输出
ROW1=1;ROW2=1;ROW3=1;ROW4=1;ROW5=1;ROW6=1;ROW7=1;ROW8=1; //行置高
COL1=0;COL2=0;COL3=0;COL4=0;COL5=0;COL6=0;COL7=0;COL8=0; //列置低
//所用到行IO口配置为输入,进行检测
delay_ms(15);
P2M1 &= 0x00; P2M0 &= 0x00; //设置P2.0~P2.7为准双向口
delay_ms(15);
if(ROW1 == 0) //检测行1电平是否为低电平
{
delay_ms(DELAY_TIME);
if(ROW1 == 0)
Y_temp &= 0x00FE;
}
if(ROW2 == 0) //检测行2电平是否为低电平
{
delay_ms(DELAY_TIME);
if(ROW2 == 0)
Y_temp &= 0x00FD;
}
if(ROW3 == 0) //检测行3电平是否为低电平
{
delay_ms(DELAY_TIME);
if(ROW3 == 0)
Y_temp &= 0x00FB;
}
if(ROW4 == 0) //检测行4电平是否为低电平
{
delay_ms(DELAY_TIME);
if(ROW4 == 0)
Y_temp &= 0x00F7;
}
if(ROW5 == 0) //检测行4电平是否为低电平
{
delay_ms(DELAY_TIME);
if(ROW5 == 0)
Y_temp &= 0x00EF;
}
if(ROW6 == 0) //检测行4电平是否为低电平
{
delay_ms(DELAY_TIME);
if(ROW6 == 0)
Y_temp &= 0x00DF;
}
if(ROW7 == 0) //检测行4电平是否为低电平
{
delay_ms(DELAY_TIME);
if(ROW7 == 0)
Y_temp &= 0x00BF;
}
if(ROW8 == 0) //检测行4电平是否为低电平
{
delay_ms(DELAY_TIME);
if(ROW8 == 0)
Y_temp &= 0x007F;
}
P2M1 &= 0x00; P2M0 |= 0xFF; //设置P2.0~P2.7为强推挽输出
P0M1 &= 0xF3; P0M0 |= 0x0C; //设置P0.2~P0.3为强推挽输出
P1M1 &= 0x03; P1M0 |= 0xFC; //设置P1.2~P1.7为强推挽输出
ROW1=0;ROW2=0;ROW3=0;ROW4=0;ROW5=0;ROW6=0;ROW7=0;ROW8=0; //行置低
COL1=1;COL2=1;COL3=1;COL4=1;COL5=1;COL6=1;COL7=1;COL8=1; //列置高
//所用到列IO口配置为输入,进行检测
delay_ms(15);
P0M1 &= 0xF3; P0M0 &= 0xF3; //设置P0.2~P0.3为准双向口
P1M1 &= 0x03; P1M0 &= 0x03; //设置P1.2~P1.7为准双向口
delay_ms(15);
if(COL1 == 0) //检测列1电平是否为低电平
{
delay_ms(DELAY_TIME);
if(COL1 == 0)
X_temp &= 0xEF00;
}
if(COL2 == 0) //检测列2电平是否为低电平
{
delay_ms(DELAY_TIME);
if(COL2 == 0)
X_temp &= 0xDF00;
}
if(COL3 == 0) //检测列3电平是否为低电平
{
delay_ms(DELAY_TIME);
if(COL3 == 0)
X_temp &= 0xBF00;
}
if(COL4 == 0) //检测列4电平是否为低电平
{
delay_ms(DELAY_TIME);
if(COL4 == 0)
X_temp &= 0x7F00;
}
if(COL5 == 0) //检测列3电平是否为低电平
{
delay_ms(DELAY_TIME);
if(COL5 == 0)
X_temp &= 0xFE00;
}
if(COL6 == 0) //检测列4电平是否为低电平
{
delay_ms(DELAY_TIME);
if(COL6 == 0)
X_temp &= 0xFD00;
}
if(COL7 == 0) //检测列3电平是否为低电平
{
delay_ms(DELAY_TIME);
if(COL7 == 0)
X_temp &= 0xFB00;
}
if(COL8 == 0) //检测列4电平是否为低电平
{
delay_ms(DELAY_TIME);
if(COL8 == 0)
X_temp &= 0xF700;
}
//将行值和列值合并,得到按键对应的编码值,该值与16个按键一一对应
temp = X_temp|Y_temp;
temp = ~temp;
temp_ff00 = temp/4096*16 + temp/256%16;
//temp_ff00 = temp>>8;
temp_00ff = temp/16*16 + temp%16;
//TX1_write2buff(temp_ff00);TX1_write2buff(temp_00ff); delay_ms(250); delay_ms(250); delay_ms(250); delay_ms(250); delay_ms(250); delay_ms(250);
//将按键检测的原始编码值解析对应按键值信息
switch (temp)
{
case 0x1001:return 1; //1
case 0x2001:return 2; //2
case 0x4001:return 3; //3
case 0x8001:return 4; //4
case 0x0101:return 5; //5
case 0x0201:return 6; //6
case 0x0401:return 7; //7
case 0x0801:return 8; //8
case 0x1002:return 9; //9
case 0x2002:return 10; //
case 0x4002:return 11; //
case 0x8002:return 12; //
case 0x0102:return 13; //
case 0x0202:return 14; //
case 0x0402:return 15; //
case 0x0802:return 16; //
case 0x1004:return 17; //
case 0x2004:return 18; //
case 0x4004:return 19; //
case 0x8004:return 20; //
case 0x0104:return 21; //
case 0x0204:return 22; //
case 0x0404:return 23; //
case 0x0804:return 24; //
case 0x1008:return 25; //
case 0x2008:return 26; //
case 0x4008:return 27; //
case 0x8008:return 28; //
case 0x0108:return 29; //
case 0x0208:return 30; //
case 0x0408:return 31; //
case 0x0808:return 32; //
case 0x1010:return 33; //
case 0x2010:return 34; //
case 0x4010:return 35; //
case 0x8010:return 36; //
case 0x0110:return 37; //
case 0x0210:return 38; //
case 0x0410:return 39; //
case 0x0810:return 40; //
case 0x1020:return 41; //
case 0x2020:return 42; //
case 0x4020:return 43; //
case 0x8020:return 44; //
case 0x0120:return 45; //
case 0x0220:return 46; //
case 0x0420:return 47; //
case 0x0820:return 48; //
case 0x1040:return 49; //
case 0x2040:return 50; //
case 0x4040:return 51; //
case 0x8040:return 52; //
case 0x0140:return 53; //
case 0x0240:return 54; //
case 0x0440:return 55; //
case 0x0840:return 56; //
case 0x1080:return 57; //
case 0x2080:return 58; //
case 0x4080:return 59; //
case 0x8080:return 60; //
case 0x0180:return 61; //
case 0x0280:return 62; //
case 0x0480:return 63; //
case 0x0880:return 64; //
default: return 0;
}
}
矩阵8X8键盘
矩阵键盘和595接口
总共64颗带灯按钮,可自定义设置多按键组合触发,板载MOS管可驱动电磁锁