久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7746|回復: 7
打印 上一主題 下一主題
收起左側

PS2手柄控制4個燈閃的STM32程序源碼

[復制鏈接]
跳轉到指定樓層
樓主
索尼的 PS2游戲手柄, 通過上下左右4個按鍵來控制 單片機的4個燈亮滅。  同時 也可以控制 游戲手柄的震動




源程序如下:
  1. # include "public.h"
  2. # include "printf.h"
  3. # include "systick.h"
  4. # include "ps2.h"
  5. # include "led.h"


  6. int main()
  7. {        
  8.         u8 key;
  9.         LED_Init();
  10.         printf_init();        //printf串口初始化
  11.         PS2_Init();
  12.         led_display();
  13.         //PS2_SetInit();                 //配配置初始化,配置“紅綠燈模式”,并選擇是否可以修改
  14.                              //開啟震動模式
  15.                 printf(" 已開啟游戲手柄\r\n");        
  16.         /*
  17.         while(1)
  18.         {
  19.                 key=PS2_DataKey();
  20.                 if(key!=0)                   //有按鍵按下
  21.             {
  22.                         printf("  \r\n   %d  is  light  \r\n",Data[1]);//ID
  23.                         printf("  \r\n   %d  is  pressed  \r\n",key);
  24.                         if(key == 11)
  25.                         {
  26.                                 PS2_Vibration(0xFF,0x00);  //發出震動后必須有延時  delay_ms(1000);
  27.                                 delay_ms(500);
  28.                         }
  29.                         else if(key == 12)
  30.                         {
  31.                                 PS2_Vibration(0x00,0xFF);  //發出震動后必須有延時  delay_ms(1000);
  32.                                 delay_ms(500);
  33.                         }
  34.                         else
  35.                                  PS2_Vibration(0x00,0x00);
  36.             }
  37.                 printf(" %5d %5d %5d %5d\r\n",PS2_AnologData(PSS_LX),PS2_AnologData(PSS_LY),
  38.                                               PS2_AnologData(PSS_RX),PS2_AnologData(PSS_RY) );
  39.                 delay_ms(60000);
  40.         }         
  41. */        
  42.         while (1)
  43.         {
  44.                 key=PS2_DataKey();
  45.                 if(key!=0)                   //有按鍵按下
  46.                 {
  47.                                         printf("  \r\n   %d  is  light  \r\n",Data[1]);//ID
  48.                                         printf("  \r\n   %d  is  pressed  \r\n",key);
  49.                                         if(key == 5)
  50.                                         {
  51.                                                 printf(" 按鍵向上 !\r\n");
  52.                                                 led1();
  53.                                         }
  54.                                         else if(key == 7)
  55.                                         {
  56.                                                 printf(" 按鍵向下 !\r\n");
  57.                                                 led2();
  58.                                         }
  59.                                         else if(key == 6)
  60.                                         {
  61.                                                 printf(" 按鍵向右 !\r\n");
  62.                                                 led3();
  63.                                         }
  64.                                         else if(key == 8)
  65.                                         {
  66.                                                 printf(" 按鍵向左 !\r\n");
  67.                                                 led4();
  68.                                         }
  69.                                         printf(" 輸入成功!\r\n");
  70.           }
  71.                 delay_us(60000);
  72.         }
  73.         
  74. }



