falcon002 2023-08-19 00:57 采纳率: 0%
浏览 15

51单片机怎么用ps2手柄

spi信号能写,但就是不知道数据怎么处理,以及怎么调试手柄按键值

#include <stc12c5a60s2.h>
#include <ps2.h>
#include <intrins.h>
#include <stdio.h>
#define    uint unsigned int
#define uchar unsigned char

sbit CMD=P1^5;          
sbit DAT=P1^6;
sbit CLK=P1^7;
sbit CS=P1^4;
sbit led=P1^0;
uchar date,back,temp,b1,b2,b3,b4,b5;
uchar command[9]={0x01,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
uchar read[9];

delay5us()        //@11.0592MHz
{
    unsigned char data i;

    _nop_();
    _nop_();
    _nop_();
    i = 10;
    while (--i);
}

UARTInit()
{
    EA=1;
    ES=1;
    SM0=0;
    SM1=1;
    REN=1;
    TR1=1;
    TMOD=0X20;
    TH1=0XFD;
    TL1=0XFD;
}

UART()interrupt 4
{
    if(RI)
    {
        back=SBUF;
        RI=0;
        temp=back;
        SBUF=temp;
    }
//    if(TI)
//        TI=0;
}

delay(uint z)
{
    uint x,y;
    for(x=z;x>0;x--)
    for(y=114;y>0;y--);
}

PS2_cmd(uchar cmd)
{
    uchar i,j=1,readdat;
    for(i=0;i<8;i++)
    {
        CLK=1;
        if(cmd&0x80)
        {
            CMD=1;
        }  
        else
        {
            CMD=0;
        }
        cmd<<=1;
        CLK=0;
        if(DAT)
            readdat+=j;
        j<<=1;
        _nop_();
    }
    CMD=1;    
    return readdat;
}

PS2_read()
{
    uchar i;
    CS=0;
    _nop_();
    for(i=0;i<9;i++)
    read[i]=PS2_cmd(command[i]);
    _nop_();
    CS=1;
}

distinguish_mode()
{
    CS=0;
    _nop_();
    PS2_cmd(command[0]);
    PS2_cmd(command[1]);
    _nop_();
    CS=1;
    if(read[1]==0x73)
        return 0;
    else   
        return 1;
}

PS2_Init()
{
    CS=0;
    delay5us();
    PS2_cmd(0x01);
    PS2_cmd(0x42);
    PS2_cmd(0x00);
    PS2_cmd(0x00);
    PS2_cmd(0x00);
    delay5us();
    CS=1;
}

start_config()
{
    CS=0;
    PS2_cmd(0x01);
    PS2_cmd(0x43);
    PS2_cmd(0x00);
    PS2_cmd(0x01);
    PS2_cmd(0x00);
    CS=1;
}

TurnonAnalogMode()
{
    CS=0;
    PS2_cmd(0x01);
    PS2_cmd(0x44);
    PS2_cmd(0x00);
    PS2_cmd(0x01);
    PS2_cmd(0x03);
    PS2_cmd(0x00);
    PS2_cmd(0x00);
    PS2_cmd(0x00);
    PS2_cmd(0x00);
    CS=1;
}

SetupMotorCommandMapping()
{
    CS=0;
    PS2_cmd(0x01);
    PS2_cmd(0x4d);
    PS2_cmd(0x00);
    PS2_cmd(0xff);
    PS2_cmd(0xff);
    PS2_cmd(0xff);
    PS2_cmd(0xff);
    PS2_cmd(0xff);
    PS2_cmd(0xff);
    CS=1;
}

ExitConfigMode()
{
    CS=0;
    PS2_cmd(0x01);
    PS2_cmd(0x43);
    PS2_cmd(0x00);
    PS2_cmd(0x00);
    PS2_cmd(0x5a);
    PS2_cmd(0x5a);
    PS2_cmd(0x5a);
    PS2_cmd(0x5a);
    PS2_cmd(0x5a);
    CS=1;
}

main()
{
    PS2_Init();
    start_config();
    TurnonAnalogMode();
    SetupMotorCommandMapping();
    ExitConfigMode();
    UARTInit();
    led=distinguish_mode();
    while(1)
    {     
        TI=1;
        printf("%x ",b2);
        while(!TI)
            TI=0;
        delay(1000);
  
    }
} 

ps2.h那个头文件我没用

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-08-19 04:04
    关注

    【以下回答由 GPT 生成】

    这段代码是针对在STM32上连接PS2手柄的一个例子。下面是对代码中的每个功能函数的解释,并提出一些建议来优化代码。

    1. delay5us()函数

    该函数用于产生一个约为5微秒的延迟。这个延迟函数可能用于同步时钟。

    2. UARTInit()函数

    该函数初始化STM32的UART通信,包括设置通信模式、使能UART中断等。

    3. UART()中断函数

    该函数处理UART接收中断,当收到数据时,将接收到的数据进行处理并回传。

    4. delay()函数

    该函数用于产生一个延迟,具体的延迟时间由输入的参数决定。

    5. PS2_cmd()函数

    该函数用于向PS2手柄发送命令(cmd),并返回手柄响应的数据。通过CLK引脚控制时钟,通过CMD引脚控制数据线的电平,通过DAT引脚读取数据。

    6. PS2_read()函数

    该函数用于从PS2手柄读取数据,发送一系列命令给手柄,根据每个命令的响应将返回的数据存储在read数组中。

    7. distinguish_mode()函数

    该函数用于向手柄发送一系列命令,以确定手柄的模式。

    为了优化代码,以下是一些建议:

    1. 根据实际使用的STM32型号,确认头文件是否正确引入。头文件应该指定正确的MCU型号,以确保正确的寄存器映射。

    2. 给代码添加必要的注释,解释每个函数的作用和输入/输出参数等。

    3. 检查代码中的命名规范,变量和函数应使用有意义的名字。

    4. 添加错误检查和处理代码,例如检查命令是否成功发送和手柄是否有响应。

    5. 在PS2_cmd()函数中,添加参数检查以确保输入命令的有效性。

    6. 在PS2_read()函数中,检查返回的数据是否正确,并在需要时进行错误处理。

    7. 对于UARTInit()函数和UART()中断函数,确保STM32的UART配置与实际需要相符。

    这是对代码的初步检查和优化建议。但是由于我无法查看引用的头文件和一些函数使用的具体细节,所以无法做出更具体的建议。如果您有进一步的问题或需要更多的帮助,请提供更多的细节。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 8月19日

悬赏问题

  • ¥15 找一个QT页面+目标识别(行人检测)的开源项目
  • ¥15 有没有整苹果智能分拣线上图像数据
  • ¥20 有没有人会这个东西的
  • ¥15 cfx考虑调整“enforce system memory limit”参数的设置
  • ¥30 航迹分离,航迹增强,误差分析
  • ¥15 Chrome Manifest扩展引用Ajax-hook库拦截请求失败
  • ¥15 用Ros中的Topic通讯方式控制小乌龟的速度,走矩形;编写订阅器代码
  • ¥15 LLM accuracy检测
  • ¥15 pycharm添加远程解释器报错
  • ¥15 如何让子窗口鼠标滚动独立,不要传递消息给主窗口