勘智k210开发板需要外接一个数字矩阵键盘,实现键盘输入数字做一个密码锁。
如果是直接连接IO口的键盘,直接做IO口电平扫描就可以了啊,如果是有协议的键盘,比如uart的,那就直接接串口通信就行。
勘智开发板是什么?之前电赛学长用的是Arduino与k210, k210倒是有过了解,4*4矩阵应该是要用到ASCLL码
主要的代码如下:
u8 KEY_Scan(u8 mode)
{
u8 l=0,h=0;
static u8 key_con=1; //按键按松开标志
if(mode) key_con=1; //支持连按
KEY_ROW_out1=0; //行输出置低
KEY_ROW_out2=0;
KEY_ROW_out3=0;
KEY_ROW_out4=0;
KEY_Init1();
KEY_ROL_out1=1; //列输出置高
KEY_ROL_out2=1;
KEY_ROL_out3=1;
KEY_ROL_out4=1;
if(key_con&&(KEY_ROW_in1==1||KEY_ROW_in2==1||KEY_ROW_in3==1||KEY_ROW_in4==1)) //检测按下的按键所在行
{
delay_ms(10);
key_con=0;
if(KEY_ROW_in1==1) h=1; //返回行值
else if(KEY_ROW_in2==1) h=2;
else if(KEY_ROW_in3==1) h=3;
else if(KEY_ROW_in4==1) h=4;
}
else if(KEY_ROW_in1==0&&KEY_ROW_in2==0&&KEY_ROW_in3==0&&KEY_ROW_in4==0) //无按键按下
{
key_con=1;
return 0;
}
KEY_ROL_out1=0; //二次扫描 列输出置低
KEY_ROL_out2=0;
KEY_ROL_out3=0;
KEY_ROL_out4=0;
KEY_Init2();
KEY_ROW_out1=1; //行输出置高
KEY_ROW_out2=1;
KEY_ROW_out3=1;
KEY_ROW_out4=1;
if(KEY_ROL_in1==1||KEY_ROL_in2==1||KEY_ROL_in3==1||KEY_ROL_in4==1) //检测按下的按键所在列
{
if(KEY_ROL_in1==1)
{ if(h==4) l='*';
else l=(h-1)*3+49;
}
else if(KEY_ROL_in2==1)
{
if(h==4) l=48;
else l=(h-1)*3+50;
}
else if(KEY_ROL_in3==1)
{
if(h==4) l='#';
else l=(h-1)*3+51;
}
else if(KEY_ROL_in4==1)
{
l=64+h;
}
}
return l;
}
好像不同品牌有不同的开发接口,具体提供4*4数字矩阵键盘的品牌
如果键盘提供商能提供接口就更好了。
下面的代码是黑莓键盘。
from gtts import gTTS
import pygame
from io import BytesIO
import time
from pad4pi import rpi_gpio
KEYPAD = [
["1", "2", "3", "A"],
["4", "5", "6", "B"],
["7", "8", "9", "C"],
["*", "0", "#", "D"]
]
ROW_PINS = [5, 6, 13, 19]
COL_PINS = [12, 16, 20, 21]
factory = rpi_gpio.KeypadFactory()
keypad = factory.create_keypad(keypad=KEYPAD, row_pins=ROW_PINS, col_pins=COL_PINS)
def say(text):
tts = gTTS(text=text, slow=False, lang='en-us', lang_check=False)
fp = BytesIO()
tts.write_to_fp(fp)
fp.seek(0)
pygame.mixer.init()
pygame.mixer.music.load(fp)
pygame.mixer.music.play()
def printKey(key):
print(key)
say(key)
# printKey will be called each time a keypad button is pressed
keypad.registerKeyPressHandler(printKey)
try:
while(True):
time.sleep(0.2)
except:
keypad.cleanup()
可以参考如下代码
from gtts import gTTS
import pygame
from io import BytesIO
import time
from pad4pi import rpi_gpio
KEYPAD = [
["1", "2", "3", "A"],
["4", "5", "6", "B"],
["7", "8", "9", "C"],
["*", "0", "#", "D"]
]
ROW_PINS = [5, 6, 13, 19]
COL_PINS = [12, 16, 20, 21]
factory = rpi_gpio.KeypadFactory()
keypad = factory.create_keypad(keypad=KEYPAD, row_pins=ROW_PINS, col_pins=COL_PINS)
def say(text):
tts = gTTS(text=text, slow=False, lang='en-us', lang_check=False)
fp = BytesIO()
tts.write_to_fp(fp)
fp.seek(0)
pygame.mixer.init()
pygame.mixer.music.load(fp)
pygame.mixer.music.play()
def printKey(key):
print(key)
say(key)
# printKey will be called each time a keypad button is pressed
keypad.registerKeyPressHandler(printKey)
try:
while(True):
time.sleep(0.2)
except:
keypad.cleanup()
(1. 4×4矩阵键盘识别处理
(2. 每个按键有它的行值和列值 ,行值和列值的组合就是识别这个按键的编码。矩阵的行线和列线分别通过两并行接口和CPU通信。每个按键的状态同样需变成数字量“0”和“1”,开关的一端(列线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的。键盘处理程序的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么;还要消除按键在闭合或断开时的抖动。两个并行口中,一个输出扫描码,使按键逐行动态接地,另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能。
#include
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
unsigned char temp;
unsigned char key;
unsigned char i,j;
void main(void)
{undefined
while(1)
{undefined
P3=0xff;
P3_4=0;
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{undefined
for(i=50;i>0;i--)
for(j=200;j>0;j--);
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{undefined
temp=P3;
temp=temp & 0x0f;
switch(temp)
{undefined
case 0x0e:
key=7;
break;
case 0x0d:
key=8;
break;
case 0x0b:
key=9;
break;
case 0x07:
key=10;
break;
}
temp=P3;
P1_0=~P1_0;
P0=table[key];
temp=temp & 0x0f;
while(temp!=0x0f)
{undefined
temp=P3;
temp=temp & 0x0f;
}
}
}
P3=0xff;
P3_5=0;
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{undefined
for(i=50;i>0;i--)
for(j=200;j>0;j--);
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{undefined
temp=P3;
temp=temp & 0x0f;
switch(temp)
{undefined
case 0x0e:
key=4;
break;
case 0x0d:
key=5;
break;
case 0x0b:
key=6;
break;
case 0x07:
key=11;
break;
}
temp=P3;
P1_0=~P1_0;
P0=table[key];
temp=temp & 0x0f;
while(temp!=0x0f)
{undefined
temp=P3;
temp=temp & 0x0f;
}
}
}
P3=0xff;
P3_6=0;
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{undefined
for(i=50;i>0;i--)
for(j=200;j>0;j--);
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{undefined
temp=P3;
temp=temp & 0x0f;
switch(temp)
{undefined
case 0x0e:
key=1;
break;
case 0x0d:
key=2;
break;
case 0x0b:
key=3;
break;
case 0x07:
key=12;
break;
}
temp=P3;
P1_0=~P1_0;
P0=table[key];
temp=temp & 0x0f;
while(temp!=0x0f)
{undefined
temp=P3;
temp=temp & 0x0f;
}
}
}
P3=0xff;
P3_7=0;
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{undefined
for(i=50;i>0;i--)
for(j=200;j>0;j--);
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{undefined
temp=P3;
temp=temp & 0x0f;
switch(temp)
{undefined
case 0x0e:
key=0;
break;
case 0x0d:
key=13;
break;
case 0x0b:
key=14;
break;
case 0x07:
key=15;
break;
}
temp=P3;
P1_0=~P1_0;
P0=table[key];
temp=temp & 0x0f;
while(temp!=0x0f)
{undefined
temp=P3;
temp=temp & 0x0f;
}
}
}
}
}