GD32F303 按键常用操作

本文详细介绍了如何在GD32F30x平台中进行按键初始化,包括队列相关结构的创建和管理,以及按键硬件和逻辑层的函数实现,重点展示了如何使用定时器进行按键扫描,并处理单击、长按、双击和连按等按键事件。

目录

一、按键初始化相关代码

1、队列相关初始化

2、按键硬件相关初始化

3、按键逻辑层相关函数

二、按键的使用

1、硬件初始化

2、按键扫描:一般放在定时器 或者 while(1)

3、读取按键结果


一、按键初始化相关代码

1、队列相关初始化

/* uqueue.h 队列相关头文件 */
#ifndef _UQUEUE_H_
#define _UQUEUE_H_

#include "stdint.h"

#define UQUEUE_MAX_LEN	32

typedef struct{
	char *buff;
	int head;
	int size;
	int msize;
}UqueueType;

int UqueueCreate(UqueueType *queue, void *qbuff, int msize);
int UqueueLen(UqueueType *queue);
char UqueuePush(UqueueType *queue, char c);
char UqueuePop(UqueueType *queue);
char UqueueAt(UqueueType *queue, int index);
int UqueueWrite(UqueueType *queue, const char *buff, int num);
int UqueueRead(UqueueType *queue, char *buff, int num);
void UqueueClear(UqueueType *queue);
void UqueueThrow(UqueueType *queue, int num);

#endif

/* uqueue.c 队列相关 .c 文件 */
#include "uqueue.h"
#include <string.h>

#ifndef NULL
#define NULL	0
#endif

/**
 * 创建一个队列
 * queue - 需要初始化的队列
 * qbuff - 队列数据存储位置
 * msize - 队列最大长度
 * 返回:是否操作成功,0-失败,1-成功
 */
int UqueueCreate(UqueueType *queue, void *qbuff, int msize)
{
	if(queue==NULL || qbuff==NULL || msize==0) return 0;

	queue->buff = qbuff;
	queue->head=0;
	queue->size=0;
	queue->msize = msize;

	return 1;
}

/**
 * 获取队列长度
 * queue - 队列
 * 返回:队列长度
 */
int UqueueLen(UqueueType *queue)
{
	if(queue==NULL) return 0;
	
	return queue->size;
}

/**
 * 向队列压入数据
 * queue - 队列
 * c - 压入的数据
 * 返回:是否操作成功,0-失败,1-成功
 */
char UqueuePush(UqueueType *queue, char c)
{
	if(queue==NULL) return 0;

	if(queue->size<queue->msize){
		queue->buff[(queue->head+queue->size)%queue->msize]=c;
		queue->size++;
		return 1;
	}
	else{
		return 0;
	}
}

/**
 * 弹出数据
 * queue - 队列
 * 返回:弹出的数据
 */
char UqueuePop(UqueueType *queue)
{
	if(queue==NULL || queue->size==0) return 0;

	char c = queue->buff[queue->head++];
	queue->head = queue->head%queue->msize;
	queue->size--;
	return c;
}

/**
 * 读取队列中的一个数据
 * queue - 队列
 * index - 数据相对于队列头的偏移
 * 返回:读到的数据
 */
char UqueueAt(UqueueType *queue, int index)
{
	if(queue==NULL || queue->size<=index || queue->size<=0) return 0;

	return queue->buff[(queue->head+index)%queue->msize];
}

/**
 * 写入几个数据
 * queue - 队列
 * buff - 数据缓存
 * num - 写入数据量
 * 返回:写入的数据量
 */
int UqueueWrite(UqueueType *queue, const char *buff, int num)
{
    if(queue==NULL || buff==NULL || num==0) return 0;
    
    num = num>(queue->msize - queue->size) ? (queue->msize - queue->size):num;
    
    if(((queue->head+queue->size)%queue->msize+num)/queue->msize){
		int rem = (queue->head+queue->size+num)%queue->msize;
		memcpy(&queue->buff[(queue->head+queue->size)%queue->msize], buff, num-rem);
		memcpy(queue->buff, &buff[num-rem], rem);
	}
	else{
		memcpy(&queue->buff[(queue->head+queue->size)%queue->msize], buff, num);
	}
	queue->size+=num;

	return num;
}

/**
 * 读出几个数据
 * queue - 队列
 * buff - 数据缓存
 * num - 读出数据量
 * 返回:实际读到的数据量
 */
int UqueueRead(UqueueType *queue, char *buff, int num)
{
	if(queue==NULL || buff==NULL || num==0) return 0;

	num = num>queue->size ? queue->size:num;

	if((queue->head+num)/queue->msize){
		int rem = (queue->head+num)%queue->msize;
		memcpy(buff, &queue->buff[queue->head], num-rem);
		memcpy(&buff[num-rem], queue->buff, rem);
	}
	else{
		memcpy(buff, &queue->buff[queue->head], num);
	}

	return num;
}

/**
 * 清空队列
 * queue - 队列
 */
void UqueueClear(UqueueType *queue)
{
	if(queue==NULL) return;

	queue->head=0;
	queue->size=0;
}

/**
 * 弹出数个数据并丢弃
 * queue - 队列
 * num - 丢弃的数据个数
 */
void UqueueThrow(UqueueType *queue, int num)
{
	if(queue==NULL) return;

	num = queue->size>num ? num:queue->size;

	queue->size-=num;
	queue->head = (queue->head+num)%queue->msize;
}

2、按键硬件相关初始化

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值