首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RPi.GPIO中断调用函数的时间不足

RPi.GPIO中断调用函数的时间不足
EN

Stack Overflow用户
提问于 2018-11-08 08:21:37
回答 1查看 102关注 0票数 1

所以我正在尝试设计一个LCD屏幕,让它有一个菜单和一堆不同的功能,它应该有4个按钮。一个select,一个菜单,和一个向上和向下。现在我只是试着在菜单按钮上工作。我希望它始终显示时钟,除非按下菜单按钮。但是当我按下按钮时,它并没有在屏幕上停留5秒。我也不知道为什么它不会。我查找了RPi中断并跟踪了它,但它仍然不能保持运行。"hi“出现的时间甚至不到半秒。我也在使用raspberry pi spy的LCD库,如果需要,我可以链接它。我做的唯一一件事就是修改了一些计时设置来匹配我的显示器,并增加了一次向四行中的任何一行添加文本的能力,看起来我有一个20x4的显示器。如果有人能帮助我,我将不胜感激。

代码如下:

代码语言:javascript
复制
#!usr/bin/python3
import RPi.GPIO as GPIO
import time
import sys
sys.path.append('/home/pi/Downloads')
import lcd

GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
#GPIO.setup(33, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(11, GPIO.IN, pull_up_down=GPIO.PUD_UP)
#GPIO.setup(13, GPIO.IN, pull_up_down=GPIO.PUD_UP)
#GPIO.setup(15, GPIO.IN, pull_up_down=GPIO.PUD_UP)


lcd.lcd_init()

def start():
    for x in range(0,8):
        lcd.lcd_byte(lcd.LCD_LINE_2, lcd.LCD_CMD)
        lcd.lcd_string("[}>----TestOS----<{]", 1)
        time.sleep(0.1)
        lcd.lcd_byte(lcd.LCD_LINE_2, lcd.LCD_CMD)
        lcd.lcd_string("[}<>---TestOS-----{]", 1)
        time.sleep(0.1)
        lcd.lcd_byte(lcd.LCD_LINE_2, lcd.LCD_CMD)
        lcd.lcd_string("[}-<>--TestOS-----{]", 1)
        time.sleep(0.1)
        lcd.lcd_byte(lcd.LCD_LINE_2, lcd.LCD_CMD)
        lcd.lcd_string("[}--<>-TestOS-----{]", 1)
        time.sleep(0.1)
        lcd.lcd_byte(lcd.LCD_LINE_2, lcd.LCD_CMD)
        lcd.lcd_string("[}---<>TestOS-----{]", 1)
        time.sleep(0.1)
        lcd.lcd_byte(lcd.LCD_LINE_2, lcd.LCD_CMD)
        lcd.lcd_string("[}----<TestOS>----{]", 1)
        time.sleep(0.1)
        lcd.lcd_byte(lcd.LCD_LINE_2, lcd.LCD_CMD)
        lcd.lcd_string("[}-----TestOS<>---{]", 1)
        time.sleep(0.1)
        lcd.lcd_byte(lcd.LCD_LINE_2, lcd.LCD_CMD)
        lcd.lcd_string("[}-----TestOS-<>--{]", 1)
        time.sleep(0.1)
        lcd.lcd_byte(lcd.LCD_LINE_2, lcd.LCD_CMD)
        lcd.lcd_string("[}-----TestOS--<>-{]", 1)
        time.sleep(0.1)
        lcd.lcd_byte(lcd.LCD_LINE_2, lcd.LCD_CMD)
        lcd.lcd_string("[}-----TestOS---<>{]", 1)
        time.sleep(0.1)


    lcd.lcd_init()

    for x in range(0,120):
        lcd.lcd_byte(0xFF,True)

    time.sleep(5)
    lcd.lcd_init()


def Menu():
    lcd.lcd_init()
    lcd.lcd_byte(lcd.LCD_LINE_1, lcd.LCD_CMD)
    lcd.lcd_string("hi", 1)
    lcd.lcd_byte(lcd.LCD_LINE_2, lcd.LCD_CMD)
    lcd.lcd_string("hi", 1)
    time.sleep(5)

def clock():
    lcd.lcd_byte(lcd.LCD_LINE_1, lcd.LCD_CMD)
    lcd.lcd_string("+------------------+", 1)
    lcd.lcd_byte(lcd.LCD_LINE_2, lcd.LCD_CMD)
    lcd.lcd_string(time.strftime("|%I:%M %p          |"), 1)
    lcd.lcd_byte(lcd.LCD_LINE_3, lcd.LCD_CMD)
    lcd.lcd_string(time.strftime("|%a, %b %d, %Y |"), 1)
    lcd.lcd_byte(lcd.LCD_LINE_4, lcd.LCD_CMD)
    lcd.lcd_string("+------------------+", 1)
    time.sleep(1)
    lcd.lcd_byte(lcd.LCD_LINE_1, lcd.LCD_CMD)
    lcd.lcd_string("+------------------+", 1)
    lcd.lcd_byte(lcd.LCD_LINE_2, lcd.LCD_CMD)
    lcd.lcd_string(time.strftime("|%I %M %p          |"), 1)
    lcd.lcd_byte(lcd.LCD_LINE_3, lcd.LCD_CMD)
    lcd.lcd_string(time.strftime("|%a, %b %d, %Y |"), 1)
    lcd.lcd_byte(lcd.LCD_LINE_4, lcd.LCD_CMD)
    lcd.lcd_string("+------------------+", 1)
    time.sleep(1)

