Compare commits
	
		
			2 Commits
		
	
	
		
			b85fc4bdf1
			...
			37f331b842
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 37f331b842 | |||
| bd56fdcd73 | 
| @@ -9,6 +9,7 @@ | |||||||
| #include "AbsDrive_OLED.h" | #include "AbsDrive_OLED.h" | ||||||
| #include "AbsDriveOledFont.h" | #include "AbsDriveOledFont.h" | ||||||
|  |  | ||||||
|  | #if (ABSDrive_OLED_ON) | ||||||
| /**************************抽象实现区(BEGIN)************************************/ | /**************************抽象实现区(BEGIN)************************************/ | ||||||
|  |  | ||||||
| #if (defined ABSDrive_4SPI)||(defined ABSDrive_3SPI)||(defined ABSDrive_HardIIC)||(defined ABSDrive_SoftIIC) | #if (defined ABSDrive_4SPI)||(defined ABSDrive_3SPI)||(defined ABSDrive_HardIIC)||(defined ABSDrive_SoftIIC) | ||||||
| @@ -590,3 +591,4 @@ ABS_OLED_Drive Create_OLED(void){ | |||||||
| 	return drive; | 	return drive; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | #endif | ||||||
| @@ -12,7 +12,9 @@ | |||||||
| #include "stdint.h" | #include "stdint.h" | ||||||
| #include "stdlib.h" | #include "stdlib.h" | ||||||
|  |  | ||||||
|  | #define ABSDrive_OLED_ON 0 | ||||||
|  |  | ||||||
|  | #if(ABSDrive_OLED_ON) | ||||||
| /**************************配置区(BEGIN)***************************/ | /**************************配置区(BEGIN)***************************/ | ||||||
| /*------------你的头文件(BEGIN)----------------*/ | /*------------你的头文件(BEGIN)----------------*/ | ||||||
| //#include "spi.h" | //#include "spi.h" | ||||||
| @@ -22,6 +24,7 @@ | |||||||
| #include "stdio.h" | #include "stdio.h" | ||||||
| /*------------你的头文件(END)------------------*/ | /*------------你的头文件(END)------------------*/ | ||||||
|  |  | ||||||
|  |  | ||||||
| /*----1、选择驱动芯片----*/ | /*----1、选择驱动芯片----*/ | ||||||
| /* | /* | ||||||
| 根据你的OLED屏幕选择其中一种 | 根据你的OLED屏幕选择其中一种 | ||||||
| @@ -147,6 +150,7 @@ ABS_OLED_Drive Create_OLED(void);													//创建OLED设备 | |||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #endif | ||||||
|  |  | ||||||
| #endif				//__ABS_DRIVE_OLED_H | #endif				//__ABS_DRIVE_OLED_H | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,20 +1,20 @@ | |||||||
| # 简介 | # 简介 | ||||||
| ## 开发的来龙去脉 | ## **开发的来龙去脉** | ||||||
| 每次做项目的时候,都会遇到一些重复的代码,这些代码都是相似的,但是又不能直接复用,因为它们之间存在一些差异。 | 每次做项目的时候,都会遇到一些重复的代码,这些代码都是相似的,但是又不能直接复用,因为它们之间存在一些差异。 | ||||||
|  |  | ||||||
| 就像以抽象的思想去实现绝大部分外设的驱动 | 就像以抽象的思想去实现绝大部分外设的驱动 | ||||||
|  |  | ||||||
| 只需要配置一下参数和实现一下底层接口就可以直接使用 | 只需要配置一下参数和实现一下底层接口就可以直接使用 | ||||||
|  |  | ||||||
| ## 开发思路 | ## **开发思路** | ||||||
| 1. 定义一个配置区间,在这个区间内,可以配置一些参数,这些参数可以适配不同的硬件 | 1. 定义一个配置区间,在这个区间内,可以配置一些参数,这些参数可以适配不同的硬件 | ||||||
| 2. 定义一个抽象实现区间,在这个区间内,可以实现一些底层接口,这些接口可以适配不同的硬件 | 2. 定义一个抽象实现区间,在这个区间内,可以实现一些底层接口,这些接口可以适配不同的硬件 | ||||||
|  |  | ||||||
|  |  | ||||||
| ## 开发说明 | ## **开发说明** | ||||||
| 首先欢迎大家一起来参与开发,只要遵守以下开发规范,就可以提交代码,共同完善这个项目 | 首先欢迎大家一起来参与开发,只要遵守以下开发规范,就可以提交代码,共同完善这个项目 | ||||||
|  |  | ||||||
| ### 开发规范 | ### **开发规范** | ||||||
| 1. 文件夹的命名规范:以硬件类型的不同来建立文件夹,比如:OLED、LCD、温度传感器等等 | 1. 文件夹的命名规范:以硬件类型的不同来建立文件夹,比如:OLED、LCD、温度传感器等等 | ||||||
| 2. 文件的命名规范:开头为”ABS_硬件“或者“ABSDrive_硬件”开头,比如:ABS_OLED、等等 | 2. 文件的命名规范:开头为”ABS_硬件“或者“ABSDrive_硬件”开头,比如:ABS_OLED、等等 | ||||||
| 3. 函数命名规范:以”ABS_“或者”ABSDrive_“开头,比如:ABS_Init、ABSDrive_Init等等 | 3. 函数命名规范:以”ABS_“或者”ABSDrive_“开头,比如:ABS_Init、ABSDrive_Init等等 | ||||||
|   | |||||||
							
								
								
									
										68
									
								
								数据结构/栈/Stack.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								数据结构/栈/Stack.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,68 @@ | |||||||
|  | /* | ||||||
|  | *@文件:Stack.c | ||||||
|  | *@作者:‘你遇了我’ | ||||||
|  | *@time:2023/10/18 | ||||||
|  | *@联系:QQ:321640253 | ||||||
|  | *@版本:V1.0 | ||||||
|  | *@描述:顺序泛型栈 | ||||||
|  | */ | ||||||
|  | #include "Stack.h" | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * @简介:初始化一个栈 | ||||||
|  |  * @参数: | ||||||
|  |  *      *S:栈结构体指针 | ||||||
|  |  *      Maxsize:栈容器的长度 | ||||||
|  |  *      NodeSize:栈容器每个元素的空间大小 | ||||||
|  |  *      *container:容器指针 | ||||||
|  |  * @返回值:无 | ||||||
|  |  * */ | ||||||
|  | void InitStack(SqStack *S,uint16_t MaxSize,uint16_t NodeSize) { | ||||||
|  |    S->container = calloc(MaxSize,NodeSize); | ||||||
|  |    S->Top=-1; | ||||||
|  |    S->MaxSize=MaxSize; | ||||||
|  |    S->NodeSize=NodeSize; | ||||||
|  |    S->size = 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * @简介:进栈 | ||||||
|  |  * @参数: | ||||||
|  |  *      *S:栈结构体指针 | ||||||
|  |  * @返回值:可进栈空间地址 | ||||||
|  |  * */ | ||||||
|  | void *PushStack(SqStack *S) { | ||||||
|  |     if(S->size>=S->MaxSize)return NULL; | ||||||
|  |     S->Top++; | ||||||
|  |     S->size++; | ||||||
|  |     return S->container + S->Top*S->NodeSize; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * @简介:出栈 | ||||||
|  |  * @参数: | ||||||
|  |  *      *S:栈结构体指针 | ||||||
|  |  * @返回值:出栈元素地址空间 | ||||||
|  |  * */ | ||||||
|  | void *PopStack(SqStack *S) { | ||||||
|  |    if (S->size == 0) { | ||||||
|  |        return NULL; | ||||||
|  |    } | ||||||
|  |    S->Top--; | ||||||
|  |    S->size--; | ||||||
|  |    return S->container+S->Top*S->NodeSize; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * @简介:销毁栈 | ||||||
|  |  * @参数: | ||||||
|  |  *      *S:栈结构体指针 | ||||||
|  |  * @返回值:无 | ||||||
|  |  * */ | ||||||
|  | void DestroyStack(SqStack *S) { | ||||||
|  |    free(S->container); | ||||||
|  |    S->container = NULL; | ||||||
|  |    S->Top = -1; | ||||||
|  |    S->MaxSize = 0; | ||||||
|  |    S->size = 0; | ||||||
|  | } | ||||||
							
								
								
									
										31
									
								
								数据结构/栈/Stack.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								数据结构/栈/Stack.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,31 @@ | |||||||
|  | /* | ||||||
|  | *@文件:Stack.h | ||||||
|  | *@作者:‘你遇了我’ | ||||||
|  | *@time:2023/10/18 | ||||||
|  | *@联系:QQ:321640253 | ||||||
|  | *@版本:V1.0 | ||||||
|  | *@描述:顺序泛型栈 | ||||||
|  | */ | ||||||
|  | #ifndef _STACK_H_ | ||||||
|  | #define _STACK_H_ | ||||||
|  |  | ||||||
|  | #include <stdlib.h> | ||||||
|  | #include <stdint.h> | ||||||
|  |  | ||||||
|  | typedef struct { | ||||||
|  |    void *container; | ||||||
|  |    uint16_t size; | ||||||
|  |    uint16_t MaxSize; | ||||||
|  |    uint16_t NodeSize; | ||||||
|  |    int Top; | ||||||
|  | } SqStack; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /**********************函数声明区************************/ | ||||||
|  | void InitStack(SqStack *S,uint16_t MaxSize,uint16_t NodeSize);  //初始化栈 | ||||||
|  | void *PushStack(SqStack *S);                                    //进栈 | ||||||
|  | void *PopStack(SqStack *S);                                     //出栈 | ||||||
|  | void DestroyStack(SqStack *S);                                  //销毁栈 | ||||||
|  |  | ||||||
|  | #endif | ||||||
							
								
								
									
										23
									
								
								数据结构/栈/main.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								数据结构/栈/main.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | |||||||
|  | #include <stdio.h> | ||||||
|  | #include "Stack.h" | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | int main(){ | ||||||
|  |     int *a; | ||||||
|  |     SqStack stack; | ||||||
|  |     InitStack(&stack,20,sizeof(int)); | ||||||
|  |      | ||||||
|  |     for(int i=0;i<20;i++){ | ||||||
|  |         a=(int *)PushStack(&stack); | ||||||
|  |         *a=i; | ||||||
|  |     } | ||||||
|  |     for(int i=0;i<20;i++){ | ||||||
|  |         printf("%d ",*(int *)(stack.container+i*stack.NodeSize)); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
| @@ -3,24 +3,23 @@ | |||||||
|  |  | ||||||
| int main(){ | int main(){ | ||||||
|  |  | ||||||
|     int a[10];                      //创建队列容器 |  | ||||||
|     SqQuecu a_quecu;                //初始化队列 |     SqQuecu a_quecu;                //初始化队列 | ||||||
|     InitQuecu(&a_quecu,10,sizeof(int),(void*)a); |  | ||||||
|     //出队进队测试 |     //出队进队测试 | ||||||
|     int *tmep;//临时存储进对的返回值 |     int *tmep;//临时存储进对的返回值 | ||||||
|     for (size_t i = 0; i < 50; i++) |     for (size_t i = 0; i < 50; i++) | ||||||
|     { |     { | ||||||
|         tmep = (int*)enQueue(&a_quecu); |         tmep = (int*)enQueue(&a_quecu); | ||||||
|         if(tmep!=NULL){                         //返回值为空指针则对满 |         if(tmep!=NULL){                         //返回值为空指针则队满 | ||||||
|             *tmep=i; |             *tmep=i; | ||||||
|         } |         } | ||||||
|         else{ |         else{ | ||||||
|             printf("出队元素:%d\n",*(int*)deQueue(&a_quecu)); |             printf("出队元素:%d\n",*(int*)deQueue(&a_quecu)); | ||||||
|             *(int*)enQueue(&a_quecu)=i;                             //出队后重新进队 |             *(int*)enQueue(&a_quecu)=i;                             //出队后重新进队 | ||||||
|         } |         } | ||||||
|         for(int i=0;i<10;i++) |         /*******遍历队列**********/ | ||||||
|         printf("%d\n",a[i]); |         for(int i=0;i<a_quecu.Maxsize;i++) | ||||||
|  |         printf("%d\n",*(int*)(a_quecu.container+i*a_quecu.NodeSize)); | ||||||
|  |         /*******遍历队列**********/ | ||||||
|         printf("-------------------------\n"); |         printf("-------------------------\n"); | ||||||
|  |  | ||||||
|     } |     } | ||||||
| @@ -30,7 +29,7 @@ int main(){ | |||||||
|         printf("出队元素:%d\n",*(int*)deQueue(&a_quecu)); |         printf("出队元素:%d\n",*(int*)deQueue(&a_quecu)); | ||||||
|         printf("当前队列长度:%d\n",a_quecu.size); |         printf("当前队列长度:%d\n",a_quecu.size); | ||||||
|     } |     } | ||||||
|  |     DestroyQueue(&a_quecu); | ||||||
|  |     printf("队列已销毁\n"); | ||||||
|     return 0; |     return 0; | ||||||
|  |  | ||||||
| } | } | ||||||
| @@ -3,8 +3,8 @@ | |||||||
| *@作者:‘你遇了我’ | *@作者:‘你遇了我’ | ||||||
| *@time:2022/11/13 | *@time:2022/11/13 | ||||||
| *@联系:QQ:321640253 | *@联系:QQ:321640253 | ||||||
| *@版本:V1.2 | *@版本:V1.3 | ||||||
| *@描述:数组泛型队列。队列管理和容器空间分离 | *@描述:顺序泛型队列 | ||||||
| 使用案例: | 使用案例: | ||||||
|  |  | ||||||
| */ | */ | ||||||
| @@ -23,12 +23,12 @@ | |||||||
|  *      *container:容器数组指针 |  *      *container:容器数组指针 | ||||||
|  * @返回值:无 |  * @返回值:无 | ||||||
|  * */ |  * */ | ||||||
| void InitQuecu(SqQuecu *Q,uint16_t Maxsize,uint16_t NodeSize,void *container){  | void InitQuecu(SqQuecu *Q,uint16_t Maxsize,uint16_t NodeSize){  | ||||||
|     Q->front=Q->rear=-1; |     Q->front=Q->rear=-1; | ||||||
|     Q->size=0; |     Q->size=0; | ||||||
|     Q->Maxsize=Maxsize; |     Q->Maxsize=Maxsize; | ||||||
|     Q->NodeSize=NodeSize; |     Q->NodeSize=NodeSize; | ||||||
|     Q->container=container; |     Q->container=calloc(Maxsize,Q->NodeSize); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -80,3 +80,12 @@ void *deQueue(SqQuecu *Q){ | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * @简介:销毁队列 | ||||||
|  |  * @参数:队列指针 | ||||||
|  | */ | ||||||
|  | void DestroyQueue(SqQuecu *Q){ | ||||||
|  |     free(Q->container); | ||||||
|  |     Q->front=Q->rear=Q->size=Q->Maxsize=Q->NodeSize=0; | ||||||
|  |     Q->container=NULL; | ||||||
|  | } | ||||||
| @@ -3,28 +3,29 @@ | |||||||
| *@作者:‘你遇了我’ | *@作者:‘你遇了我’ | ||||||
| *@time:2022/11/13 | *@time:2022/11/13 | ||||||
| *@联系:QQ:321640253 | *@联系:QQ:321640253 | ||||||
| *@版本:V1.2 | *@版本:V1.3 | ||||||
| *@描述:数组泛型队列,队列管理和容器空间分离 | *@描述:顺序泛型队列 | ||||||
| 使用案例 | 使用案例 | ||||||
|     int a[10];                      //创建队列容器 | int main(){ | ||||||
|     SqQuecu a_quecu;                //初始化队列 |  | ||||||
|     InitQuecu(&a_quecu,10,sizeof(int),(void*)a); |  | ||||||
|  |  | ||||||
|  |     SqQuecu a_quecu;                //初始化队列 | ||||||
|  |     InitQuecu(&a_quecu,10,sizeof(int)); | ||||||
|     //出队进队测试 |     //出队进队测试 | ||||||
|     int *tmep;//临时存储进对的返回值 |     int *tmep;//临时存储进对的返回值 | ||||||
|     for (size_t i = 0; i < 50; i++) |     for (size_t i = 0; i < 50; i++) | ||||||
|     { |     { | ||||||
|         tmep = (int*)enQueue(&a_quecu); |         tmep = (int*)enQueue(&a_quecu); | ||||||
|         if(tmep!=NULL){                         //返回值为空指针则对满 |         if(tmep!=NULL){                         //返回值为空指针则队满 | ||||||
|             *tmep=i; |             *tmep=i; | ||||||
|         } |         } | ||||||
|         else{ |         else{ | ||||||
|             printf("出队元素:%d\n",*(int*)deQueue(&a_quecu)); |             printf("出队元素:%d\n",*(int*)deQueue(&a_quecu)); | ||||||
|             *(int*)enQueue(&a_quecu)=i;                             //出队后重新进队 |             *(int*)enQueue(&a_quecu)=i;                             //出队后重新进队 | ||||||
|         } |         } | ||||||
|  |         //*******遍历队列********** | ||||||
|         for(int i=0;i<10;i++) |         for(int i=0;i<10;i++) | ||||||
|         printf("%d\n",a[i]); |         printf("%d\n",*(int*)(a_quecu.container+i*a_quecu.NodeSize)); | ||||||
|  |         //*******遍历队列********** | ||||||
|         printf("-------------------------\n"); |         printf("-------------------------\n"); | ||||||
|  |  | ||||||
|     } |     } | ||||||
| @@ -34,6 +35,10 @@ | |||||||
|         printf("出队元素:%d\n",*(int*)deQueue(&a_quecu)); |         printf("出队元素:%d\n",*(int*)deQueue(&a_quecu)); | ||||||
|         printf("当前队列长度:%d\n",a_quecu.size); |         printf("当前队列长度:%d\n",a_quecu.size); | ||||||
|     } |     } | ||||||
|  |     DestroyQueue(&a_quecu); | ||||||
|  |     printf("队列已销毁\n"); | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
| */ | */ | ||||||
|  |  | ||||||
| #ifndef LIST_QUEUE_H | #ifndef LIST_QUEUE_H | ||||||
| @@ -52,11 +57,11 @@ typedef struct{ | |||||||
|     uint16_t size;              //队列长度 |     uint16_t size;              //队列长度 | ||||||
| } SqQuecu; | } SqQuecu; | ||||||
|  |  | ||||||
| void InitQuecu(SqQuecu *Q,uint16_t Maxsize,uint16_t NodeSize,void *container); | void InitQuecu(SqQuecu *Q,uint16_t Maxsize,uint16_t NodeSize);  //初始化队列 | ||||||
| void *enQueue(SqQuecu *Q); | void *enQueue(SqQuecu *Q);                                      //进队 | ||||||
| void *deQueue(SqQuecu *Q); | void *deQueue(SqQuecu *Q);                                      //出队 | ||||||
| bool QueueEmpty(SqQuecu *Q); | bool QueueEmpty(SqQuecu *Q);                                    //判断队空 | ||||||
| bool QueueFull(SqQuecu *Q); | bool QueueFull(SqQuecu *Q);                                     //判断队满 | ||||||
|  | void DestroyQueue(SqQuecu *Q);                                  //销毁队列(只销毁队列容器,队列指针本身还在) | ||||||
|  |  | ||||||
| #endif //LIST_QUEUE_H | #endif //LIST_QUEUE_H | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user