復制代碼
  1. #include "ps2.h"
  2. #include "systick.h"


  3. u16 Handkey;        // 按鍵值讀取,零時存儲。
  4. u8 Comd[2]={0x01,0x42};        //開始命令。請求數據
  5. u8 Data[9]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //數據存儲數組
  6. u16 MASK[]={
  7.     PSB_SELECT,
  8.     PSB_L3,
  9.     PSB_R3 ,
  10.     PSB_START,
  11.     PSB_PAD_UP,
  12.     PSB_PAD_RIGHT,
  13.     PSB_PAD_DOWN,
  14.     PSB_PAD_LEFT,
  15.     PSB_L2,
  16.     PSB_R2,
  17.     PSB_L1,
  18.     PSB_R1 ,
  19.     PSB_GREEN,
  20.     PSB_RED,
  21.     PSB_BLUE,
  22.     PSB_PINK
  23.         };        //按鍵值與按鍵明

  24. //手柄接口初始化    輸入  DI->PB12
  25. //                  輸出  DO->PB13    CS->PB14  CLK->PB15
  26. void PS2_Init(void)
  27. {                
  28.   GPIO_InitTypeDef  GPIO_InitStructure;

  29.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//使能GPIOF時鐘

  30.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
  31.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//普通輸出模式
  32.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//100MHz
  33.   GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化
  34.          
  35.        
  36.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
  37.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;//普通輸出模式
  38.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//100MHz
  39.   GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化
  40. }

  41. //向手柄發送命令
  42. void PS2_Cmd(u8 CMD)
  43. {
  44.         volatile u16 ref=0x01;
  45.         Data[1] = 0;
  46.         for(ref=0x01;ref<0x0100;ref<<=1)
  47.         {
  48.                 if(ref&CMD)
  49.                 {
  50.                         DO_H;                   //輸出一位控制位
  51.                 }
  52.                 else DO_L;

  53.                 CLK_H;                        //時鐘拉高
  54.                 delay_us(10);
  55.                 CLK_L;
  56.                 delay_us(10);
  57.                 CLK_H;
  58.                 if(DI)
  59.                         Data[1] = ref|Data[1];
  60.         }
  61.         delay_us(16);
  62. }
  63. //判斷是否為紅燈模式,0x41=模擬綠燈,0x73=模擬紅燈
  64. //返回值;0,紅燈模式
  65. //                  其他,其他模式
  66. u8 PS2_RedLight(void)
  67. {
  68.         CS_L;
  69.         PS2_Cmd(Comd[0]);  //開始命令
  70.         PS2_Cmd(Comd[1]);  //請求數據
  71.         CS_H;
  72.         if( Data[1] == 0X73)   return 0 ;
  73.         else return 1;

  74. }
  75. //讀取手柄數據
  76. void PS2_ReadData(void)
  77. {
  78.         volatile u8 byte=0;
  79.         volatile u16 ref=0x01;
  80.         CS_L;
  81.         PS2_Cmd(Comd[0]);  //開始命令
  82.         PS2_Cmd(Comd[1]);  //請求數據
  83.         for(byte=2;byte<9;byte++)          //開始接受數據
  84.         {
  85.                 for(ref=0x01;ref<0x100;ref<<=1)
  86.                 {
  87.                         CLK_H;
  88.                         delay_us(10);
  89.                         CLK_L;
  90.                         delay_us(10);
  91.                         CLK_H;
  92.                       if(DI)
  93.                       Data[byte] = ref|Data[byte];
  94.                 }
  95.         delay_us(16);
  96.         }
  97.         CS_H;
  98. }

  99. //對讀出來的PS2的數據進行處理,只處理按鍵部分  
  100. //只有一個按鍵按下時按下為0, 未按下為1
  101. u8 PS2_DataKey()
  102. {
  103.         u8 index;

  104.         PS2_ClearData();
  105.         PS2_ReadData();

  106.         Handkey=(Data[4]<<8)|Data[3];     //這是16個按鍵  按下為0, 未按下為1
  107.         for(index=0;index<16;index++)
  108.         {            
  109.                 if((Handkey&(1<<(MASK[index]-1)))==0)
  110.                 return index+1;
  111.         }
  112.         return 0;          //沒有任何按鍵按下
  113. }

  114. //得到一個搖桿的模擬量         范圍0~256
  115. u8 PS2_AnologData(u8 button)
  116. {
  117.         return Data[button];
  118. }

  119. //清除數據緩沖區
  120. void PS2_ClearData()
  121. {
  122.         u8 a;
  123.         for(a=0;a<9;a++)
  124.                 Data[a]=0x00;
  125. }
  126. /******************************************************
  127. Function:    void PS2_Vibration(u8 motor1, u8 motor2)
  128. Description: 手柄震動函數,
  129. Calls:                 void PS2_Cmd(u8 CMD);
  130. Input: motor1:右側小震動電機 0x00關,其他開
  131.            motor2:左側大震動電機 0x40~0xFF 電機開,值越大 震動越大
  132. ******************************************************/
  133. void PS2_Vibration(u8 motor1, u8 motor2)
  134. {
  135.         CS_L;
  136.         delay_us(16);
  137.     PS2_Cmd(0x01);  //開始命令
  138.         PS2_Cmd(0x42);  //請求數據
  139.         PS2_Cmd(0X00);
  140.         PS2_Cmd(motor1);
  141.         PS2_Cmd(motor2);
  142.         PS2_Cmd(0X00);
  143.         PS2_Cmd(0X00);
  144.         PS2_Cmd(0X00);
  145.         PS2_Cmd(0X00);
  146.         CS_H;
  147.         delay_us(16);  
  148. }
  149. //short poll
  150. void PS2_ShortPoll(void)
  151. {
  152.         CS_L;
  153.         delay_us(16);
  154.         PS2_Cmd(0x01);  
  155.         PS2_Cmd(0x42);  
  156.         PS2_Cmd(0X00);
  157.         PS2_Cmd(0x00);
  158.         PS2_Cmd(0x00);
  159.         CS_H;
  160.         delay_us(16);       
  161. }
  162. //進入配置
  163. void PS2_EnterConfing(void)
  164. {
  165.     CS_L;
  166.         delay_us(16);
  167.         PS2_Cmd(0x01);  
  168.         PS2_Cmd(0x43);  
  169.         PS2_Cmd(0X00);
  170.         PS2_Cmd(0x01);
  171.         PS2_Cmd(0x00);
  172.         PS2_Cmd(0X00);
  173.         PS2_Cmd(0X00);
  174.         PS2_Cmd(0X00);
  175.         PS2_Cmd(0X00);
  176.         CS_H;
  177.         delay_us(16);
  178. }
  179. //發送模式設置
  180. void PS2_TurnOnAnalogMode(void)
  181. {
  182.         CS_L;
  183.         PS2_Cmd(0x01);  
  184.         PS2_Cmd(0x44);  
  185.         PS2_Cmd(0X00);
  186.         PS2_Cmd(0x01); //analog=0x01;digital=0x00  軟件設置發送模式
  187.         PS2_Cmd(0xEE); //Ox03鎖存設置,即不可通過按鍵“MODE”設置模式。
  188.                                    //0xEE不鎖存軟件設置,可通過按鍵“MODE”設置模式。
  189.         PS2_Cmd(0X00);
  190.         PS2_Cmd(0X00);
  191.         PS2_Cmd(0X00);
  192.         PS2_Cmd(0X00);
  193.         CS_H;
  194.         delay_us(16);
  195. }
  196. //振動設置
  197. void PS2_VibrationMode(void)
  198. {
  199.         CS_L;
  200.         delay_us(16);
  201.         PS2_Cmd(0x01);  
  202.         PS2_Cmd(0x4D);  
  203.         PS2_Cmd(0X00);
  204.         PS2_Cmd(0x00);
  205.         PS2_Cmd(0X01);
  206.         CS_H;
  207.         delay_us(16);       
  208. }
  209. ……………………

  210. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

