当前位置:网站首页>5. Hezhou Air32F103_LCD_key
5. Hezhou Air32F103_LCD_key
2022-08-02 03:15:00 【WuZJJJ】
一、简介
本章目的:将LCDThe direction buttons on the expansion board are used,在LCDThe corresponding direction is displayed above.
二、代码
Because this direction key is commonGPIO,没有什么原理,所以直接开撸.
2.1key.c
在read_key函数中,读取按键的GPIO值,赋值给ret对应的bit位上,Then do one and the old value,Returns the new value if the value has changed,否则返回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接线
由于LCDThe labeling of the keys on the board is wrong,The wiring corresponding to the silk screen above is listed below.
Air32<------>LCD板
A1<------------>PA_7(上)
A15<----------->PB_11(下)
B8<----------->PA_1(左)
A0<----------->PA_0(右)
B9<----------->PA_4(中间)
3.3V<--------->3V3
GND<------->GND
3.2调试结果
支持5directional buttons,The corresponding position is displayed in red after being pressed,Support multiple keys pressed at the same time.
边栏推荐
猜你喜欢
Nacos source code analysis topic (2) - service registration
Using WebShell to get Shell Skills
MySQL8.0.28安装教程
ROS2自学笔记:launch文件完整编写流程
Chapter 10 聚类
Chapter 10_Index Optimization and Query Optimization
2022年最新一篇文章教你青龙面板拉库,拉取单文件,安装依赖,设置环境变量,解决没有或丢失依赖can‘t find module之保姆教程(附带几十个青龙面板脚本仓库)
Istio微服务治理网格的全方面可视化监控(微服务架构展示、资源监控、流量监控、链路监控)
mysql8.0.28 download and installation detailed tutorial, suitable for win11
Common SQL interview questions: 50 classic examples
随机推荐
生成器知道鉴别器在无条件GANs中应该学习什么
【LeetCode】20. Valid parentheses
Ribbon本地实现负载均衡
Week 304 Dunk
mysql8.0.28 download and installation detailed tutorial, suitable for win11
JSP Webshell free kill
Small program (necessary common sense for development) 1
关于跨域问题
深度学习:目标检测入门知识
Nacos source code analysis topic (1) - environment preparation
利用WebShell拿Shell技巧
MySQL函数(经典收藏)
AntV X6制作画板工具(图形,线段,图片上传)
MySQL八股文背诵版
CV-Model【4】:MobileNet v3
Common SQL interview questions: 50 classic examples
Go语学习笔记 - gorm使用 - 事务操作 Web框架Gin(十一)
为什么四个字节的float表示的范围比八个字节的long要广
7-40 奥运排行榜 (25 分)多项排序
DOM破坏及复现实验