2016-11-27 66 views
0

這是我第一次在這個論壇上提問。如果在發佈此問題時出現錯誤,請提及。該程序不停止在Python中的函數(while true loop)

我正在通過使用Python做菜單功能。在代碼中,我使用def來分類鍵盤和顯示內容等功能。以下是代碼:

#import 
import RPi.GPIO as GPIO 
import time 

def main():  
    # Initialise display 
    lcd_init() 
    definition() 
    while True: 
     lcd_string("Press any key to",LCD_LINE_1) 
     lcd_string("continue",LCD_LINE_2) 
     keypad_init() 
     key_pad() 
     time.sleep(0.5) 
     menu_page() 
     key_pad1() 
     time.sleep(0.5) 

def keypad_init(): 
    for j in range(4): 
     GPIO.setup(col[j],GPIO.OUT) 
     GPIO.output(col[j],1) 

    for i in range(4): 
     GPIO.setup(row[i], GPIO.IN, pull_up_down = GPIO.PUD_UP) 

def definition(): 
    global row 
    row=[2,3,4,17] 
    global col 
    col=[27,22,10,9] 
    global MATRIX 
    MATRIX=[[1,2,3,'A'], 
     [4,5,6,'B'], 
     [7,8,9,'C'], 
     ['Yes',0,'No','D']] 
def key_pad(): 
    # Keypad Function 
    while True: 
     for j in range(4): 
       GPIO.output(col[j],0) 
       for i in range(4): 
         if GPIO.input(row[i])==0: 
           return 
           while(GPIO.input(row[i])==0): 
             pass 
       GPIO.output(col[j],1) 

def key_pad1(): 
    # Keypad Function 
    global pagecount 
    while True: 
     for j in range(4): 
       GPIO.output(col[j],0) 
       for i in range(4): 
         if GPIO.input(row[i])==0: 
           pagecount = MATRIX[i][j] 
           return 
           while(GPIO.input(row[i])==0): 
             pass 
       GPIO.output(col[j],1) 

def menu_page(): 
     lcd_string("1.Diagnose",LCD_LINE_1) 
     lcd_string("2.BMI Calculator",LCD_LINE_2) 

def option_choose(): 
    if pagecount ==1: 
     lcd_string("Diagnose Start!",LCD_LINE_1) 
     lcd_string(" ",LCD_LINE_2) 
    if pagecount ==2: 
     lcd_string("BMI Calculate!",LCD_LINE_1) 
     lcd_string(" ",LCD_LINE_2) 

def lcd_init(): 
    # Initialise display 

問題是程序不停在key_pad()和key_pad1()處。它只是繼續循環,並改變要顯示的東西。我想顯示「按任意鍵繼續」,直到按下一個鍵。請幫我解決這個問題。如果問題不明確,請說明。非常感謝你。 PS。我使用的樹莓派的硬件部分

+3

你可以只留下你的代碼的相關位?我猜所有的常量和定義都與你問題的本質無關。 – naktinis

+0

請提供[mcve]。 –

+0

ok,對不起 –

回答

0

而不是使用while True循環等待一個按鍵,你可以使用GPIO.add_event_detect方法:

def keypad_init(): 
    for j in range(4): 
     GPIO.setup(col[j],GPIO.OUT) 
     GPIO.output(col[j],1) 

    for i in range(4): 
     GPIO.setup(row[i], GPIO.IN, pull_up_down = GPIO.PUD_UP) 
     GPIO.add_event_detect(row[i], GPIO.BOTH, callback=keyPressed) 

def keyPressed: 
    # Do your action here 

您還可以使用GPIO.event_detected()方法,這取決於你想要什麼去做。 看看https://sourceforge.net/p/raspberry-gpio-python/wiki/Inputs/

+0

GPIO.event_detected()應該放在用作中斷的函數上嗎? –

+0

不,您不必在'GPIO.add_event_detect'的回調函數中使用'GPIO.event_detected()'。捕捉事件有兩種不同的方式。看看GPIO文檔中的例子。 –