1.简介
贪吃蛇游戏设计中需要根据PIM580(320X240 2.0")上的按键动作来操纵蛇的位置移动,我们可以使用PIM580模块的A/B/X/Y 按键来操纵蛇的移动方向,从PIM580的硬件原理图可以看出四个物理按键的连接关系如下:
按键 | PICO 连接端口 |
SWA | P12 |
SWB | P13 |
SWX | P14 |
SWY | P15 |
2.基于rt-thread按键采集
本次活动的已经提供了基于keil 的pico 工程模板,可以直接使用,个人开发比较喜欢在rtos 的环境下进行开发,查看rt-thread 的master 代码已经支持了pico 的bsp,本次开发计划基于rt-thread 在此基础上将keil工程的lcd 驱动代码移植到rt-thread 系统上再次基础上来继续开发贪吃蛇的游戏。
2.1 rt-thread 的适配
从rt-thread(https://github.com/RT-Thread/rt-thread) 拉取master 代码,在/master/bsp/raspberry-pico 目录下执行“pkgs --update” 拉取pico sdk 软件包,然后执行menuconfig 配置串口console 用于和系统交互,配置时应确保和PIM580的针脚避免冲突,默认使用的GP0/GP1 UART0 的端口配置,和PIM580 的连接不发生冲突。
根据上述配置,通过scons 命令即可完成系统的编译,生成以下的uf2的下载镜像。
下载后系统可以正常启动,看到了熟悉的启动log
2.2 按键采集
在上述系统的main task 的入口添加如下代码采集按键状态并打印。
/* * Copyright (c) 2006-2021, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2021-01-28 flybreak first version */ #include <rtthread.h> #include <rtdevice.h> #define LED_PIN 6 #define PM580_SWA_PIN 12 #define PM580_SWB_PIN 13 #define PM580_SWX_PIN 14 #define PM580_SWY_PIN 15 int main(void) { rt_uint8_t swa; rt_uint8_t swb; rt_uint8_t swx; rt_uint8_t swy; rt_pin_mode(LED_PIN, PIN_MODE_OUTPUT); rt_pin_mode(PM580_SWA_PIN, PIN_MODE_INPUT_PULLUP); rt_pin_mode(PM580_SWB_PIN, PIN_MODE_INPUT_PULLUP); rt_pin_mode(PM580_SWX_PIN, PIN_MODE_INPUT_PULLUP); rt_pin_mode(PM580_SWY_PIN, PIN_MODE_INPUT_PULLUP); swa = rt_pin_read(PM580_SWA_PIN); swb = rt_pin_read(PM580_SWB_PIN); swx = rt_pin_read(PM580_SWX_PIN); swy = rt_pin_read(PM580_SWY_PIN); while (1) { if(rt_pin_read(PM580_SWA_PIN) != swa) { rt_thread_mdelay(100); if(rt_pin_read(PM580_SWA_PIN) != swa) { swa = rt_pin_read(PM580_SWA_PIN); rt_kprintf("swa %sn",(swa == 0) ? "Down" : "UP"); } } if(rt_pin_read(PM580_SWB_PIN) != swb) { rt_thread_mdelay(100); if(rt_pin_read(PM580_SWB_PIN) != swb) { swb = rt_pin_read(PM580_SWB_PIN); rt_kprintf("swb %sn",(swb == 0) ? "Down" : "UP"); } } if(rt_pin_read(PM580_SWX_PIN) != swx) { rt_thread_mdelay(100); if(rt_pin_read(PM580_SWX_PIN) != swx) { swx = rt_pin_read(PM580_SWX_PIN); rt_kprintf("swx %sn",(swx == 0) ? "Down" : "UP"); } } if(rt_pin_read(PM580_SWY_PIN) != swy) { rt_thread_mdelay(100); if(rt_pin_read(PM580_SWY_PIN) != swy) { swy = rt_pin_read(PM580_SWY_PIN); rt_kprintf("swy %sn",(swy == 0) ? "Down" : "UP"); } } rt_thread_mdelay(10); } }
从以下的 PIM 580 的四组按键已经可以按照预期的采集到按下抬起的事件了,下一步计划移植适配LCD显示的驱动。