勘智k210开发板需要外接一个4*4数字矩阵键盘。语言用python开发

勘智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;

}

}

}

}

}