esp32 s3+lv_micropython物理鍵盤響應(yīng)程序
#目前esp32 s3+lv_micropython v1.91無法使用lvgl的一些宏定義,一使用就會程序出錯,只能根據(jù)文檔把宏定義改為對應(yīng)的數(shù)字,如LV_KEY_NEXT等定義(對應(yīng)的是數(shù)字9)都不能用,或者它改了名字我用不了。這里記錄一下吧。我使用gpio的p0來做實驗。
from machine import Pin, SoftSPI,SPI
from st7789 import ST7789
from st7789 import CYAN
from st7789 import BLACK
from st7789 import BLUE
#hspi = SPI(2, baudrate=80000000, polarity=1, sck=Pin(14), mosi=Pin(13), miso=Pin(12))
'''
scl 14
sda 13
rst 9
dc 8
cs 11
blk 7
'''
sck=Pin(14, Pin.OUT)
mosi=Pin(13, Pin.OUT)
miso=Pin(12, Pin.OUT)
rst =Pin(9, Pin.OUT)
dc=Pin(8, Pin.OUT)
cs=Pin(11, Pin.OUT)
blk=Pin(7, Pin.OUT)
#rst.on() #一定要off才有反映
cs.off()
blk.on()
#display = ST7789(hspi,320,240,reset=Pin(9),dc=Pin(8))
#display.fill(CYAN)
import lvgl as lv
from ili9XXX import st7789
import fs_driver
from espidf import VSPI_HOST
import time
import machine
print(str(machine.freq()))
machine.freq(240000000)
print(str(machine.freq()))
#gc.collect()
#0.這個是關(guān)鍵的初始化函數(shù)
disp=st7789(
? ? mosi=13,
? ? clk=14,
? ? cs=11,
? ? dc=8,
? ? rst=9,
? ? mhz=80,
? ? spihost=VSPI_HOST,
? ? factor=16,#這個參數(shù)一定要設(shè)置為16,這樣才能支持240x280的屏幕
? ? #hybrid=True,
? ? width=240,
? ? height=280,
? ? start_x=0,
? ? start_y=20,
? ? double_buffer=1,
? ? rot=0,
? ? #invert=True,
? ? #half_duplex=False,
? ? #initialize=True
? ? )
def set_value(indic, v):
? ? meter.set_indicator_value(indic, v)
# 1. 創(chuàng)建顯示screen對象。將需要顯示的組件添加到這個screen才能顯示
#scr = lv.obj()? # scr====> screen 屏幕
fs_drv = lv.fs_drv_t()
fs_driver.fs_register(fs_drv, 'S')
#先定義界面元素
scr = lv.scr_act()
btn = lv.btn(scr)
btn1=lv.btn(scr)
btn2=lv.btn(scr)
label =lv.label(btn)
label1 =lv.label(btn1)
label2 =lv.label(btn2)
#btn.set_pos(10, 10)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? # Set its position
btn.set_size(120, 50)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? # Set its size
btn.align(lv.ALIGN.TOP_MID,0,20)
#btn1.set_pos(10, 80)? ?
btn1.set_size(120, 50)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? # Set its size
btn1.align(lv.ALIGN.CENTER,0,0)
btn2.set_size(120, 50)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? # Set its size
btn2.align(lv.ALIGN.BOTTOM_MID,0,-20)
label.set_text("Enter")? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?# Set the labels text
label.center()
label1.set_text("Cancel")? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?# Set the labels text
label1.center()
label2.set_text("Err")? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?# Set the labels text
label2.center()
def keypad_getkey() -> int:
? ? return (p0.value())
def keypad_read(indev_drv,data) -> int:
? ? ? ? k0=Pin(0, Pin.IN, Pin.PULL_UP)
? ? ? ? if (k0.value() == 0):
? ? ? ? ? ? data.state = 1 #key pressed
? ? ? ? ? ? data.key = 9 #next obj
? ? ? ? else:
? ? ? ? ? ? data.state = 0 #key released
? ? ? ? #可以看到lvgl會自動進入這個函數(shù)讀取鍵盤的數(shù)值的【關(guān)鍵】
? ? ? ? #程序貌似已經(jīng)做了消抖,每10ms檢測一次鍵盤作出響應(yīng)
? ? ? ? #data.state = lv.INDEV_STATE.PRESSED
? ? ? ? #data.key = lv.KEY_ENTER[8]
def keypad_init():
? ? Pin(0, Pin.IN, Pin.PULL_UP)
? ??
keypad_init()
indev_drv=lv.indev_drv_t()
indev_drv.init()
indev_drv.type=lv.INDEV_TYPE.KEYPAD
indev_drv.read_cb = keypad_read
indev=indev_drv.register()
print(indev_drv)
indev.enable(True)
print(indev)
g=lv.group_create()
print(g)
indev.set_group(g)
g.add_obj(btn2)
g.add_obj(btn)
g.add_obj(btn1)
g.focus_prev()#有反應(yīng)
g.focus_next()