/******************************************************************************************************
========================================名称:手柄解析例程=============================================
========================================所属:杭州众灵科技有限公司=====================================
========================================时间:2016年6月21日============================================
========================================编写:ZL-Tech================================================== =======================================
========================================功能简介:按下按钮,向串口发送解析对应的按钮===================
说明:
红灯模式、绿灯模式两种模式下处理。
按下对应按钮,串口1返回对应按钮名称。
红灯模式下摇杆模拟数值有效,绿灯模式下无效。
关于寄存器的设置,可以参考STC12C5A60S2.pdf文档,里面有详细介绍。
******************************************************************************************************/
#include "stc12c5a60s2.h" //stc12头文件
#include <stdio.h> //输入输出函数头文件
#include <string.h> //字符头文件
/***********************************宏定义*******************************************/
#define beep_on() {beep = 0;} //蜂鸣器打
#define beep_off() {beep = 1;} //蜂鸣器关
#define interrupt_open() {EA = 1;} //中断开
#define interrupt_close() {EA = 0;} //中断关
#define UART_BUF_SIZE 64 //字符接收数组大小
#define START_CMD 0x01 //手柄起始指令
#define ASK_DAT_CMD 0x42 //手柄应答指令
#define PSX_GREEN_MODE 0x41 //手柄绿灯模式对应码
#define PSX_RED_MODE 0x73 //手柄红灯模式对应码
#define PS2_CMD_NUM 16 //手柄按钮数
#define PSX_BUF_SIZE 9 //手柄数组大小
#define CMD_RETURN_SIZE 50 //串口打印数组大小
#define L1_RELEASE 0x01 //设置L1键弹起标志
#define L2_RELEASE 0x02 //设置L2键弹起标志
#define R1_RELEASE 0x03 //设置R1键弹起标志
#define R2_RELEASE 0x04 //设置R2键弹起标志
#define LU_RELEASE 0x05 //设置LU键弹起标志
#define LD_RELEASE 0x06 //设置LD键弹起标志
#define LL_RELEASE 0x07 //设置LL键弹起标志
#define LR_RELEASE 0x08 //设置LR键弹起标志
#define RU_RELEASE 0x09 //设置RU键弹起标志
#define RD_RELEASE 0x10 //设置RD键弹起标志
#define RL_RELEASE 0x11 //设置RL键弹起标志
#define RR_RELEASE 0x12 //设置RR键弹起标志
#define SE_RELEASE 0x13 //设置SE键弹起标志
#define ST_RELEASE 0x14 //设置ST键弹起标志
#define AL_RELEASE 0x15 //设置AL键弹起标志
#define AR_RELEASE 0x16 //设置AR键弹起标志
/***********************************IO位定义*******************************************/
sbit nled = P4^1; //指示灯
sbit beep = P4^0; //蜂鸣器
sbit PS2_DAT = P2^0; //pin1
sbit PS2_CMD = P2^1; //pin2
sbit PS2_ATT = P2^2; //pin6
sbit PS2_CLK = P2^3; //pin7
unsigned char uart_get_ok; //中断标志位
unsigned char psx_buf[PSX_BUF_SIZE];
unsigned char cmd_return[CMD_RETURN_SIZE];
unsigned char deal_flag = 0; //处理标志
unsigned char release_flag = 0; //弹起标志
unsigned char al_value, ar_value, al_value_bak, ar_value_bak;
/***********************************函数声明*******************************************/
void system_init(void); //系统初始化
void io_init(void); //IO初始化函数
void uart1_init(void); //串口1初始化函数
void uart1_send_str(unsigned char *s); //串口1字符发送函数
void uart1_send_nbyte(unsigned char *s, unsigned int len); //串口1多字节发送函数
void delay_ms(unsigned int t); //ms级别延时
void delay(unsigned int t); //us级别延时
void psx_init(void); //手柄初始化
unsigned char psx_transfer(unsigned char dat); //手柄指令解析
void psx_write_read(unsigned char *get_buf); //手柄读写
void handle_psx_green(void); //手柄处理函数
void handle_psx_red(void);
/*=========================================主函数================================================
函数名:main
功能介绍:程序运行入口
函数参数:无
返回值:无
===============================================================================================*/
void main(void) { //主函数
system_init(); //系统初始化
while(1) {
handle_psx_green(); //处理绿灯模式
handle_psx_red(); //处理红灯模式
delay_ms(50);
}
}
/*=========================================系统初始化============================================
函数名:system_init
功能介绍:各个功能函数的初始化设置
函数参数:无
返回值:无
===============================================================================================*/
void system_init(void) {
io_init(); //IO初始化
uart1_init(); //串口1初始化
uart1_send_str("uart1 init ok!\r\n"); //串口打印信息
psx_init(); //手柄初始化
/////////////////////////////////////////////////////////////////////////////////////////////////
beep_on();delay_ms(100);beep_off();delay_ms(100);
beep_on();delay_ms(100);beep_off();delay_ms(100); //蜂鸣器
beep_on();delay_ms(100);beep_off();delay_ms(100);
/////////////////////////////////////////////////////////////////////////////////////////////////
}
/*=========================================手柄初始化============================================
函数名:psx_init
功能介绍:PS2引脚拉高
函数参数:无
返回值:无
===============================================================================================*/
void psx_init(void) {
PS2_ATT = 1;
PS2_CMD = 1;
PS2_CLK = 1;
//PS2_DAT = 0;
//PS2_ACK = 1;
return;
}
/*=========================================绿灯模式处理函数======================================
函数名:handle_psx_green
功能介绍:绿灯模式下,按钮处理
函数参数:无
返回值:无
===============================================================================================*/
void handle_psx_green(void) {
psx_write_read(psx_buf);//读取手柄
if(psx_buf[1] == PSX_GREEN_MODE) { //判断是否为绿灯模式
switch(psx_buf[3]) {
case 0xef: {if(deal_flag < 1) {nled = 0;uart1_send_str("GREEN_MODE_PUSH:LU ");release_flag = LU_RELEASE;deal_flag++;}break;} //LU
case 0xbf: {if(deal_flag < 1) {nled = 0;uart1_send_str("GREEN_MODE_PUSH:LD ");release_flag = LD_RELEASE;deal_flag++;}break;} //LD
case 0x7f: {if(deal_flag < 1) {nled = 0;uart1_send_str("GREEN_MODE_PUSH:LL ");release_flag = LL_RELEASE;deal_flag++;}break;} //LR
case 0xdf: {if(deal_flag < 1) {nled = 0;uart1_send_str("GREEN_MODE_PUSH:LR ");release_flag = LR_RELEASE;deal_flag++;}break;} //LL
case 0xfe: {if(deal_flag < 1) {nled = 0;uart1_send_str("GREEN_MODE_PUSH:SE ");release_flag = SE_RELEASE;deal_flag++;}break;} //SE
default: {
switch(release_flag) {
case LU_RELEASE: nled = 1;deal_flag = 0;release_flag = 0;uart1_send_str("RELEASE:LU\r\n");break; //弹起后,指示灯灭,串口发送对应按钮弹起信息
case LD_RELEASE: nled = 1;deal_flag = 0;release_flag = 0;uart1_send_str("RELEASE:LD\r\n");break;
case LL_RELEASE: nled = 1;deal_flag = 0;release_flag = 0;uart1_send_str("RELEASE:LL\r\n");break;
case LR_RELEASE: nled = 1;deal_flag = 0;release_flag = 0;uart1_send_str("RELEASE:LR\r\n");break;
case SE_RELEASE: nled = 1;deal_flag = 0;release_flag = 0;uart1_send_str("RELEASE:SE\r\n");break;
default:break;
}
break;
}
}
switch(psx_buf[4]) {
case 0xfb: {if(deal_flag < 1) {nled = 0;uart1_send_str("GREEN_MODE_PUSH:L1 ");release_flag = L1_RELEASE;deal_flag++;}break;} //L1
case 0xfe: {if(deal_flag < 1) {nled = 0;uart1_send_str("GREEN_MODE_PUSH:L2 ");release_flag = L2_RELEASE;deal_flag++;}break;} //L2
case 0xf7: {if(deal_flag < 1) {nled = 0;uart1_send_str("GREEN_MODE_PUSH:R1 ");release_flag = R1_RELEASE;deal_flag++;}break;} //R1
case 0xfd: {if(deal_flag < 1) {nled
评论1