目录
一、按键初始化相关代码
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;
}

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

被折叠的 条评论
为什么被折叠?



