极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 14803|回复: 7

自己编写的一个ps2摇杆的类

[复制链接]
发表于 2012-11-2 15:16:06 | 显示全部楼层 |阅读模式
自己编写的一个ps2摇杆的类,大家给点意见
主程序:
  1. //--------------------------------------------------------------------test.ino----------------------------------------------
  2. #include "ps2.h"
  3. ps2 ps;
  4. void setup()
  5. {
  6.         ps.init(0,1,2);

  7.                //函数指针赋值
  8.         ps.Up=Up;
  9.         ps.Middle=Middle;
  10.         ps.Dwon=Down;

  11. }

  12. void loop()
  13. {
  14.         ps.setXYvalue(495,519); //设置中间值
  15.         ps.run();
  16.         delay(500);
  17. }


  18. void Up()
  19. {
  20.     Serial.println("up");       
  21. }
  22. void Middle()
  23. {
  24. Serial.println("Middle");
  25. }

  26. void Down()
  27. {
  28. Serial.println("Down");
  29. }
复制代码






  1. //------------------------------------------------------------ps2.h头文件------------------------------------------------

  2. #ifndef ps2H
  3. #define ps2H
  4. //---------------------------------------------------------------------------
  5. #include <Arduino.h>
  6. class ps2
  7. {
  8.    private:
  9.       //当前x,y值
  10.       int x_position;
  11.       int y_position;
  12.       //中间值,也就是不动摇杆时的X,Y值
  13.       int X_Middle;
  14.       int Y_Middle;

  15.       //模拟端口
  16.        int PIN_ANALOG_X;
  17.        int PIN_ANALOG_Y;
  18.       // 模拟端口,数字端口都可以
  19.        int PIN_ANALOG_K;
  20.       //中间按钮
  21.       bool k_pressed;

  22.    public:
  23.       //
  24.            ps2();
  25.           void setXYvalue(int X,int Y); //设置X,Y的中间值
  26.       void init( int X,  int Y, int k);//初始化端口

  27.       int getX_position();//读取当前X的值
  28.       int getY_position();//读取当前Y的值
  29.       bool getKey();//读取中间按钮是否为按下状态
  30.       void run();//运行程序

  31.       //函数指针
  32.           void (*Middle)(); // 横/竖,中间
  33.           void (*Up)();
  34.       void (*Dwon)();
  35.       void (*Left)();
  36.       void (*Right)();

  37.       void  (*LeftUp)();
  38.       void (*RightUp)();
  39.       void (*LeftDwon)();
  40.       void (*RightDwon)();

  41. };
  42. #endif
复制代码

  1. //-------------------------------------------------------ps2.cpp文件----------------------------------------------------
  2. //---------------------------------------------------------------------------

  3. #include "ps2.h"

  4. //---------------------------------------------------------------------------
  5. ps2::ps2()
  6. {
  7.         X_Middle=480;
  8.         Y_Middle=480;
  9.         Middle=NULL;
  10.         Up=NULL;
  11.     Dwon=NULL;
  12.     Left=NULL;
  13.     Right=NULL;

  14.     LeftUp=NULL;
  15.     RightUp=NULL;
  16.     LeftDwon=NULL;
  17.     RightDwon=NULL;
  18. }

  19. void ps2::setXYvalue(int X,int Y)
  20. {
  21.         X_Middle=X;
  22.         Y_Middle=Y;
  23. }

  24. void ps2::init( int X,  int Y, int k)
  25. {
  26.         PIN_ANALOG_X=X;
  27.         PIN_ANALOG_Y=Y;
  28.         PIN_ANALOG_K=k;
  29.         pinMode(PIN_ANALOG_K, INPUT);  // 初始化 摇杆,中间开关
  30. }

  31. int ps2::getX_position()
  32. {
  33.         return x_position;
  34. }
  35. int ps2::getY_position()
  36. {
  37.         return y_position;
  38. }
  39. bool ps2::getKey()
  40. {
  41.         return k_pressed;
  42. }

  43. void ps2::run()
  44. {
  45.   k_pressed=digitalRead(PIN_ANALOG_K);       
  46.   x_position = analogRead(PIN_ANALOG_X);
  47.   y_position = analogRead(PIN_ANALOG_Y);
  48.   // 默认方向,中间
  49.   int x_direction = 0;
  50.   int y_direction = 0;
  51.   // 判定,横轴方向
  52.   if (x_position > X_Middle+80)
  53.     x_direction = 1; // 右
  54.   else
  55.           if (x_position < X_Middle-80)
  56.                 x_direction = 2; // 左
  57.   
  58.   // 判定,竖轴方向
  59.   if (y_position > Y_Middle+80)
  60.     y_direction = 6; // 上
  61.   else
  62.           if (y_position < Y_Middle-80)
  63.                 y_direction = 3; // 下



  64.     int direct = y_direction;
  65.   if (x_direction != 0){ // 判定,X轴方向叠加
  66.     direct = x_direction + y_direction;
  67.   }

  68.   switch (direct){
  69.     case 0: // 横/竖,中间
  70.                 if(Middle!=NULL)
  71.                         (*Middle)();
  72.       break;
  73.     case 1: // 右
  74.                 if(Right!=NULL)
  75.          (*Right)();      
  76.       break;
  77.     case 2: // 左
  78.                 if(Left!=NULL)
  79.                 (*Left)();
  80.       break;
  81.     case 3: // 上
  82.                 //Up();
  83.                 if(Up!=NULL)
  84.                         (*Up)();
  85.       break;
  86.     case 4: // 右上
  87.                 if(RightUp!=NULL)
  88.                 (*RightUp)();
  89.       break;
  90.     case 5: // 左上
  91.                 if(LeftUp!=NULL)
  92.                 (*LeftUp)();
  93.       break;
  94.     case 6: // 下
  95.                 if(Dwon!=NULL)
  96.                 (*Dwon)();
  97.       break;
  98.     case 7: // 右下
  99.                 if(RightDwon!=NULL)
  100.                 (*RightDwon)();
  101.       break;
  102.     case 8: // 左下
  103.                 if(LeftDwon!=NULL)
  104.                 (*LeftDwon)();
  105.       break;
  106.   }



  107. }
复制代码






回复

使用道具 举报

发表于 2012-11-2 18:16:47 | 显示全部楼层
把程序套在 代码里面把,好读一点。
回复 支持 反对

使用道具 举报

发表于 2012-11-2 18:31:05 | 显示全部楼层
函数指针
高端
回复 支持 反对

使用道具 举报

发表于 2012-11-2 20:31:43 | 显示全部楼层
函数指针就相当于高级语言里的事件
回复 支持 反对

使用道具 举报

发表于 2012-11-3 10:10:37 | 显示全部楼层
只用过c语言,lz这种编的是c++的范式,类啊什么的不是太懂。
回复 支持 反对

使用道具 举报

发表于 2013-11-18 12:58:41 来自手机 | 显示全部楼层
这个库可以控制舵机转动不?如何控制呢?谢谢谢!

回复 支持 反对

使用道具 举报

发表于 2014-4-25 23:26:03 | 显示全部楼层
学习了,谢谢lz
回复 支持 反对

使用道具 举报

发表于 2017-10-24 19:29:20 | 显示全部楼层
虽然没有完全看懂,但是很佩服,好好向楼主学习一下
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-23 23:15 , Processed in 0.041692 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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