STC15单片机PS2遥控器按键驱动代码详解
#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)
{
// 处理下键按下事件
}
// 其他按键处理类似
}
}
原文地址: https://www.cveoy.top/t/topic/mGYi 著作权归作者所有。请勿转载和采集!