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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 4538|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

基于STM32的PS2手柄智能車(chē)程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:433935 發(fā)表于 2018-12-2 08:41 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式

單片機(jī)源程序如下:
  1. #include <pstwo.h>

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

  23. //手柄接口初始化    輸入  DI->PB12
  24. //                  輸出  DO->PB13    CS->PB14  CLK->PB15
  25. void PS2_Init(void)
  26. {
  27.     //輸入  DI->PB12
  28.         RCC->APB2ENR|=1<<3;     //使能PORTB時(shí)鐘
  29.         GPIOB->CRH&=0XFFF0FFFF;//PB12設(shè)置成輸入        默認(rèn)下拉  
  30.         GPIOB->CRH|=0X00080000;   

  31.     //  DO->PB13    CS->PB14  CLK->PB15
  32.         RCC->APB2ENR|=1<<3;    //使能PORTB時(shí)鐘                                
  33.         GPIOB->CRH&=0X000FFFFF;
  34.         GPIOB->CRH|=0X33300000;//PB13、PB14、PB15 推挽輸出                                                                                                      
  35. }

  36. //向手柄發(fā)送命令
  37. void PS2_Cmd(u8 CMD)
  38. {
  39.         volatile u16 ref=0x01;
  40.         Data[1] = 0;
  41.         for(ref=0x01;ref<0x0100;ref<<=1)
  42.         {
  43.                 if(ref&CMD)
  44.                 {
  45.                         DO_H;                   //輸出以為控制位
  46.                 }
  47.                 else DO_L;

  48.                 CLK_H;                        //時(shí)鐘拉高
  49.                 delay_us(50);
  50.                 CLK_L;
  51.                 delay_us(50);
  52.                 CLK_H;
  53.                 if(DI)
  54.                         Data[1] = ref|Data[1];
  55.         }
  56. }
  57. //判斷是否為紅燈模式
  58. //返回值;0,紅燈模式
  59. //                  其他,其他模式
  60. u8 PS2_RedLight(void)
  61. {
  62.         CS_L;
  63.         PS2_Cmd(Comd[0]);  //開(kāi)始命令
  64.         PS2_Cmd(Comd[1]);  //請(qǐng)求數(shù)據(jù)
  65.         CS_H;
  66.         if( Data[1] == 0X73)
  67.                    return 0;
  68.         else
  69.                    return 1;

  70. }
  71. //讀取手柄數(shù)據(jù)
  72. void PS2_ReadData(void)
  73. {
  74.         volatile u8 byte=0;
  75.         volatile u16 ref=0x01;

  76.         CS_L;

  77.         PS2_Cmd(Comd[0]);  //開(kāi)始命令
  78.         PS2_Cmd(Comd[1]);  //請(qǐng)求數(shù)據(jù)

  79.         for(byte=2;byte<9;byte++)          //開(kāi)始接受數(shù)據(jù)
  80.         {
  81.                 for(ref=0x01;ref<0x100;ref<<=1)
  82.                 {
  83.                         CLK_H;
  84.                         CLK_L;
  85.                         delay_us(50);
  86.                         CLK_H;
  87.                       if(DI)
  88.                       Data[byte] = ref|Data[byte];
  89.                 }
  90.         delay_us(50);
  91.         }
  92.         CS_H;        
  93. }

  94. //對(duì)讀出來(lái)的PS2的數(shù)據(jù)進(jìn)行處理      只處理了按鍵部分         默認(rèn)數(shù)據(jù)是紅燈模式  只有一個(gè)按鍵按下時(shí)
  95. //按下為0, 未按下為1
  96. u8 PS2_DataKey()
  97. {
  98.         u8 index;

  99.         PS2_ClearData();
  100.         PS2_ReadData();

  101.         Handkey=(Data[4]<<8)|Data[3];     //這是16個(gè)按鍵  按下為0, 未按下為1
  102.         for(index=0;index<16;index++)
  103.         {            
  104.                 if((Handkey&(1<<(MASK[index]-1)))==0)
  105.                 return index+1;
  106.         }
  107.         return 0;          //沒(méi)有任何按鍵按下
  108. }

  109. //得到一個(gè)搖桿的模擬量         范圍0~256
  110. u8 PS2_AnologData(u8 button)
  111. {
  112.         return Data[button];
  113. }

  114. //清除數(shù)據(jù)緩沖區(qū)
  115. void PS2_ClearData()
  116. {
  117.         u8 a;
  118.         for(a=0;a<9;a++)
  119.                 Data[a]=0x00;
  120. }
復(fù)制代碼

所有資料51hei提供下載:
部分程序.7z (183.17 KB, 下載次數(shù): 61)


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:458322 發(fā)表于 2018-12-29 20:57 | 只看該作者
請(qǐng)問(wèn)此處的PB12是不是對(duì)應(yīng)單片機(jī)上的串口B12?如果可以的話,請(qǐng)盡快回復(fù)好嗎?謝謝
回復(fù)

使用道具 舉報(bào)

板凳
ID:648970 發(fā)表于 2019-12-16 19:49 | 只看該作者
往昔呀 發(fā)表于 2018-12-29 20:57
請(qǐng)問(wèn)此處的PB12是不是對(duì)應(yīng)單片機(jī)上的串口B12?如果可以的話,請(qǐng)盡快回復(fù)好嗎?謝謝

很多板子上的gpiob12寫(xiě)的就是b12,省空間
回復(fù)

使用道具 舉報(bào)

地板
ID:327903 發(fā)表于 2020-4-23 02:03 | 只看該作者
//PS2_ReadData(); //讀手柄數(shù)據(jù)  //data8=PS2_AnologData(PSS_LY)-127;        //紅燈模擬量  PSS_RX  PSS_RY  PSS_LX  PSS_LY
回復(fù)

使用道具 舉報(bào)

5#
ID:932417 發(fā)表于 2021-7-9 09:30 | 只看該作者
請(qǐng)問(wèn)這個(gè)stm32f103能用嗎
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 成人精品视频在线观看 | 亚洲综合一区二区三区 | 精品国产精品 | 欧美一二精品 | 欧美成人免费在线 | 综合色播 | 91网在线观看 | www.国产精品 | 中文字幕一区二区三区四区不卡 | 成人影音| 成人福利网站 | 久久国产区 | 色婷婷综合成人av | 91福利在线导航 | 天堂成人国产精品一区 | 中文字幕一区在线观看视频 | 午夜精品一区二区三区在线观看 | 中文字幕在线观看一区 | 一区二区不卡视频 | 亚洲成av人片在线观看 | 日韩在线精品强乱中文字幕 | 国产99久久精品一区二区永久免费 | 91精品国产综合久久婷婷香蕉 | 成人国产精品久久 | 四虎永久在线精品免费一区二 | 欧美h版| 久久精品日产第一区二区三区 | 欧美片网站免费 | 91影院 | 国产午夜精品久久久 | 欧美va大片 | 在线看亚洲 | 成人妇女免费播放久久久 | 精品国产成人 | 久久久久久久久久久久一区二区 | 国产精品久久久av | 午夜精品久久久久久久久久久久久 | 欧美精品久久 | 中文字幕第十一页 | 人人人人干 | 99精品国产一区二区三区 |