树莓派可以很方便的拓展矩阵键盘用做人机交互,今天教大家如何驱动4*4矩阵键盘。
先贴上代码:
import time
class keypad(object):
KEYPAD=[
['1','2','3','*'],
['4','5','6','#'],
['7','8','9','$'],
['CLR','0','Set','OK']]
ROW =[12,16,20,21]
COLUMN =[6,13,19,26]
def __init__(self):
GPIO.cleanup()
GPIO.setmode(GPIO.BCM)
def getkey(self):
import RPi.GPIO as GPIO
#设置列输出低
for i in range(len(self.COLUMN)):
GPIO.setup(self.COLUMN[i],GPIO.OUT)
GPIO.output(self.COLUMN[i],GPIO.LOW)
#设置行上拉输入
for j in range(len(self.ROW)):
GPIO.setup(self.ROW[j],GPIO.IN,pull_up_down=GPIO.PUD_UP)
#检测行是否有键按下,有则读取行值(0~3)
RowVal=-1
for i in range(len(self.ROW)):
RowStatus=GPIO.input(self.ROW[i])
if RowStatus==GPIO.LOW:
RowVal=i
# print 'RowVal=%s' % RowVal
#若无键按下,返回
if RowVal<0 or RowVal>3:
self.exit()
return
#若第RowVal行有键按下,翻转输入输出模式
#第RowVal行输出高电平,
GPIO.setup(self.ROW[RowVal],GPIO.OUT)
GPIO.output(self.ROW[RowVal],GPIO.HIGH)
#列为下拉输入
for j in range(len(self.COLUMN)):
GPIO.setup(self.COLUMN[j],GPIO.IN,pull_up_down=GPIO.PUD_DOWN)
#读取按键所在列值
ColumnVal=-1
for i in range(len(self.COLUMN)):
ColumnStatus=GPIO.input(self.COLUMN[i])
if ColumnStatus==GPIO.HIGH:
ColumnVal=i
#等待按键松开
while GPIO.input(self.COLUMN[i])==GPIO.HIGH:
time.sleep(0.5)
# print 'ColumnVal=%s' % ColumnVal
#若无键按下,返回
if ColumnVal<0 or ColumnVal>3:
self.exit()
return
self.exit()
return self.KEYPAD[RowVal][ColumnVal]
def exit(self):
import RPi.GPIO as GPIO
for i in range(len(self.ROW)):
GPIO.setup(self.ROW[i],GPIO.IN,pull_up_down=GPIO.PUD_UP)
for j in range(len(self.COLUMN)):
GPIO.setup(self.COLUMN[j],GPIO.IN,pull_up_down=GPIO.PUD_UP)
if __name__='__main__':
kp=keypad()
key=None
while True:
key=kp.getkey()
if not key==None:
print 'You enter the key:',key
编程思路:假如S1键按下,先扫描行(列),即行输入,列输出高。此时接第一行的引脚必然会被拉高。设置接第一行的引脚为输出高,列输入。此时接第一列的引脚必然会被拉高。这样我们就得到了第一行第一列的按键被按下。