当前位置:网站首页>5.合宙Air32F103_LCD_key
5.合宙Air32F103_LCD_key
2022-08-02 03:05:00 【WuZJJJ】
一、简介
本章目的:将LCD扩展板上的方向按键用起来,在LCD上显示对应的方向。
二、代码
由于这个方向按键就是普通的GPIO,没有什么原理,所以直接开撸。
2.1key.c
在read_key函数中,读取按键的GPIO值,赋值给ret对应的bit位上,然后做一个和旧值,如果值变化了才返回新值,否则返回0。
#include "key.h"
void KEY_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE); //使能GPIOA、GPIOB时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度50MHz
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入模式
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIOA.0,1,15
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度50MHz
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入模式
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化GPIOB.8,9
}
u8 read_key(void)
{
u8 ret=0;
static u8 ret_last=0;
if(!KEY_GPIO_UP)ret |= KEY_UP_PRESS;
if(!KEY_GPIO_DOWN)ret |= KEY_DOWN_PRESS;
if(!KEY_GPIO_LEFT)ret |= KEY_LEFT_PRESS;
if(!KEY_GPIO_RIGHT)ret |= KEY_RIGHT_PRESS;
if(!KEY_GPIO_CENTER)ret |= KEY_CENTER_PRESS;
if(ret!=ret_last)
{
ret_last = ret;
return ret;
}
return ret;
}
2.2key.c
#ifndef __KEY_H__
#define __KEY_H__
#include "air32f10x.h"
#include "sys.h"
/* A1上 A15下 B8左 A0右 B9中 */
#define KEY_GPIO_UP PAin(1)
#define KEY_GPIO_DOWN PAin(15)
#define KEY_GPIO_LEFT PBin(8)
#define KEY_GPIO_RIGHT PAin(0)
#define KEY_GPIO_CENTER PBin(9)
typedef enum
{
KEY_UP = 0,
KEY_DOWN,
KEY_LEFT,
KEY_RIGHT,
KEY_CENTER
}key_t;
#define KEY_UP_PRESS (1<<KEY_UP)
#define KEY_DOWN_PRESS (1<<KEY_DOWN)
#define KEY_LEFT_PRESS (1<<KEY_LEFT)
#define KEY_RIGHT_PRESS (1<<KEY_RIGHT)
#define KEY_CENTER_PRESS (1<<KEY_CENTER)
void KEY_GPIO_Init(void);
u8 read_key(void);
#endif
2.3main.c
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "delay.h"
#include "led.h"
#include "key.h"
#include "usart.h"
#include "timer.h"
#include "gui.h"
#include "rcc_clk.h"
#include "picture.h"
u8 key=0,key_last=0xFF,key_first=1;
char str[50];
int main(void)
{
RCC_ClkConfiguration(); //配置时钟
DELAY_Init(); //延时初始化
USART1_Init(115200); //串口1初始化
LED_GPIO_Init(); //LED初始化
KEY_GPIO_Init(); //KEY初始化
ST7735V_Init(); //LCD初始化
GUI_Clear(White); //LCD清屏
TIM3_Int_Init(30000-1,72-1); //定时器3初始化,10ms(216M/30k/72=100k)
TIM2_Int_Init(30000-1,36000-1); //定时器2初始化,5000ms(216M/30k/36k=0.2HZ=5000ms)
USART1_ClearBuffer(); //清空串口1接收buffer
CLK_Printf(); //打印时钟频率
printf("wuzjjj\r\n"); //打印欢迎语句
// GUI_Pic((u16*)gImage_wxhq); //LCD显示图片
GUI_ShowHzChar(0,0,"Air32F103_LCD测试",Black,White);
USART1_ClearBuffer(); //清空串口1接收buffer
while (1)
{
if(USART1_RX_STA&0x8000) //收到串口数据
{
GUI_ShowHzCharAuto(0,16,(char*)USART1_RX_BUF,Black,White);
if(strcmp((char*)USART1_RX_BUF,"LEDR_ON")==0)
LEDR_ON;
else if(strcmp((char*)USART1_RX_BUF,"LEDR_OFF")==0)
LEDR_OFF;
else if(strcmp((char*)USART1_RX_BUF,"LEDG_ON")==0)
LEDG_ON;
else if(strcmp((char*)USART1_RX_BUF,"LEDG_OFF")==0)
LEDG_OFF;
else if(strcmp((char*)USART1_RX_BUF,"LEDB_ON")==0)
LEDB_ON;
else if(strcmp((char*)USART1_RX_BUF,"LEDB_OFF")==0)
LEDB_OFF;
USART1_RX_STA = USART1_RX_STA&0x7FFF; //去掉标志位,剩下数据长度
printf("received,%d:",USART1_RX_STA); //发送辅助信息及收到的数据长度
printf("%s\r\n",USART1_RX_BUF); //将收到的数据发回
USART1_ClearBuffer(); //清空串口1接收buffer
}
key = read_key();
if((key!=key_last&&key!=0)||key_first==1)
{
GUI_Arc(80,30,7,key&KEY_UP_PRESS?Red:Gray,1);
GUI_Arc(80,70,7,key&KEY_DOWN_PRESS?Red:Gray,1);
GUI_Arc(60,50,7,key&KEY_LEFT_PRESS?Red:Gray,1);
GUI_Arc(100,50,7,key&KEY_RIGHT_PRESS?Red:Gray,1);
GUI_Arc(80,50,7,key&KEY_CENTER_PRESS?Red:Gray,1);
key_last=key;
key_first=0;
}
sprintf(str,"key=%2d",key);
GUI_ShowHzChar(0,60,str,Black,White);
delay_ms(50);
}
}
三、调试
3.1接线
由于LCD板上关于按键的标记是错误的,下面列一下上面的丝印对应的接线。
Air32<------>LCD板
A1<------------>PA_7(上)
A15<----------->PB_11(下)
B8<----------->PA_1(左)
A0<----------->PA_0(右)
B9<----------->PA_4(中间)
3.3V<--------->3V3
GND<------->GND
3.2调试结果
支持5个方向的按键,按下后对应位置显示红色,支持多个按键同时按下。







