LCD 屏幕
本文旨在详细介绍如何使用 Luckfox Pico 来驱动 0.96inch 屏幕(与Plus的区别在于右侧的引脚编号不同),我们采用的是微雪的 Pico-LCD-0.96 液晶显示屏,屏幕的具体参数可以查看 Pico-LCD-0.96 的产品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-LCD-0.96 可以实现显示,以及摇杆、按键检测功能。要实现这些功能,我们需要在程序中定义引脚以及实现 SPI 通讯,再通过交叉编译工具对程序进行编译。接下来,我们一起来看看具体的实现步骤。
引脚定义
在
DEV_Config.h中定义引脚编号#define LCD_DC (34)
#define LCD_CS (48)
#define LCD_RST (51)
#define LCD_BL (4)
/*PICO*/
#define KEY_UP_PIN 55 //摇杆向上引脚编号
#define KEY_DOWN_PIN 134
#define KEY_LEFT_PIN 137
#define KEY_RIGHT_PIN 131
#define KEY_PRESS_PIN 54
#define KEY1_PIN 57
#define KEY2_PIN 136
#define KEY3_PIN 16
#define KEYA_PIN 57
#define KEYB_PIN 136
#define KEYX_PIN 130
#define KEYY_PIN 132在
DEV_Config.h中添加读取引脚电平宏定义#define GET_KEY_UP DEV_Digital_Read(KEY_UP_PIN) //读取摇杆向上引脚电平
#define GET_KEY_DOWN DEV_Digital_Read(KEY_DOWN_PIN)
#define GET_KEY_LEFT DEV_Digital_Read(KEY_LEFT_PIN)
#define GET_KEY_RIGHT DEV_Digital_Read(KEY_RIGHT_PIN)
#define GET_KEY_PRESS DEV_Digital_Read(KEY_PRESS_PIN)
#define GET_KEY1 DEV_Digital_Read(KEY1_PIN)
#define GET_KEY2 DEV_Digital_Read(KEY2_PIN)
#define GET_KEY3 DEV_Digital_Read(KEY3_PIN)
#define GET_KEYA DEV_Digital_Read(KEYA_PIN)
#define GET_KEYB DEV_Digital_Read(KEYB_PIN)
#define GET_KEYX DEV_Digital_Read(KEYX_PIN)
#define GET_KEYY DEV_Digital_Read(KEYY_PIN)在
DEV_GPIO_Init函数中对GPIO进行初始化static void DEV_GPIO_Init(void)
{
DEV_GPIO_Mode(LCD_CS, 1);
DEV_GPIO_Mode(LCD_RST, 1);
DEV_GPIO_Mode(LCD_DC, 1);
DEV_GPIO_Mode(LCD_BL, 1);
DEV_GPIO_Mode(KEY_UP_PIN, 0); //摇杆向上引脚初始化为输入
DEV_GPIO_Mode(KEY_DOWN_PIN, 0);
DEV_GPIO_Mode(KEY_LEFT_PIN, 0);
DEV_GPIO_Mode(KEY_RIGHT_PIN, 0);
DEV_GPIO_Mode(KEY_PRESS_PIN, 0);
DEV_GPIO_Mode(KEY1_PIN, 0);
DEV_GPIO_Mode(KEY2_PIN, 0);
DEV_GPIO_Mode(KEY3_PIN, 0);
DEV_GPIO_Mode(KEYA_PIN, 0);
DEV_GPIO_Mode(KEYB_PIN, 0);
DEV_GPIO_Mode(KEYX_PIN, 0);
DEV_GPIO_Mode(KEYY_PIN, 0);
LCD_CS_1;
LCD_BL_1;
}在
Pico_LCD_0in96_test.c中对引脚电平进行判断/*key*/
while(1)
{
/*判断引脚电平是否为低电平*/
if(GET_KEY_UP == 0){
/*在此添加摇杆向上后的操作*/
}else{
/*在此添加摇杆没有向上时的操作*/
}
if(GET_KEY_RIGHT == 0){
/*在此添加摇杆向右后的操作*/
}else{
/*在此添加摇杆没有向右时的操作*/
}
}
SPI通讯
在
DEV_ModuleInit函数中申请SPI资源DEV_HARDWARE_SPI_begin("/dev/spidev0.0");初始化
在
main函数中调用PICO_LCD_0IN96_Init函数对LCD进行初始化void PICO_LCD_0IN96_Init(void)
{
PICO_LCD_0IN96_Reset();
//************* Start Initial Sequence **********//
PICO_LCD_0IN96_Write_Command(0x11);//Sleep exit
DEV_Delay_ms(120);
PICO_LCD_0IN96_Write_Command(0x21);
PICO_LCD_0IN96_Write_Command(0x21);
PICO_LCD_0IN96_Write_Command(0xB1);
PICO_LCD_0IN96_WriteData_Byte(0x05);
PICO_LCD_0IN96_WriteData_Byte(0x3A);
...
}发送数据
PICO_LCD_0IN96_Write_Command函数中将LCD_DC引脚拉低,表示发送命令,再调用DEV_SPI_WriteByte函数向LCD发送数据static void PICO_LCD_0IN96_Write_Command(UBYTE data)
{
DEV_Digital_Write(LCD_DC, 0);
DEV_SPI_WriteByte(data);
}PICO_LCD_0IN96_WriteData_Byte函数中将LCD_DC引脚置高,表示发送数据,再调用DEV_SPI_WriteByte函数向LCD发送数据static void PICO_LCD_0IN96_WriteData_Byte(UBYTE data)
{
DEV_Digital_Write(LCD_DC, 1);
DEV_SPI_WriteByte(data);
}
交叉编译
指定交叉编译工具
用户需要将整个 "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_BIN = ./bin
OBJ_C = $(wildcard ${DIR_EPD}/*.c ${DIR_Config}/*.c ${DIR_GUI}/*.c ${DIR_Examples}/*.c ${DIR_FONTS}/*.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)
${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)
${DIR_BIN}/%.o:$(DIR_Config)/%.c
$(CC) $(CFLAGS) -c $< -o $@ $(LIB)
clean :
rm $(DIR_BIN)/*.*
rm $(TARGET)编译程序
修改完
Makefile后,使用 make 命令对程序进行交叉编译。luckfox@luckfox:~/c$ make交叉编译成功后,将在当前目录下生成可执行文件
main。luckfox@luckfox:~/c$ ls
bin examples lib main Makefile pic readme_CN.txt readme_EN.txt
3. 实现效果
将编译好的文件传输到开发板
先将整个 "c" 文件夹从虚拟机传输到 Windows,再通过 TFTP 或 ADB 传输到开发板,将文件从 Windows 通过 ADB 将文件传输到开发板的步骤如下:
adb push 文件所在路径 开发板存储路径
eg:(将当前目录下的c文件夹传输到开发板的根目录)
adb push c /运行程序
修改
main文件的操作权限后运行程序#cd c/
#chmod 777 main
#./main 0.96实验现象
GUI界面

图片显示

摇杆、按键操作
