樹莓派的矩陣鍵盤掃描程式,python開發
樹莓派可以很方便的拓展矩陣鍵盤用做人機互動,今天教大家如何驅動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鍵按下,先掃描行(列),即行輸入,列輸出高。此時接第一行的引腳必然會被拉高。設定接第一行的引腳為輸出高,列輸入。此時接第一列的引腳必然會被拉高。這樣我們就得到了第一行第一列的按鍵被按下。