边栏推荐
- 7-36 社交网络图中结点的“重要性”计算 (30 分) 不用迪杰斯特拉也不用弗洛伊德
- 关于#sql#的问题:该怎么写sql语句,
- 第二章——堆栈、队列
- MySQL修改最大连接数限制
- MySQL8 -- use msi (graphical user interface) under Windows installation method
- Chapter 10_Index Optimization and Query Optimization
- R16 Type II量化反馈码本的产生
- 【LeetCode】102. Level order traversal of binary tree
- MySQL8 - use under Windows package installation method
- C语言力扣第47题全排列 II。搜索回溯
猜你喜欢

MySQL8 -- use msi (graphical user interface) under Windows installation method

MySQL8--Windows下使用msi(图形界面)安装的方法

ReentrantLock工作原理

精益思想如何加速企业的全局价值流动?

Redis主从、哨兵、 Cluster集群一锅端!

Hit the programmer interview scene: What did Baidu interviewers ask me?

蓝鲸DevOps荣获平台类工具企业选择率第一

Heuristic merge, DSU on Tree

ASP WebShell backdoor script and anti-kill

常见的SQL面试题:经典50例
随机推荐
OperatingSystemMXBean to get system performance metrics
AcWing 1053. Repair DNA problem solution (state machine DP, AC automata)
PyTorch(六)——PyTorch可视化
VPS8505 微功率隔离电源隔离芯片 2.3-6V IN /24V/1A 功率管
DVWA之SQL注入
* Compare version numbers
IPFS deployment and file upload (golang)
【每日一道LeetCode】——9. 回文数
给你一个大厂面试的机会,你能面试上吗?进来看看!
WebShell Feature Value Summary and Detection Tool
知识体系树
【LeetCode】145. Postorder Traversal of Binary Tree
Reasons and solutions for Invalid bound statement (not found)
mysql8.0.28 download and installation detailed tutorial, suitable for win11
[LeetCode] 83. Delete duplicate elements in the sorted list
【无标题】【Koltin Flow(三)】Flow操作符之中间操作符(二)
【LeetCode】1374. 生成每种字符都是奇数个的字符串
MySQL8.0.26安装配置教程(windows 64位)
就瞎写=感想
两对象数组比较拿出不同值方法