#include <reg51.h>

sbit PS2_DAT = P3^2; // PS2数据线引脚定义 sbit PS2_CLK = P3^3; // PS2时钟线引脚定义

// PS2遥控器按键定义 #define PS2_KEY_SELECT 0x01 #define PS2_KEY_L3 0x02 #define PS2_KEY_R3 0x04 #define PS2_KEY_START 0x08 #define PS2_KEY_UP 0x10 #define PS2_KEY_RIGHT 0x20 #define PS2_KEY_DOWN 0x40 #define PS2_KEY_LEFT 0x80 #define PS2_KEY_L2 0x100 #define PS2_KEY_R2 0x200 #define PS2_KEY_L1 0x400 #define PS2_KEY_R1 0x800 #define PS2_KEY_TRIANGLE 0x1000 #define PS2_KEY_CIRCLE 0x2000 #define PS2_KEY_CROSS 0x4000 #define PS2_KEY_SQUARE 0x8000

// 延时函数 void delay(unsigned int i) { while(i--); }

// 发送一个字节到PS2遥控器 void ps2_send(unsigned char dat) { unsigned char i;

for(i=0; i<8; i++)
{
    // 发送数据位
    PS2_DAT = dat & 0x01;
    // 输出时钟脉冲
    PS2_CLK = 0;
    delay(1);
    PS2_CLK = 1;
    delay(1);
    dat >>= 1;
}

}

// 从PS2遥控器接收一个字节 unsigned char ps2_recv(void) { unsigned char i, dat = 0;

PS2_DAT = 1;
for(i=0; i<8; i++)
{
    // 输入时钟脉冲
    PS2_CLK = 0;
    delay(1);
    PS2_CLK = 1;
    delay(1);
    // 读取数据位
    dat >>= 1;
    if(PS2_DAT)
        dat |= 0x80;
}

return dat;

}

// 初始化PS2遥控器 void ps2_init(void) { // 发送开始命令 ps2_send(0x01); ps2_send(0x43); ps2_send(0x00); ps2_send(0x01); ps2_send(0x00); }

// 获取PS2遥控器按键值 unsigned int ps2_get_key(void) { unsigned char i, dat; unsigned int key = 0;

// 发送获取命令
ps2_send(0x01);
ps2_send(0x42);
ps2_send(0x00);
ps2_send(0x00);
ps2_send(0x00);
ps2_send(0x00);

// 接收按键值
dat = ps2_recv();
if(dat == 0x5A)
{
    for(i=0; i<2; i++)
    {
        key |= (ps2_recv() << (8*i));
    }
}

return key;

}

// 主函数 void main() { unsigned int key;

ps2_init();

while(1)
{
    key = ps2_get_key();
    // 根据按键值处理相应的事件
    if(key & PS2_KEY_UP)
    {
        // 处理上键按下事件
    }
    if(key & PS2_KEY_DOWN)
    {
        // 处理下键按下事件
    }
    // 其他按键处理类似
}

}

STC15单片机PS2遥控器按键驱动代码详解

原文地址: https://www.cveoy.top/t/topic/mGYi 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录