GPIO.add_event_detect(11, GPIO.FALLING, callback=Menu, bouncetime=100)

start()
try:
    while True:
        clock()

finally:
    lcd.lcd_init()
    lcd.GPIO.cleanup()
    GPIO.cleanup()

PS: lcd.lcd_init的双重功能是清除屏幕,这就是为什么我这么叫它的原因。

EN

回答 1

Stack Overflow用户

发布于 2018-11-09 16:08:34

在无限循环中运行的方法clock()总是用时间覆盖显示的文本。

当Menu()函数运行时,必须停止clock()方法。

我添加了全局变量菜单按下:

代码语言:javascript
复制
#!usr/bin/python3
import RPi.GPIO as GPIO
import time
import sys
sys.path.append('/home/pi/Downloads')
import lcd

GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
#GPIO.setup(33, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(11, GPIO.IN, pull_up_down=GPIO.PUD_UP)
#GPIO.setup(13, GPIO.IN, pull_up_down=GPIO.PUD_UP)
#GPIO.setup(15, GPIO.IN, pull_up_down=GPIO.PUD_UP)

menupressed = False

lcd.lcd_init()

def start():
    for x in range(0,8):
        lcd.lcd_byte(lcd.LCD_LINE_2, lcd.LCD_CMD)
        lcd.lcd_string("[}>----TestOS----<{]", 1)
        time.sleep(0.1)
        lcd.lcd_byte(lcd.LCD_LINE_2, lcd.LCD_CMD)
        lcd.lcd_string("[}<>---TestOS-----{]", 1)
        time.sleep(0.1)
        lcd.lcd_byte(lcd.LCD_LINE_2, lcd.LCD_CMD)
        lcd.lcd_string("[}-<>--TestOS-----{]", 1)
        time.sleep(0.1)
        lcd.lcd_byte(lcd.LCD_LINE_2, lcd.LCD_CMD)
        lcd.lcd_string("[}--<>-TestOS-----{]", 1)
        time.sleep(0.1)
        lcd.lcd_byte(lcd.LCD_LINE_2, lcd.LCD_CMD)
        lcd.lcd_string("[}---<>TestOS-----{]", 1)
        time.sleep(0.1)
        lcd.lcd_byte(lcd.LCD_LINE_2, lcd.LCD_CMD)
        lcd.lcd_string("[}----<TestOS>----{]", 1)
        time.sleep(0.1)
        lcd.lcd_byte(lcd.LCD_LINE_2, lcd.LCD_CMD)
        lcd.lcd_string("[}-----TestOS<>---{]", 1)
        time.sleep(0.1)
        lcd.lcd_byte(lcd.LCD_LINE_2, lcd.LCD_CMD)
        lcd.lcd_string("[}-----TestOS-<>--{]", 1)
        time.sleep(0.1)
        lcd.lcd_byte(lcd.LCD_LINE_2, lcd.LCD_CMD)
        lcd.lcd_string("[}-----TestOS--<>-{]", 1)
        time.sleep(0.1)
        lcd.lcd_byte(lcd.LCD_LINE_2, lcd.LCD_CMD)
        lcd.lcd_string("[}-----TestOS---<>{]", 1)
        time.sleep(0.1)


    lcd.lcd_init()

    for x in range(0,120):
        lcd.lcd_byte(0xFF,True)

    time.sleep(5)
    lcd.lcd_init()


def Menu():
    global menupressed
    menupressed = True
    lcd.lcd_init()
    lcd.lcd_byte(lcd.LCD_LINE_1, lcd.LCD_CMD)
    lcd.lcd_string("hi", 1)
    lcd.lcd_byte(lcd.LCD_LINE_2, lcd.LCD_CMD)
    lcd.lcd_string("hi", 1)
    time.sleep(5)
    menupressed = False

def clock():
    if(menupressed):
         return #when menu button is pressed, return - dont show nothing on display
    lcd.lcd_byte(lcd.LCD_LINE_1, lcd.LCD_CMD)
    lcd.lcd_string("+------------------+", 1)
    lcd.lcd_byte(lcd.LCD_LINE_2, lcd.LCD_CMD)
    lcd.lcd_string(time.strftime("|%I:%M %p          |"), 1)
    lcd.lcd_byte(lcd.LCD_LINE_3, lcd.LCD_CMD)
    lcd.lcd_string(time.strftime("|%a, %b %d, %Y |"), 1)
    lcd.lcd_byte(lcd.LCD_LINE_4, lcd.LCD_CMD)
    lcd.lcd_string("+------------------+", 1)
    time.sleep(1)
    lcd.lcd_byte(lcd.LCD_LINE_1, lcd.LCD_CMD)
    lcd.lcd_string("+------------------+", 1)
    lcd.lcd_byte(lcd.LCD_LINE_2, lcd.LCD_CMD)
    lcd.lcd_string(time.strftime("|%I %M %p          |"), 1)
    lcd.lcd_byte(lcd.LCD_LINE_3, lcd.LCD_CMD)
    lcd.lcd_string(time.strftime("|%a, %b %d, %Y |"), 1)
    lcd.lcd_byte(lcd.LCD_LINE_4, lcd.LCD_CMD)
    lcd.lcd_string("+------------------+", 1)
    time.sleep(1)

GPIO.add_event_detect(11, GPIO.FALLING, callback=Menu, bouncetime=100)

start()
try:
    while True:
        clock()

finally:
    lcd.lcd_init()
    lcd.GPIO.cleanup()
    GPIO.cleanup()

希望能对你有所帮助

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53199871

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档