找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3410|回复: 4
收起左侧

FDC2214手势识别一二问三四最终版STM32程序源码 2018TI d题

[复制链接]
ID:438665 发表于 2018-12-3 19:53 | 显示全部楼层 |阅读模式
制作出来的实物图如下:
实物图.jpg

例程序:main函数:
  1. #include "bsp.h"
  2. #include "bsp_fdc2214.h"
  3. #include "bsp_iic.h"
  4. #include "sys.h"
  5. #include "lcd.h"
  6. #include "dislay.h"
  7. #include "key.h"
  8. #include "timer.h"
  9. long ChValue[4] = {0};
  10. int Ch0[5];
  11. int Ch1[5];
  12. int Ch2[5];
  13. int Ch3[5];
  14. float PH0[10],PH1[10],PH2[10],PH3[10],PH4[10],PH5[10],PH6[10],PH7[10],PH8[10],PH9[10],PH10[10],PH11[10],PH12[10],PH13[10];
  15. int i;
  16. long sum;
  17. /*******************************************************************************
  18. * 函数名        : main
  19. * 描述            : 主函数
  20. * 输入参数  : 无
  21. * 返回参数  : 无
  22. *******************************************************************************/
  23. int t0,t1,t2,t3;
  24. int S0,S1,S2,S3;
  25. float P,P4,P5,P6,P7,PT,PT0,PT1,PT2,Q,P8,P9,P10,P11,P12,P13;
  26. int flag,mode;
  27. char H1=0,H2=0,H3=0,H4=0;
  28. void TIM3_Int_Init(u32 arr,u16 psc)
  29. {
  30.         TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
  31.         NVIC_InitTypeDef NVIC_InitStructure;
  32.         
  33.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);  ///使能TIM3时钟
  34.         
  35.   TIM_TimeBaseInitStructure.TIM_Period = arr;         //自动重装载值
  36.         TIM_TimeBaseInitStructure.TIM_Prescaler=psc;  //定时器分频
  37.         TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
  38.         TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
  39.         
  40.         TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);//初始化TIM3
  41.         
  42.         TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //允许定时器3更新中断
  43.         TIM_Cmd(TIM3,ENABLE); //使能定时器3
  44.         
  45.         NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn; //定时器3中断
  46.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0; //抢占优先级0
  47.         NVIC_InitStructure.NVIC_IRQChannelSubPriority=1; //子优先级1
  48.         NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
  49.         NVIC_Init(&NVIC_InitStructure);        
  50. //        TIM_Cmd(TIM3, DISABLE);
  51. }
  52. int main()
  53. {
  54.         u8 a=0;
  55.         int i;
  56.         s32 temp;
  57.         delay_init();
  58.         uart_init(115200);
  59.         IIC_Init();
  60.         LCD_Init();
  61.         TIM3_Int_Init(10000-1,84-1);        //定时器时钟84M,分频系数84,所以84M/8400=1Mhz的计数频率,us
  62.         KEY_Init();
  63.         POINT_COLOR=RED;      //画笔颜色:红色
  64.         InitMultiFDC2214();
  65.         while(1)
  66.         {
  67.                 a = HL_Scan();
  68.                 LCD_ShowxNum(30,100,a,2,16,0);
  69.                 delay_ms(20);                  
  70.                 flag++;
  71.     if(flag==30)
  72.                 {
  73.                         S0=(Ch0[4]+Ch0[3]+Ch0[2]+Ch0[1]+Ch0[0])/5;
  74.                         S1=(Ch1[4]+Ch1[3]+Ch1[2]+Ch1[1]+Ch1[0])/5;
  75.                         S2=(Ch2[4]+Ch2[3]+Ch2[2]+Ch2[1]+Ch2[0])/5+40;
  76.                         S3=(Ch3[4]+Ch3[3]+Ch3[2]+Ch3[1]+Ch3[0])/5;
  77.       H4  = (S0+S1+S2+S3); LCD_ShowString(100,50,200,16,16,"OK . OK    ");;
  78.                 }        
  79.      if(flag > 50){flag = 30;LCD_Clear(WHITE);}
  80.                  
  81.      if(((S0-Ch0[0])>23)&&((S1-Ch1[0])<20)&&((S2-Ch2[0])<100)&&(S3-Ch3[0])>70)
  82.                  {  if(a==2)if((S0-Ch0[0])<35)
  83.                          { LCD_ShowString(30,80,200,16,16,"NUMBER ONE    ");}                 
  84.                          if((S0-Ch0[0])>30)
  85.                          {
  86.                                  if(a==2)LCD_ShowString(30,80,200,16,16,"NUMBER TWO    ");
  87.                                  if(a==3)
  88.                                  {                        LCD_Clear(WHITE);LCDSHOWChinese(80,150,2,128,0,1);//剪刀
  89.                                               LCD_Clear(WHITE);
  90.                                  }}
  91.                  }                 
  92.                  if(((S0-Ch0[0])>38)&&((S1-Ch1[0])>10)&&((S2-Ch2[0])<250)&&((S3-Ch3[0])>70))
  93.                  {   
  94.                          if(a==2){if(((S3-Ch3[0])<450))//可去掉等号
  95.                                   {  LCD_ShowString(30,80,200,16,16,"NUMBER THREE ");}        
  96.                             if(((S3-Ch3[0])>480)&&((S1-Ch1[0])>30))
  97.                                   {  LCD_ShowString(30,80,200,16,16,"NUMBER FOUR  ");}
  98.                                    
  99.                         }                                       
  100.                  }
  101.                  if(((S0-Ch0[0])>38)&&((S1-Ch1[0])>30)&&((S2-Ch2[0])>100)&&((S3-Ch3[0])>30))
  102.                  {   if(a==2)LCD_ShowString(30,80,200,16,16,"NUMBER  FIVE ");
  103.                                  if(a==3)
  104.                                  { LCDSHOWChinese(80,150,1,128,0,2);//布
  105.                                          LCD_Clear(WHITE);
  106.                                          }         
  107.                  }
  108.      if(((S0-Ch0[0])<20)&&((S1-Ch1[0])<=10)&&((S2-Ch2[0])<30)&&(S3-Ch3[0])<30)
  109.                  {
  110.                          LCD_ShowString(30,80,200,16,16,"NOTHING .     ");
  111.                          LCD_Clear(WHITE);        
  112.                  }
  113.                  if(((S0-Ch0[0])<20)&&((S1-Ch1[0])<=10)&&((S2-Ch2[0])<70)&&(S3-Ch3[0])>300)
  114.                  { if(a==3)
  115.                          {
  116.                            LCDSHOWChinese(80,150,2,128,0,0);//石头         
  117.                                  LCD_Clear(WHITE);
  118.                          }}         
  119.                  while(a>3&&a<=15)
  120.                  {
  121.                          a = HL_Scan();
  122.                    LCD_ShowxNum(30,100,a,2,16,0);
  123.                          sum = (ChValue[0]+ChValue[1]+ChValue[2]+ChValue[3]);                 
  124.                          if(a==4||a==5||a==6||a==7)
  125.                          {
  126.                                  if(a==5)
  127.                                  {
  128.                                          LCDSHOWChinese(70,150,3,128,0,10);//采样                A
  129.                                          P4 = (float)sum/H4*10;//石头
  130.                                          PH0[4]=PH0[3];PH0[3]=PH0[2];PH0[2]=PH0[1];PH0[1]=PH0[0];PH0[0]=P4;
  131.                                          P4 = (PH0[0]+PH0[1]+PH0[2]+PH0[3]+PH0[4]+PH0[5]+PH0[6]+PH0[7]+PH0[8]+PH0[9])/5;
  132.                                          LCD_ShowxNum(30,210,P4,5,16,0);
  133.                                  }else if(a==6)
  134.                                  {
  135.                                          LCDSHOWChinese(70,150,3,128,0,10);//采样                A
  136.                                          P5 = (float)sum/H4*10;//布;
  137.                                          PH1[4]=PH1[3];PH1[3]=PH1[2];PH1[2]=PH1[1];PH1[1]=PH1[0];PH1[0]=P5;
  138.                                          P5 = (PH1[0]+PH1[1]+PH1[2]+PH1[3]+PH1[4])/5;
  139.                                          LCD_ShowxNum(30,210,P5,5,16,0);
  140.                                  }else if(a==7)
  141.                                  {
  142.                                          LCDSHOWChinese(70,150,3,128,0,10);//采样                A
  143.                                          P6 = (float)sum/H4*10;//剪刀
  144.                                          PH2[9]=PH2[8];PH2[8]=PH2[7];PH2[7]=PH2[6];PH2[6]=PH2[5];PH2[5]=PH2[4];
  145.                                          PH2[4]=PH2[3];PH2[3]=PH2[2];PH2[2]=PH2[1];PH2[1]=PH2[0];PH2[0]=P6;
  146.                                          P6 = (PH2[0]+PH2[1]+PH2[2]+PH2[3]+PH2[4]+PH2[5]+PH2[6]+PH2[7]+PH2[8]+PH2[9])/10;
  147.                                          LCD_ShowxNum(30,210,P6,5,16,0);
  148.                                  }else LCDSHOWChinese(70,150,2,128,0,11);//准备
  149.                          }
  150.                          if(a==8||a==9||a==10||a==11||a==12 ||a==13)
  151.                          {
  152.                                  if(a==9)
  153.                                  {
  154.                                          LCDSHOWChinese(70,150,3,128,0,12);//采样B                                 
  155.                                          P9 = (float)sum/H4*10;//1111
  156.                                          PH9[9]=PH9[8];PH9[8]=PH9[7];PH9[7]=PH9[6];PH9[6]=PH9[5];PH9[5]=PH9[4];
  157.                                          PH9[4]=PH9[3];PH9[3]=PH9[2];PH9[2]=PH9[1];PH9[1]=PH9[0];PH9[0]=P9;
  158.                                          P9 = (PH9[0]+PH9[1]+PH9[2]+PH9[3]+PH9[4]+PH9[5]+PH9[6]+PH9[7]+PH9[8]+PH9[9])/10;
  159.                                          LCD_ShowxNum(30,210,P9,5,16,0);
  160.                                  }
  161.                                  else if(a==10)
  162.                                  {
  163.                                          LCDSHOWChinese(70,150,3,128,0,12);//采样B                                         
  164.                                          P10 = (float)sum/H4*10;//2222
  165.                                          PH10[9]=PH10[8];PH10[8]=PH10[7];PH10[7]=PH10[6];PH10[6]=PH10[5];PH10[5]=PH10[4];
  166.                                          PH10[4]=PH10[3];PH10[3]=PH10[2];PH10[2]=PH10[1];PH10[1]=PH10[0];PH10[0]=P10;
  167.                                          P10 = (PH10[0]+PH10[1]+PH10[2]+PH10[3]+PH10[4]+PH10[5]+PH10[6]+PH10[7]+PH10[8]+PH10[9])/10;
  168.                                          LCD_ShowxNum(30,210,P10,5,16,0);
  169.                                  }
  170.                                  else if(a==11)
  171.                                  {
  172.                                          LCDSHOWChinese(70,150,3,128,0,12);//采样        B                        
  173.                                          P11 = (float)sum/H4*10;//3333
  174.                                          PH11[9]=PH11[8];PH11[8]=PH11[7];PH11[7]=PH11[6];PH11[6]=PH11[5];PH11[5]=PH11[4];
  175.                                          PH11[4]=PH11[3];PH11[3]=PH11[2];PH11[2]=PH11[1];PH11[1]=PH11[0];PH11[0]=P11;
  176.                                          P11 = (PH11[0]+PH11[1]+PH11[2]+PH11[3]+PH11[4]+PH11[5]+PH11[6]+PH11[7]+PH11[8]+PH11[9])/10;
  177.                                          LCD_ShowxNum(30,210,P11,5,16,0);
  178.                                  }
  179.                                  else if(a==12)
  180.                                  {
  181.                                          LCDSHOWChinese(70,150,3,128,0,12);//采样        B                                                
  182.                                          P12 = (float)sum/H4*10;//3333
  183.                                          PH12[9]=PH12[8];PH12[8]=PH12[7];PH12[7]=PH12[6];PH12[6]=PH12[5];PH12[5]=PH12[4];
  184.                                          PH12[4]=PH12[3];PH12[3]=PH12[2];PH12[2]=PH12[1];PH12[1]=PH12[0];PH12[0]=P12;
  185.                                          P12 = (PH12[0]+PH12[1]+PH12[2]+PH12[3]+PH12[4]+PH12[5]+PH12[6]+PH12[7]+PH12[8]+PH12[9])/10;
  186.                                          LCD_ShowxNum(30,210,P12,5,16,0);
  187.                                  }
  188.                                  else if(a==13)
  189.                                  {
  190.                                          LCDSHOWChinese(70,150,3,128,0,12);//采样                        B         
  191.                                          P13 = (float)sum/H4*10;//3333
  192.                                          PH13[9]=PH13[8];PH13[8]=PH13[7];PH13[7]=PH13[6];PH13[6]=PH13[5];PH13[5]=PH13[4];
  193.                                          PH13[4]=PH13[3];PH13[3]=PH13[2];PH13[2]=PH13[1];PH13[1]=PH13[0];PH13[0]=P13;
  194.                                          P13 = (PH13[0]+PH13[1]+PH13[2]+PH13[3]+PH13[4]+PH13[5]+PH13[6]+PH13[7]+PH13[8]+PH13[9])/10;
  195.                                          LCD_ShowxNum(30,210,P13,5,16,0);
  196.                                  }
  197.                                  else LCDSHOWChinese(70,150,2,128,0,11);//准备
  198.                      }
  199.                          if(a==14)//划拳判决
  200.                          {
  201.                                  Q = (float)sum/H4*10;
  202.                                  PH6[9]=PH6[8];PH6[8]=PH6[7];PH6[7]=PH6[6];PH6[6]=PH6[5];PH6[5]=PH6[4];
  203.                                  PH6[4]=PH6[3];PH6[3]=PH6[2];PH6[2]=PH6[1];PH6[1]=PH6[0];PH6[0]=Q;
  204.                                  Q = (PH6[0]+PH6[1]+PH6[2]+PH6[3]+PH6[4]+PH6[5]+PH6[6]+PH6[7]+PH6[8]+PH6[9])/10;
  205.          LCD_ShowxNum(30,180,Q,5,16,0);                                         
  206. /*                                 &&\((S0-Ch0[0])>23)&&(S0-Ch0[0])<35&&((S1-Ch1[0])<20)&&((S2-Ch2[0])<100)&&(S3-Ch3[0])>100
  207.                                  &&\
  208.                                  ((S0-Ch0[0])>35)&&((S1-Ch1[0])<20)&&((S2-Ch2[0])<100)&&(S3-Ch3[0])>100
  209.                                  &&\
  210.                                  ((S0-Ch0[0])>38)&&((S1-Ch1[0])>5)&&((S1-Ch1[0])<12)&&((S2-Ch2[0])<250)&&((S3-Ch3[0])>100)
  211.                                  &&\
  212.                                  ((S0-Ch0[0])>38)&&((S1-Ch1[0])>12)&&((S2-Ch2[0])<250)&&((S3-Ch3[0])>100))
  213.                                  */
  214.                                  if((Q>=P9-2)&&(Q<P9+2))
  215.                                  {         
  216.                              LCD_ShowString(30,80,200,16,16,"NUMBER ONE    ");
  217.                                  }else if((Q>=P10-2)&&(Q<=P10+2))
  218.                                  {                                 
  219.                              LCD_ShowString(30,80,200,16,16,"NUMBER TWO    ");
  220.                                  }else if((Q>=P11-10)&&(Q<= P11+10))
  221.                                  {                                 
  222.                              LCD_ShowString(30,80,200,16,16,"NUMBER THREE ");
  223.                                  }else if((Q>=P12-4)&&(Q<=P12+4))
  224.                                  {                                 
  225.                              LCD_ShowString(30,80,200,16,16,"NUMBER FOUR  ");
  226.                                  }else if((Q>P13-5)&&(Q<P13+5))
  227.                                  {                                 
  228.                              LCD_ShowString(30,80,200,16,16,"NUMBER FIVE    ");
  229.                                  }else LCD_Clear(WHITE);
  230.                         }                 
  231.                          if(a==15)//判决
  232.                          {
  233.                                  P = (float)sum/H4*10;
  234.                                  PH5[9]=PH5[8];PH5[8]=PH5[7];PH5[7]=PH5[6];PH5[6]=PH5[5];PH5[5]=PH5[4];
  235.                                  PH5[4]=PH5[3];PH5[3]=PH5[2];PH5[2]=PH5[1];PH5[1]=PH5[0];PH5[0]=P;
  236.                                  P = (PH5[0]+PH5[1]+PH5[2]+PH5[3]+PH5[4]+PH5[5]+PH5[6]+PH5[7]+PH5[8]+PH5[9])/10;
  237.                                  LCD_ShowxNum(30,180,P,5,16,0);                                          
  238.                                  if((P>P4-5)&&(P<P4+5))
  239.                                  {         
  240.                              LCDSHOWChinese(80,150,2,128,0,0);//石头        
  241.                                  }else if((P>P5-10)&&(P<P5+10))
  242.                                  {                                 
  243.                              LCDSHOWChinese(80,150,1,128,0,2);//布
  244.                                  }else if((P>P6-5)&&(P<P6+5))
  245.                                  {                                 
  246.                              LCD_Clear(WHITE);LCDSHOWChinese(80,150,2,128,0,1);//剪刀
  247.                                  }else LCD_Clear(WHITE);
  248.                         }        }                                          
  249.                                      delay_ms(10);
  250.         }               
  251. }
  252. void TIM3_IRQHandler(void)
  253. {
  254.         if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET) //溢出中断
  255.         {        
  256.                   for ( i = 0; i < 4;i++)
  257.                 {
  258.                                 ChValue[i] = FDC2X14ReadCH(i+1);         
  259.                                 if(i == 0)
  260.                                 {
  261.                                         ChValue[i] =(ChValue[i]-11700000)/100;
  262.           Ch0[4] = Ch0[3];Ch0[3] = Ch0[2];Ch0[2] = Ch0[1];
  263.                                         Ch0[1] = Ch0[0];Ch0[0] = ChValue[i];
  264.                                         ChValue[i] = (Ch0[4]+Ch0[3]+Ch0[2]+Ch0[1]+Ch0[0])/5;
  265.                                 }
  266.                                 if(i == 1)
  267.                                 {
  268.                                         ChValue[i] =(ChValue[i]-11700000)/100;
  269.                                         Ch1[4] = Ch1[3];Ch1[3] = Ch1[2];
  270.                                         Ch1[2] = Ch1[1];Ch1[1] = Ch1[0];Ch1[0] = ChValue[i];
  271.                                         ChValue[i] = (Ch1[4]+Ch1[3]+Ch1[2]+Ch1[1]+Ch1[0])/5;
  272.                                 }
  273.                                 if(i == 2)
  274.                                 {
  275.                                         ChValue[i] =(ChValue[i]-4000000)/100-2400;
  276.                                         Ch2[4] = Ch2[3];Ch2[3] = Ch2[2];
  277.                                         Ch2[2] = Ch2[1];Ch2[1] = Ch2[0];Ch2[0] = ChValue[i];
  278.                                         ChValue[i] = (Ch2[4]+Ch2[3]+Ch2[2]+Ch2[1]+Ch2[0])/5;
  279.                                 }
  280.                                 if(i == 3)
  281.                                 {
  282.                                         ChValue[i] =(ChValue[i]-4700000)/100;
  283.                                         Ch3[4] = Ch3[3];Ch2[3] = Ch3[2];
  284.                                         Ch3[2] = Ch3[1];Ch3[1] = Ch3[0];Ch3[0] = ChValue[i];
  285.                                         ChValue[i] = (Ch3[4]+Ch3[3]+Ch3[2]+Ch3[1]+Ch3[0])/5;
  286.                                 }
  287.                                 printf("CH%d,",i);printf(" %ld ",ChValue[i]);
  288.                                 if (i < 3) printf(", ");else printf("\r\n");
  289.                         }
  290.                  TIM_ClearITPendingBit(TIM3, TIM_IT_Update);  
  291.         }        
  292. }
复制代码

全部资料51hei下载地址:
手势识别一二问三四最终版.rar (547.78 KB, 下载次数: 75)

评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:1 发表于 2018-12-4 04:26 | 显示全部楼层
补全原理图或者详细说明一下电路连接即可获得100+黑币
回复

使用道具 举报

ID:581352 发表于 2019-8-1 10:51 | 显示全部楼层
可以把TFT和STM32的管脚连接分享出来吗?最好原理图
回复

使用道具 举报

ID:953892 发表于 2021-7-18 11:18 | 显示全部楼层
求楼主分享电路连接图
回复

使用道具 举报

ID:438665 发表于 2022-8-4 02:00 | 显示全部楼层
neinein 发表于 2019-8-1 10:51
可以把TFT和STM32的管脚连接分享出来吗?最好原理图

抱歉,TFT就是正常的stm32最小板,具体的话可以参照代码
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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