2016-11-27 3 views
0

Это мой первый вопрос, задаваемый вопросом в этом форуме. Если есть ошибки при публикации этого вопроса, пожалуйста, сообщите об этом.Программа не останавливается на функции (while true loop) в Python

Я выполняю функцию меню с помощью 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. Я использую Raspberry Pi для аппаратной части

+3

Можете ли вы оставить только соответствующие биты вашего кода? Я предполагаю, что все константы и определения не имеют отношения к сути вашего вопроса. – naktinis

+0

Пожалуйста, предоставьте [mcve]. –

+0

ОК, извините за это –

ответ

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.event_detected()' внутри функции обратного вызова 'GPIO.add_event_detect'. Это два разных способа поймать событие. Взгляните на примеры документации GPIO. –

Смежные вопросы