话说xpt2046 这个触控屏实在是太老了 但是也太经典了 2023年了 还拿个笔在电阻屏上戳戳戳。。。 没办法 哪里都有XPT2046这货 不废话了 上代码 好好看 好好学
# import libraries
import time
from machine import Pin
import espidf as esp
import lvgl as lv
from ili9XXX import ili9341, LANDSCAPE
from xpt2046 import xpt2046
import esp32
from micropython import const
import _thread
import machine
lv.init()
# init display
disp = ili9341(
miso=12,
mosi=13,
clk=14,
cs=15, dc=23,
rst=25, backlight=-1,
power=-1,
width=320,
height=240,
rot=LANDSCAPE
)
HRES = lv.scr_act().get_disp().driver.hor_res
VRES = lv.scr_act().get_disp().driver.ver_res
# touch calibrations stored in NVRAM
class TouchCalibration(object):
def __init__(self):
self._config = esp32.NVS('touch_cal')
try:
self._x0 = self._config.get_i32('x0')
except OSError:
self._x0 = 0
try:
self._y0 = self._config.get_i32('y0')
except OSError:
self._y0 = 0
try:
self._x1 = self._config.get_i32('x1')
except OSError:
self._x1 = HRES
try:
self._y1 = self._config.get_i32('y1')
except OSError:
self._y1 = VRES
self._is_dirty = False
def save(self):
if self._is_dirty:
self._config.commit()
self._is_dirty = False
@property
def x0(self):
return self._x0
@x0.setter
def x0(self, value):
self._x0 = value
self._config.set_i32('x0', value)
self._is_dirty = True
@property
def y0(self):
return self._y0
@y0.setter
def y0(self, value):
self._y0 = value
self._config.set_i32('y0', value)
self._is_dirty = True
@property
def x1(self):
return self._x1
@x1.setter
def x1(self, value):
self._x1 = value
self._config.set_i32('x1', value)
self._is_dirty = True
@property
def y1(self):
return self._y1
@y1.setter
def y1(self, value):
self._y1 = value
self._config.set_i32('y1', value)
self._is_dirty = True
@property
def is_calibrated(self):
return not (
self.x0 == 0 and
self.y0 == 0 and
self.x1 == HRES and
self.y1 == VRES
)
touch_calibration = TouchCalibration()
# use same SPI as display, init touch
touch = xpt2046(
spihost=esp.HSPI_HOST,
cs=26,
transpose=False,
cal_x0=touch_calibration.x0,
cal_x1=touch_calibration.x1,
cal_y0=touch_calibration.y0,
cal_y1=touch_calibration.y1
)
# enable backlight
backlight = Pin(2, Pin.OUT)
backlight.value(1)
def main():
def event_handler(evt):
code = evt.get_code()
if code == lv.EVENT.CLICKED:
print("Clicked event seen")
elif code == lv.EVENT.VALUE_CHANGED:
print("Value changed seen")
# create a simple button
btn1 = lv.btn(lv.scr_act())
# attach the callback
btn1.add_event_cb(event_handler, lv.EVENT.ALL, None)
btn1.align(lv.ALIGN.CENTER, 0, -40)
label = lv.label(btn1)
label.set_text("Button")
# create a toggle button
btn2 = lv.btn(lv.scr_act())
# attach the callback
# btn2.add_event_cb(event_handler,lv.EVENT.VALUE_CHANGED,None)
btn2.add_event_cb(event_handler, lv.EVENT.ALL, None)
btn2.align(lv.ALIGN.CENTER, 0, 40)
btn2.add_flag(lv.obj.FLAG.CHECKABLE)
# btn2.set_height(lv.SIZE_CONTENT)
label = lv.label(btn2)
label.set_text("Toggle")
label.center()
if touch_calibration.is_calibrated:
main()
else:
# Run calibration
class Tpcal_point:
def __init__(self, x, y, name):
self.display_coordinates = lv.point_t({'x': x, 'y': y})
self.touch_coordinate = None
self.name = name
def __repr__(self):
return "%s: (%d, %d)" % (
self.name,
self.touch_coordinate.x,
self.touch_coordinate.y
)
CIRCLE_SIZE = const(20)
CIRCLE_OFFSET = const(20)
TP_MAX_VALUE = const(10000)
LV_COORD_MAX = const((1 |