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显示的驱动。

我要赚赏金
