跳到主要内容

ResTouch LCD

本文旨在详细介绍如何使用 Luckfox Pico Plus 来驱动 3.5inch 屏幕,我们采用的是微雪的 Pico-ResTouch-LCD-3.5 电阻触摸屏扩展板,屏幕的具体参数可以查看 Pico-ResTouch-LCD-3.5 的产品wiki。您可以下载镜像文件和示例程序直接使用或按照下面步骤自己配置。

1. 引脚配置

  • Luckfox Pico / Plus / Pro / Max 系列主要参考了 Raspberry Pi Pico 的引脚布局,通过引脚配置可以兼容部分 Raspberry Pi Pico 的外设。

  • Luckfox Pico 不同型号支持的兼容设备列表参考Luckfox-Pico_support-List
  • 兼容设备选项本质上是多种引脚配置的组合,可以简化配置的步骤
  • Luckfox Pico 在 ubuntu 下由于没有 io 命令直接配置寄存器,配置兼容设备 Pico-LCD 时引脚无法配置为默认上拉,无法正常控制按键
  • 启动兼容设备配置时会覆盖原有配置,需要取消兼容设备到 Advanced Options 界面关闭启动的设备功能即可

2.示例程序

Pico-ResTouch-LCD-3.5 电阻触摸屏扩展板板载电阻式触摸控制芯片 XPT2046 和 Micro SD 卡槽,可以实现显示、触摸以及SD卡读取功能。要实现这些功能,我们需要在程序中定义引脚以及实现 SPI 通讯,再通过交叉编译工具对程序进行编译。接下来,我们一起来看看具体的实现步骤。

  1. 引脚定义

  2. DEV_Config.h 中定义引脚编号

#define LCD_DC_PIN (34)
#define LCD_CS_PIN (48) //定义LCD片选引脚编号
#define LCD_RST_PIN (57)
#define LCD_BL_PIN (4)
#define TP_CS_PIN (102)
#define TP_IRQ_PIN (103)
#define SD_CS_PIN (97)
  1. DEV_Config.h 中添加控制引脚电平宏定义
//LCD
#define LCD_CS_0 DEV_Digital_Write(LCD_CS_PIN,0) //LCD片选引脚拉低
#define LCD_CS_1 DEV_Digital_Write(LCD_CS_PIN,1) //LCD片选引脚置高
#define LCD_RST_0 DEV_Digital_Write(LCD_RST_PIN,0)
#define LCD_RST_1 DEV_Digital_Write(LCD_RST_PIN,1)
#define LCD_DC_0 DEV_Digital_Write(LCD_DC_PIN,0)
#define LCD_DC_1 DEV_Digital_Write(LCD_DC_PIN,1)
#define LCD_BL_0 DEV_Digital_Write(LCD_BL_PIN,0)
#define LCD_BL_1 DEV_Digital_Write(LCD_BL_PIN,1)

//TP
#define TP_CS_0 DEV_Digital_Write(TP_CS_PIN,0)
#define TP_CS_1 DEV_Digital_Write(TP_CS_PIN,1)

//SD
#define SD_CS_0 DEV_Digital_Write(SD_CS_PIN,0)
#define SD_CS_1 DEV_Digital_Write(SD_CS_PIN,1)
  1. DEV_GPIO_Init 函数中对GPIO进行初始化
static void DEV_GPIO_Init(void)
{
DEV_GPIO_Mode(LCD_CS_PIN, 1); //LCD片选引脚初始化为输出
DEV_GPIO_Mode(LCD_RST_PIN, 1);
DEV_GPIO_Mode(LCD_DC_PIN, 1);
DEV_GPIO_Mode(LCD_BL_PIN, 1);
DEV_GPIO_Mode(TP_CS_PIN, 1);
DEV_GPIO_Mode(SD_CS_PIN, 1);
DEV_GPIO_Mode(TP_IRQ_PIN, 0);

LCD_CS_1; //LCD片选引脚置高
TP_CS_1;
SD_CS_1;
LCD_BL_0;
}
  1. SPI通讯

  2. DEV_ModuleInit 函数中申请SPI资源

DEV_HARDWARE_SPI_begin("/dev/spidev0.0");
  1. 初始化
LCD_SCAN_DIR lcd_scan_dir = SCAN_DIR_DFT; //选择旋转角度

SD_Init(); //Micro SD
LCD_Init(lcd_scan_dir,800); //LCD
TP_Init(lcd_scan_dir); //触摸IC

示例程序同时也适配Pico-ResTouch-LCD-2.8电阻触摸屏扩展板,在程序中通过调用 LCD_Read_Id 读取id值对LCD型号进行判断

static void LCD_InitReg(void)
{
id = LCD_Read_Id();
if(LCD_2_8 == id){
//2inch8LCD初始化
}else{
//3inch5LCD初始化
}
}

LCD_Read_Id 函数中调用 DEV_HARDWARE_SPI_TransferByte 函数向LCD发送和接收数据

