找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3829|回复: 3
打印 上一主题 下一主题
收起左侧

STM32 FDC2214手势识别参考程序

[复制链接]
跳转到指定楼层
楼主
ID:595546 发表于 2019-8-8 15:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include "stm32f10x.h"
  2. #include "sys.h"
  3. #include "led.h"
  4. #include "Beep.h"
  5. #include "delay.h"
  6. #include "stdio.h"
  7. #include "usart.h"
  8. #include "key.h"
  9. #include <fdc2214.h>
  10. #include <oled.h>
  11. #include <niming.h>
  12. #include <text.h>
  13. #include <Menu.h>
  14. #include <SortArr.h>
  15. #include "time5.h"
  16. unsigned char EntryFigerTimes=0;//录入54321时,所需记录的次数
  17. unsigned char EntryFistTimes =0;//录入石头剪刀布时,所需记录的次数
  18. //相应标志位
  19. unsigned char Interrupt_Flg=1,InterruptFlg=0;//按下按键 产生的相应标志位
  20. unsigned char Train_Figer_Entry_Flg=0,Train_Fist_Entry_Flg=0;//进入猜拳训练 划拳训练 相应标志位
  21. unsigned char Judge_Figer_Flg=0,Judge_Fist_Flg=0;//进入猜拳判决 划拳判决 相应标志位
  22. //数组排序次数
  23. unsigned char SortTimes=0;//录入结束后,对数组进行排序的次数
  24. //电容值存放数据
  25. float temp0=0,temp1=0,temp2=0,temp3=0;//四路通道值存放的变量
  26. float Total_Value;//四路通道总值
  27. //待存录入数组
  28. float ArrayData[10]={0};//录入手势时,四路通道总值要存放的数组(在录入手势时采集了十次数据,并且采用滤波算法)
  29. float ArrayA[8]={0};//录入54321时 存放54321数据的数组
  30. float ArrayB[8]={0};//录入石头剪刀布时 存放石头剪刀布数据的数组
  31. //按键数据
  32. int Page_New=0;//OLED菜单页面
  33. int ConfirmKey=0;//确认键(确认键按下: 1)
  34. int KeyUpDownFlg=0;//记录上下按键相对变化,正常按上键加1,按下键减1
  35. int  KeyRightLeftFlg=0;//按键右与左(两个按键采用一个变量 右键: 1 左键: -1)
  36. //加载中 次数
  37. long int Loding_Times=0;//加载中 相应判断次数

  38. void GetFouChVal(void);//读取四路通道值的函数
  39. int main()
  40. {
  41.           delay_init();                                                 //延时函数初始化        
  42.                 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //设置中断优先级分组2
  43.     uart_init(115200);                                     //串口初始化为115200
  44.     TIM5_init(79,7199);                              //10ms中断
  45.           Beep_Init();                                     //蜂鸣器初始化
  46.     IIC_Start();                                     //IIC初始化
  47.     Oled_Init();                                     //oled初始化
  48.     LED_Init();                                             //led初始化
  49.     //Key_Init();                                      //初始化五向按键和开关按键,可使用Key_Scan()函数得到返回值
  50.     //key_exti_test();                                 //按键检测
  51.           while(FDC2214_Init());                           //fdc2214初始化 成功:0 失败:1
  52.     Beep=0;delay_ms(10);Beep=1;                      //蜂鸣器提示
  53.     UI_TILTLE();                                     //标题
  54.         while(1)
  55. {
  56.                     Loding_Times=0;   //加载中函数的加载次数
  57. //在页面0 显示四路通道值
  58.      //if(Page_New==0)
  59.      //{
  60.          Oled_Printf_U32(28,3,(unsigned long int)temp0,0);
  61.          Oled_Printf_U32(28,4,(unsigned long int)temp1,0);
  62.          Oled_Printf_U32(28,5,(unsigned long int)temp2,0);
  63.          Oled_Printf_U32(28,6,(unsigned long int)temp3,0);
  64.      //}
  65. /**
  66. **在按键按下时 oled菜单界面进行相应的切换
  67. **并且相应标志位被重新赋值
  68. **/
  69.     /*if(Interrupt_Flg==1)//按一次方向按键'Interrupt_Flg'变量会被置1
  70.     {
  71.                                 if(Page_New==0)
  72.                                 {
  73.                                         ConfirmKey=0;
  74.                                 }
  75.         
  76.                                 OLED_Page_Show(KeyRightLeftFlg, KeyUpDownFlg,ConfirmKey);//此函数为oled菜单显示函数(参数分别为: 按键左右值 按键上下值 以及确认键)
  77.                           ConfirmKey=0;
  78.                           Interrupt_Flg=0;
  79.                           InterruptFlg =0;                  
  80.                           KeyUpDownFlg =0;
  81.                           KeyRightLeftFlg=0;
  82.     }

  83.     InterruptFlg=0;//此标志位为 录入手势时所需的标志位

  84. /**
  85. ** 在进入'Figer'训练界面时'Train_Figer_Entry_Flg'标志位被置1
  86. ** 在此训练期间,不会跳出此循环 除非强制返回或录入结束
  87. ** 相应标志位在此处被赋值
  88. **/
  89.                 /*while(Train_Figer_Entry_Flg)
  90.                 {   SortTimes=0;
  91.         Loading();
  92.                         
  93.        if(InterruptFlg==1)
  94.                     {
  95.           EntryFiger();
  96.           InterruptFlg=0;
  97.         }
  98.                                 
  99.                 ConfirmKey=0;
  100.         KeyUpDownFlg=2;
  101.         Interrupt_Flg=1;
  102.                 KeyRightLeftFlg=-1;
  103.     }
  104. /**
  105. **'Figer'训练期间如果强制返回则代表录入失败
  106. ** 相应所存放数据的数组被清零
  107. **/
  108. /*  if(EntryFigerTimes!=0)
  109.     {
  110.                 unsigned char i;
  111.                         
  112.         for(i=0;i<6;i++)
  113.         {
  114.           ArrayA[i]=0;
  115.         }
  116.                                 
  117.         EntryFigerTimes=0;//录入手势时的次数
  118.                                 KeyUpDownFlg=0;
  119.     }
  120. /**
  121. ** 在进入'JudgeNum'判决界面时'Judge_Figer_Flg'标志位被置1
  122. ** 因为在录入手势时不需要按照顺序,所以此处用到冒泡排序算法
  123. ** oled显示相应结果
  124. **/
  125.          /* if(Judge_Figer_Flg==1)
  126.                 {
  127.         if(SortTimes==0)//录入一次数据只排序一次
  128.         {
  129.            SortArr(ArrayA,6);//冒泡排序算法
  130.            JudgmentFigerRange();//对手势范围进行整定
  131.         }
  132.         switch(JudgmentFiger())
  133.          {
  134.            case 0: OLED_ShowCN(52,4,35);OLED_ShowCN(52,5,35); break;
  135.            case 1: OLED_ShowStr(52,4,"1",2); break;
  136.            case 2: OLED_ShowStr(52,4,"2",2); break;
  137.                         case 3: OLED_ShowStr(52,4,"3",2); break;
  138.                         case 4: OLED_ShowStr(52,4,"4",2); break;
  139.            case 5: OLED_ShowStr(52,4,"5",2); break;
  140.            default: break;
  141.          }
  142.                                        
  143.         SortTimes=1;
  144.     }
  145. /**
  146. ** 在进入'Fist'训练界面时'Train_Fist_Entry_Flg'标志位被置1
  147. ** 在此训练期间,不会跳出此循环 除非强制返回或录入结束
  148. ** 相应标志位在此处被赋值
  149. **/
  150. /*        while(Train_Fist_Entry_Flg)
  151.     {
  152.         Loading();
  153.         SortTimes=0;
  154.         if(InterruptFlg==1)
  155.         {
  156.           EntryFist();
  157.           InterruptFlg=0;
  158.         }
  159.                         
  160.         ConfirmKey=0;
  161.         KeyUpDownFlg=2;//训练结束,回到上级菜单时,光标直接跳到猜拳判决处
  162.         Interrupt_Flg=1;
  163.                 KeyRightLeftFlg=-1;
  164.     }
  165. /**
  166. **'Fist'训练期间如果强制返回则代表录入失败
  167. ** 相应所存放数据的数组被清零
  168. **/
  169.   /*   if(EntryFistTimes!=0)
  170.     {
  171.                                 unsigned char i;
  172.                                 for(i=0;i<4;i++)
  173.                                 {
  174.             ArrayB[i]=0;
  175.                                 }
  176.                                 
  177.         EntryFistTimes=0;//录入手势时的次数
  178.                                 KeyUpDownFlg=0;
  179.      }
  180. /**
  181. ** 在进入'JudgeFist'判决界面时'Judge_Fist_Flg'标志位被置1
  182. ** 因为在录入手势时不需要按照顺序,所以此处用到冒泡排序算法
  183. ** oled显示相应结果
  184. **/
  185. /*   if(Judge_Fist_Flg==1)
  186.      {
  187.         if(SortTimes==0)//录入一次数据只排序一次
  188.         {
  189.            SortArr(ArrayB,4);
  190.            JudgmentFistRange();
  191.          }
  192.          switch(JudgmentFist())
  193.          {
  194.            case 0: OLED_ShowCN(48,5,35); OLED_ShowCN(64,5,35);break;//空格
  195.            case 1: OLED_ShowCN(48,5,30); OLED_ShowCN(64,5,31);break;//石头
  196.            case 2: OLED_ShowCN(48,5,32); OLED_ShowCN(64,5,33);break;//剪刀
  197.            case 3: OLED_ShowCN(48,5,34); OLED_ShowCN(64,5,35);break;//布
  198.            default: break;
  199.          }
  200.         SortTimes=1;

  201.                 }*/
  202.   }
  203. }
  204. /**
  205. **可在此函数中直接采集四路通道值
  206. **/

  207. void GetFouChVal()
  208. {
  209.                 temp0= Cap_Calculate(0);
  210.     temp1= Cap_Calculate(1);
  211.     temp2= Cap_Calculate(2);
  212.     temp3= Cap_Calculate(3);
  213.     Total_Value=(temp0+temp1+temp2+temp3)/10000;
  214. }
  215. /**
  216. **定时器5中断函数 10ms
  217. **在定时器中采集四路通道值,并计算总值
  218. **/
  219. void TIM5_IRQHandler(void)         
  220. {
  221.          
  222.         if(TIM5->SR&0X0001)//溢出中断
  223.         {        
  224.                 temp0= Cap_Calculate(0);
  225.     temp1= Cap_Calculate(1);
  226.     temp2= Cap_Calculate(2);
  227.     temp3= Cap_Calculate(3);
  228.     Total_Value=(temp0+temp1+temp2+temp3)/10000;
  229.                
  230.         }                                                   
  231.   TIM5->SR&=~(1<<0);
  232. }
复制代码

全部资料51hei下载地址:
Gesture-KEIL.7z (225.37 KB, 下载次数: 76)
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶2 踩
回复

使用道具 举报

沙发
ID:818753 发表于 2020-9-24 09:26 | 只看该作者
请问不同的液晶怎么改代码呀
回复

使用道具 举报

板凳
ID:927138 发表于 2021-5-30 17:31 | 只看该作者
请问,有实物图吗
回复

使用道具 举报

地板
ID:99858 发表于 2022-3-8 15:52 | 只看该作者
问下为什么我的板子时间长了,数值会出现漂移,有好的解决办法吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表