全部資料51hei下載地址:
PS2 震動+上下左右按鍵.rar (910.7 KB, 下載次數: 68)


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:321034 發表于 2018-8-30 20:46 | 只看該作者
發錯了  不好意思
回復

使用道具 舉報

板凳
ID:321034 發表于 2018-8-30 20:47 | 只看該作者
源程序 是這個,上面那個發錯了
#include "delay.h"
#include "sys.h"
#include "pwm.h"
# include "ps2.h"
# include "stdio.h"


int main(void)
{       
         u8 angle;
         PS2_Init();
         delay_init();                     //延時函數初始化          

                  //TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
           //選擇定時器模式:TIM脈沖寬度調制模式2
        TIM1_PWM_Init(199,7199);//不分頻。PWM頻率===(7200*200)/72000000=0.02=20ms
         
  while(1)
        {
                PS2_ClearData();   //清除緩存
                PS2_ReadData();           //讀數據
                angle = (PS2_AnologData(PSS_RX)/5)*3+15;  //只產生15°~165°的運動范圍
                SERVO1(angle);
                delay_ms(50);
    }
}

回復

使用道具 舉報

地板
ID:405033 發表于 2019-2-25 20:19 | 只看該作者
樓樓能否解答一下,這個手柄該怎么與單片機接線,我的手柄上有5個接口,vcc,gnd,VRX,VRY,SW,這些該怎么接線,用的是mini版的stm32
回復

使用道具 舉報

5#
ID:485634 發表于 2019-3-6 15:33 | 只看該作者
學習一下
回復

使用道具 舉報

6#
ID:302850 發表于 2019-5-24 15:19 來自手機 | 只看該作者
標記一下,這個可能會用到
回復

使用道具 舉報

7#
ID:544885 發表于 2019-5-24 16:13 | 只看該作者
共享代碼的人是值得尊敬的人
回復

使用道具 舉報

8#
ID:554410 發表于 2019-6-10 16:49 | 只看該作者
樓主,最近還在看stm32和ps2么
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品国产一区久久 | 国产精品成人免费 | 日韩中文字幕一区二区 | 91麻豆精品国产91久久久资源速度 | 国产欧美一区二区三区在线看 | 在线国产一区二区三区 | 亚洲成人国产综合 | 成人精品| 一本色道精品久久一区二区三区 | 羞羞的视频免费在线观看 | 久久免费精彩视频 | 青草视频在线 | wwwxxx日本在线观看 | 成人精品在线观看 | 免费精品一区 | 亚洲三区在线观看 | 国产成人一区二区三区精 | 亚洲网在线 | 成人在线精品 | 91在线一区 | 一级毛片,一级毛片 | 欧美一区二区三区久久精品视 | 一级片视频免费 | 成人久久一区 | 午夜精品视频一区 | 亚洲码欧美码一区二区三区 | 国产精品99久久久久久大便 | 一区二区国产在线 | 色婷婷av99xx | 天天插天天操 | 超碰97在线免费 | av在线一区二区 | 亚洲精品免费在线观看 | 欧美中文字幕在线观看 | 亚洲福利视频一区二区 | 久色激情| 在线婷婷 | 夜夜操操操 | 久久国产精品视频免费看 | 琪琪午夜伦伦电影福利片 | 日韩一二区 |