7、触摸屏实验
大约 4 分钟
例程代码
import touchscreen as ts
from machine import I2C
import lcd, image
from board import board_info
from fpioa_manager import fm
from maix import GPIO
fm.register(board_info.BOOT_KEY, fm.fpioa.GPIO1, force=True)
btn_clear = GPIO(GPIO.GPIO1, GPIO.IN)
lcd.init()
i2c = I2C(I2C.I2C0, freq=400000, scl=24, sda=25)
ts.init(i2c)
#ts.calibrate()
lcd.clear()
img = image.Image()
status_last = ts.STATUS_IDLE
x_last = 0
y_last = 0
draw = False
while True:
(status,x,y) = ts.read()
print(status, x, y)
if draw:
img.draw_line((x_last, y_last, x, y))
if status_last!=status:
if (status==ts.STATUS_PRESS or status == ts.STATUS_MOVE):
draw = True
else:
draw = False
status_last = status
lcd.display(img)
x_last = x
y_last = y
if btn_clear.value() == 0:
img.clear()
实验准备
- 通过usb线将K210与电脑连接。
- 打开CanMV IDE,执行上面的例程代码。
实验结果
- 运行之后,K210不断处理触摸屏的输入信息,根据触摸状态绘制触摸轨迹在液晶显示屏上显示。LCD显示屏会根据触摸轨迹绘制出一条白线,并且在串行终端中打印出触摸点的坐标信息,直到摁下boot按键清空屏幕。
![](/assets/img/intelligence/K210/K210_4_8.png)
![](/assets/img/intelligence/K210/K210_4_9.png)
例程代码讲解
- 导入运行例程所需的模块。touchscreen模块(别名为ts)用于处理触摸屏相关操作,I2C模块用于配置和使用集成电路间总线(I2C)通信,lcd和image模块可能用于液晶显示屏(LCD)的显示以及图像相关操作,board_info、fpioa_manager(别名为fm)和maix.GPIO用于与开发板的引脚配置、功能映射以及通用输入输出(GPIO)操作相关的功能。
import touchscreen as ts
from machine import I2C
import lcd, image
from board import board_info
from fpioa_manager import fm
from maix import GPIO
- 2.通过fm.register函数将开发板上的BOOT_KEY引脚配置为GPIO1,并强制进行该配置。然后创建了一个名为btn_clear的GPIO对象,将其设置为输入模式,用于后续检测该按钮是否被按下以执行清空屏幕图像的操作。
fm.register(board_info.BOOT_KEY, fm.fpioa.GPIO1, force=True)
btn_clear = GPIO(GPIO.GPIO1, GPIO.IN)
- 对液晶显示屏进行初始化操作,配置了一个 I2C 总线对象i2c,使用的是I2C0通道,设置了通信频率为 400000Hz,并且指定了时钟线(SCL)引脚为 24,数据线(SDA)引脚为 25。将触摸屏初始化并挂载到之前配置好的 I2C0 总线上,使得可以通过该 I2C 总线与触摸屏进行通信。
lcd.init()
i2c = I2C(I2C.I2C0, freq=400000, scl=24, sda=25)
ts.init(i2c)
- 注释掉了ts.calibrate()这行,暂时不需要进行触摸屏校准操作。将液晶显示屏清空,准备后续的绘制操作。创建了一个image.Image对象img,用于在屏幕上绘制图像。初始化了一些变量:status_last初始化为触摸屏的空闲状态(ts.STATUS_IDLE),x_last和y_last初始化为 0,用于记录上一次触摸点的坐标,draw初始化为False,用于控制是否进行绘制操作。
#ts.calibrate() # 触摸屏校准
lcd.clear() # 将屏幕清空
img = image.Image()
status_last = ts.STATUS_IDLE
x_last = 0
y_last = 0
draw = False
- 进入无限循环。
while True:
- 读取触摸屏的状态以及当前触摸点的坐标信息,打印出触摸屏的状态以及触摸点的坐标。
(status, x, y) = ts.read()
print(status, x, y)
- 如果draw为True,表示当前处于可绘制状态,根据上一次触摸点坐标(x_last, y_last)和当前触摸点坐标(x, y),在图像img上绘制一条直线,以记录触摸轨迹。
if draw:
img.draw_line((x_last, y_last, x, y))
- 如果当前触摸屏状态与上一次记录的状态不同,如果当前状态是按下或者移动状态,将draw设置为True,意味着开始或继续绘制触摸轨迹,否则将draw设置为False,即停止绘制触摸轨迹,比如触摸点抬起时,无论如何,更新上一次记录的触摸屏状态为当前状态。
if status_last!= status:
if (status == ts.STATUS_PRESS or status == ts.STATUS_MOVE):
draw = True
else:
draw = False
status_last = status
- 将绘制好触摸轨迹的图像img显示在液晶显示屏上。
lcd.display(img)
- 更新上一次触摸点的坐标为当前触摸点的坐标,以便下次绘制时能正确连接轨迹。
x_last = x
y_last = y
- 如果draw为True,表示当前处于可绘制状态,根据上一次触摸点坐标(x_last, y_last)和当前触摸点坐标(x, y),在图像img上绘制一条直线,以记录触摸轨迹。
if draw:
img.draw_line((x_last, y_last, x, y))
- 检测清空按钮是否被按下,如果按下(btn_clear.value() == 0),则清空图像img,以便重新进行触摸绘制操作。
if btn_clear.value() == 0:
img.clear()