3.8 keypad控制RGB灯
一、实验目的
本节课主要学习K210的拨轮开关keypad控制RGB灯。
二、实验准备
1.实验元件
拨轮开关keypad、RGB灯
2.元件特性
拨轮开关keypad具有三个通道,分别是L:表示向左滚动、M:表示按下,R:表示向右滚动。每一次只能操作一个通道,并且keypad在释放状态下,三个通道都是高电平,如果其中一个通道被按下时,对应的IO口电平会变成低电平。可以理解为keypad是三个按键组合在一起,但是每次只能使用其中一个按键。
拨轮开关一般用于低压电路,具有滑块动作灵活、性能稳定可靠的特点。主要用于工业以及一些家用电器上,如电视机,彩电、电脑、数控机床、主动化操控设备等运用。
3.硬件连接
K210开发板出厂默认已经焊接好RGB灯和拨轮开关keypad。RGB灯R连接的是IO6,G连接的是IO7, B连接的是IO8。keypad_left连接的是IO1,keypad_middle连接的是IO2,keypad_right连接的是IO3。
4.SDK中对应API功能
对应的头文件 gpiohs.h
前面已经介绍过gpiohs中的函数功能,这里就不再赘述。
三、实验原理
拨轮开关keypad是通过拨动开关柄使电路接通或断开,从而达到切换电路的目的,拨轮开关的原理是经过人为的操作,控制对应电路接通,这里的作用是接通GND,使IO口电平变为低电平,松开时弹簧自动复位的过程。
四、实验过程
1.首先根据上面的硬件连接引脚图,K210的硬件引脚和软件功能使用的是FPIOA映射关系。
2. 在使用RGB灯前需要初始化,也就是把RGB灯的软件GPIO设置为输出模式。
3.然后关闭RGB灯,同样是设置RGB灯的GPIO为高电平则可以让RGB灯熄灭。
4.初始化keypad,设置GPIO为上拉输入模式。
5.接下来是扫描keypad的状态,先读取keypad三个通道的GPIO状态,然后检测是否向左滚动,如果是则让RGB亮红灯,其中msleep(10)延迟10毫秒是起到消抖的作用。之所以要消抖,是因为按键在按下或者松开的时候,电平从高变低或者从低变高的过程不是立即变化的,而是有变化过程的,所以需要消抖处理。
6.检测keypad是否被按下,如果是则RGB点亮绿灯,否则绿灯熄灭。
7.检测keypad是否向右滚动,如果是则RGB点亮蓝灯,否则蓝灯熄灭。
8.最后是一个while(1)循环,扫描keypad的状态控制RGB灯。
9.编译调试,烧录运行
把本课程资料中的keypad复制到SDK中的src目录下,然后进入build目录,运行以下命令编译。
cmake .. -DPROJ=keypad -G "MinGW Makefiles"
make
编译完成后,在build文件夹下会生成keypad.bin文件。
使用type-C数据线连接电脑与K210开发板,打开kflash,选择对应的设备,再将程序固件烧录到K210开发板上。
五、实验现象
当拨动keypad向左滚动时,RGB亮红灯,松开则熄灭;当拨动keypad向右滚动时,RGB亮蓝灯,松开同样熄灭;当按下keypad时,RGB亮绿灯,松开同样熄灭。每次只能控制RGB亮一种颜色,不能亮多种颜色。
六、实验总结
1.keypad的内部原理其实是三个按键,只不过同一时间只能触发一个按键按下。
2.keypad读取GPIO电平的方法与按键是一样的,所以它也支持中断处理的方式。
3.keypad操作简单,具有弹簧复位的功能,实际操作很方便。
附:API对应的头文件 gpiohs.h
设置GPIO驱动模式。
void gpiohs_set_drive_mode(uint8_t pin, gpio_drive_mode_t mode)
参数名称 | 描述 | 输入输出 |
pin | GPIO管脚 | 输入 |
mode | GPIO驱动模式 | 输入 |
无。
设置GPIO管脚值。
void gpiohs_set_pin(uint8_t pin, gpio_pin_value_t value)
参数名称 | 描述 | 输入输出 |
pin | GPIO管脚 | 输入 |
value | GPIO值 | 输入 |
无。
获取GPIO管脚值。
gpio_pin_value_t gpiohs_get_pin(uint8_t pin)
参数名称 | 描述 | 输入输出 |
pin | GPIO管脚 | 输入 |
获取的GPIO管脚值。
设置高速GPIO中断触发模式。
void gpiohs_set_pin_edge(uint8_t pin, gpio_pin_edge_t edge)
参数名称 | 描述 | 输入输出 |
pin | GPIO管脚 | 输入 |
edge | 中断触发方式 | 输入 |
无。
设置高速GPIO的中断回调函数。
void gpiohs_set_irq(uint8_t pin, uint32_t priority, void(*func)());
参数名称 | 描述 | 输入输出 |
pin | GPIO管脚 | 输入 |
priority | 中断优先级 | 输入 |
func | 中断回调函数 | 输入 |
无。
设置高速GPIO的中断回调函数。
void gpiohs_irq_register(uint8_t pin, uint32_t priority, plic_irq_callback_t callback, void *ctx)
参数名称 | 描述 | 输入输出 |
pin | GPIO管脚 | 输入 |
priority | 中断优先级 | 输入 |
plic_irq_callback_t | 中断回调函数 | 输入 |
ctx | 回调函数参数 | 输入 |
无。
注销GPIOHS中断。
void gpiohs_irq_unregister(uint8_t pin)
参数名称 | 描述 | 输入输出 |
pin | GPIO管脚 | 输入 |
无。
相关数据类型、数据结构定义如下:
· gpio_drive_mode_t:GPIO驱动模式。
· gpio_pin_value_t:GPIO值。
· gpio_pin_edge_t:GPIO边沿触发模式。
GPIO驱动模式。
typedef enum _gpio_drive_mode
{
GPIO_DM_INPUT,
GPIO_DM_INPUT_PULL_DOWN,
GPIO_DM_INPUT_PULL_UP,
GPIO_DM_OUTPUT,
} gpio_drive_mode_t;
成员名称 | 描述 |
GPIO_DM_INPUT | 输入 |
GPIO_DM_INPUT_PULL_DOWN | 输入下拉 |
GPIO_DM_INPUT_PULL_UP | 输入上拉 |
GPIO_DM_OUTPUT | 输出 |
GPIO 值。
typedef enum _gpio_pin_value
{
GPIO_PV_LOW,
GPIO_PV_HIGH
} gpio_pin_value_t;
成员名称 | 描述 |
GPIO_PV_LOW | 低 |
GPIO_PV_HIGH | 高 |
高速GPIO边沿触发模式。
typedef enum _gpio_pin_edge
{
GPIO_PE_NONE,
GPIO_PE_FALLING,
GPIO_PE_RISING,
GPIO_PE_BOTH,
GPIO_PE_LOW,
GPIO_PE_HIGH = 8,
} gpio_pin_edge_t;
成员名称 | 描述 |
GPIO_PE_NONE | 不触发 |
GPIO_PE_FALLING | 下降沿触发 |
GPIO_PE_RISING | 上升沿触发 |
GPIO_PE_BOTH | 双沿触发 |
GPIO_PE_LOW | 低电平触发 |
GPIO_PE_HIGH | 高电平触发 |