uint8_t LCD_Read_Id(void)
{
uint8_t reg = 0xDC;
uint8_t tx_val = 0x00;
uint8_t rx_val;

DEV_Digital_Write(LCD_CS_PIN, 0); //开始通讯,LCD片选引脚拉低
DEV_Digital_Write(LCD_DC_PIN, 0); //将LCD_DC引脚拉低,表示发送命令
DEV_HARDWARE_SPI_TransferByte(reg); //向LCD发送命令
rx_val = DEV_HARDWARE_SPI_TransferByte(tx_val); //向LCD发送命令并接收返回值
DEV_Digital_Write(LCD_CS_PIN, 1); //结束通讯,LCD片选引脚置高

return rx_val; //返回读取到的数据
}
  1. 交叉编译

  2. 指定交叉编译工具

用户需要将整个 "c" 文件夹移到虚拟机,并编辑 "c" 文件夹中的 Makefile 文件,修改其中的 CC= 后的内容以指定交叉编译工具。

将 Makefile 中 <SDK Directory>修改为自己的 SDK 路径,如 /home/luckfox/luckfox-pico/

DIR_Config = ./lib/Config
DIR_EPD = ./lib/LCD
DIR_FONTS = ./lib/Fonts
DIR_GUI = ./lib/GUI
DIR_Examples = ./examples
DIR_FATFS = ./lib/Fatfs
DIR_SDCARD = ./lib/Sdcard
DIR_BIN = ./bin

OBJ_C = $(wildcard ${DIR_EPD}/*.c ${DIR_Config}/*.c ${DIR_GUI}/*.c ${DIR_Examples}/*.c ${DIR_FONTS}/*.c ${DIR_FATFS}/*.c ${DIR_SDCARD}/*.c)
OBJ_O = $(patsubst %.c,${DIR_BIN}/%.o,$(notdir ${OBJ_C}))

TARGET = main

USELIB = USE_DEV_LIB
DEBUG = -D $(USELIB)
ifeq ($(USELIB), USE_DEV_LIB)
LIB = -lpthread -lm
endif


CC = <SDK Directory>/tools/linux/toolchain/arm-rockchip830-linux-uclibcgnueabihf/bin/arm-rockchip830-linux-uclibcgnueabihf-gcc
MSG = -g -O0 -Wall
CFLAGS += $(MSG) $(DEBUG)

${TARGET}:${OBJ_O}
$(CC) $(CFLAGS) $(OBJ_O) -o $@ $(LIB)

${DIR_BIN}/%.o:$(DIR_Examples)/%.c
$(CC) $(CFLAGS) -c $< -o $@ -I $(DIR_Config) -I $(DIR_GUI) -I $(DIR_EPD)

${DIR_BIN}/%.o:$(DIR_EPD)/%.c
$(CC) $(CFLAGS) -c $< -o $@ -I $(DIR_Config) -I $(DIR_GUI) -I $(DIR_FATFS)

${DIR_BIN}/%.o:$(DIR_FONTS)/%.c
$(CC) $(CFLAGS) -c $< -o $@

${DIR_BIN}/%.o:$(DIR_GUI)/%.c
$(CC) $(CFLAGS) -c $< -o $@ -I $(DIR_Config) -I $(DIR_EPD) -I $(DIR_Examples) -I $(DIR_FONTS)

${DIR_BIN}/%.o:$(DIR_Config)/%.c
$(CC) $(CFLAGS) -c $< -o $@ $(LIB)

${DIR_BIN}/%.o:$(DIR_SDCARD)/%.c
$(CC) $(CFLAGS) -c $< -o $@ -I $(DIR_Config)

${DIR_BIN}/%.o:$(DIR_FATFS)/%.c
$(CC) $(CFLAGS) -c $< -o $@ -I $(DIR_Config) -I $(DIR_EPD) -I $(DIR_FONTS) -I $(DIR_SDCARD) -I $(DIR_GUI)

clean :
rm $(DIR_BIN)/*.*
rm $(TARGET)
  1. 编译程序

修改完 Makefile 后,使用 make 命令对程序进行交叉编译。

luckfox@luckfox:~/c$ make

交叉编译成功后,将在当前目录下生成可执行文件 main

luckfox@luckfox:~/c$ ls
bin examples lib main Makefile pic readme_CN.txt readme_EN.txt

3.实现效果

  1. 将编译好的文件传输到开发板

先将整个 "c" 文件夹从虚拟机传输到 Windows,再通过 TFTP 或 ADB 传输到开发板,将文件从 Windows 通过 ADB 将文件传输到开发板的步骤如下:

adb push 文件所在路径 开发板存储路径

eg:(将当前目录下的c文件夹传输到开发板的根目录)
adb push c /
  1. 运行程序

修改 main 文件的操作权限后运行程序

#cd c/
#chmod 777 main
#./main
  1. 实验现象

GUI界面

image

读取SD卡图片并显示

image

触摸界面

image