|
單片機(jī)源程序如下:
- #include <pstwo.h>
- u16 Handkey;
- u8 Comd[2]={0x01,0x42}; //開(kāi)始命令。請(qǐng)求數(shù)據(jù)
- u8 Data[9]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //數(shù)據(jù)存儲(chǔ)數(shù)組
- u16 MASK[]={
- PSB_SELECT,
- PSB_L3,
- PSB_R3 ,
- PSB_START,
- PSB_PAD_UP,
- PSB_PAD_RIGHT,
- PSB_PAD_DOWN,
- PSB_PAD_LEFT,
- PSB_L2,
- PSB_R2,
- PSB_L1,
- PSB_R1 ,
- PSB_GREEN,
- PSB_RED,
- PSB_BLUE,
- PSB_PINK
- }; //按鍵值與按鍵明
- //手柄接口初始化 輸入 DI->PB12
- // 輸出 DO->PB13 CS->PB14 CLK->PB15
- void PS2_Init(void)
- {
- //輸入 DI->PB12
- RCC->APB2ENR|=1<<3; //使能PORTB時(shí)鐘
- GPIOB->CRH&=0XFFF0FFFF;//PB12設(shè)置成輸入 默認(rèn)下拉
- GPIOB->CRH|=0X00080000;
- // DO->PB13 CS->PB14 CLK->PB15
- RCC->APB2ENR|=1<<3; //使能PORTB時(shí)鐘
- GPIOB->CRH&=0X000FFFFF;
- GPIOB->CRH|=0X33300000;//PB13、PB14、PB15 推挽輸出
- }
- //向手柄發(fā)送命令
- void PS2_Cmd(u8 CMD)
- {
- volatile u16 ref=0x01;
- Data[1] = 0;
- for(ref=0x01;ref<0x0100;ref<<=1)
- {
- if(ref&CMD)
- {
- DO_H; //輸出以為控制位
- }
- else DO_L;
- CLK_H; //時(shí)鐘拉高
- delay_us(50);
- CLK_L;
- delay_us(50);
- CLK_H;
- if(DI)
- Data[1] = ref|Data[1];
- }
- }
- //判斷是否為紅燈模式
- //返回值;0,紅燈模式
- // 其他,其他模式
- u8 PS2_RedLight(void)
- {
- CS_L;
- PS2_Cmd(Comd[0]); //開(kāi)始命令
- PS2_Cmd(Comd[1]); //請(qǐng)求數(shù)據(jù)
- CS_H;
- if( Data[1] == 0X73)
- return 0;
- else
- return 1;
- }
- //讀取手柄數(shù)據(jù)
- void PS2_ReadData(void)
- {
- volatile u8 byte=0;
- volatile u16 ref=0x01;
- CS_L;
- PS2_Cmd(Comd[0]); //開(kāi)始命令
- PS2_Cmd(Comd[1]); //請(qǐng)求數(shù)據(jù)
- for(byte=2;byte<9;byte++) //開(kāi)始接受數(shù)據(jù)
- {
- for(ref=0x01;ref<0x100;ref<<=1)
- {
- CLK_H;
- CLK_L;
- delay_us(50);
- CLK_H;
- if(DI)
- Data[byte] = ref|Data[byte];
- }
- delay_us(50);
- }
- CS_H;
- }
- //對(duì)讀出來(lái)的PS2的數(shù)據(jù)進(jìn)行處理 只處理了按鍵部分 默認(rèn)數(shù)據(jù)是紅燈模式 只有一個(gè)按鍵按下時(shí)
- //按下為0, 未按下為1
- u8 PS2_DataKey()
- {
- u8 index;
- PS2_ClearData();
- PS2_ReadData();
- Handkey=(Data[4]<<8)|Data[3]; //這是16個(gè)按鍵 按下為0, 未按下為1
- for(index=0;index<16;index++)
- {
- if((Handkey&(1<<(MASK[index]-1)))==0)
- return index+1;
- }
- return 0; //沒(méi)有任何按鍵按下
- }
- //得到一個(gè)搖桿的模擬量 范圍0~256
- u8 PS2_AnologData(u8 button)
- {
- return Data[button];
- }
- //清除數(shù)據(jù)緩沖區(qū)
- void PS2_ClearData()
- {
- u8 a;
- for(a=0;a<9;a++)
- Data[a]=0x00;
- }
復(fù)制代碼
所有資料51hei提供下載:
部分程序.7z
(183.17 KB, 下載次數(shù): 61)
2024-10-26 16:55 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|