中小企业网站建设 论文旅游景区网站建设规划

news/2025/10/2 14:57:49/文章来源:
中小企业网站建设 论文,旅游景区网站建设规划,小程序seo帝搜软件sem880官网,网线制作实验原理文章目录 前言一、cubemx配置二、代码1.引入库bsp_hal_ps2.cbsp_hal_ps2.h 2.主函数 前言 本文讲解使用cubemx配置PS2手柄实现对手柄的按键和模拟值的读取。 很简单#xff0c;库已经封装好了#xff0c;直接就可以了。 文件 一、cubemx配置 这个很简单#xff0c;不需要… 文章目录 前言一、cubemx配置二、代码1.引入库bsp_hal_ps2.cbsp_hal_ps2.h 2.主函数 前言 本文讲解使用cubemx配置PS2手柄实现对手柄的按键和模拟值的读取。 很简单库已经封装好了直接就可以了。 文件 一、cubemx配置 这个很简单不需要走协议只要配置gpio就可以了 二、代码 1.引入库 使用我的两个库 bsp_hal_ps2.c /* 包含头文件 ----------------------------------------------------------------*/ #include bsp_hal_ps2.h/* 私有类型定义 --------------------------------------------------------------*//* 私有宏定义 ----------------------------------------------------------------*/ #define DI() HAL_GPIO_ReadPin(PS2_DI_GPIO_Port, PS2_DI_Pin) //PB12 输入#define DO_H() HAL_GPIO_WritePin(PS2_DO_CMD_GPIO_Port, PS2_DO_CMD_Pin, GPIO_PIN_SET) //命令位高 #define DO_L() HAL_GPIO_WritePin(PS2_DO_CMD_GPIO_Port, PS2_DO_CMD_Pin, GPIO_PIN_RESET) //命令位低#define CS_H() HAL_GPIO_WritePin(PS2_CS_SEL_GPIO_Port, PS2_CS_SEL_Pin, GPIO_PIN_SET) //CS拉高 #define CS_L() HAL_GPIO_WritePin(PS2_CS_SEL_GPIO_Port, PS2_CS_SEL_Pin, GPIO_PIN_RESET) //CS拉低#define CLK_H() HAL_GPIO_WritePin(PS2_CLK_GPIO_Port, PS2_CLK_Pin, GPIO_PIN_SET) //时钟拉高 #define CLK_L() HAL_GPIO_WritePin(PS2_CLK_GPIO_Port, PS2_CLK_Pin, GPIO_PIN_RESET) //时钟拉低 /* 私有变量 ------------------------------------------------------------------*/ const uint8_t Comd[2]{0x01,0x42}; //开始命令。请求数据 const uint16_t MASK[16] {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 }; //按键值与按键明 /* 扩展变量 ------------------------------------------------------------------*/ _u_PS2_Data PS2_Data{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //数据存储数组 /* 私有函数原形 --------------------------------------------------------------*//* 函数体 --------------------------------------------------------------------*/ static void delay_us(int16_t us) {for(int i0; ius*10; i){;} } //向手柄发送命令 static uint8_t PS2_Cmd(uint8_t CMD) {volatile uint16_t ref0x01;uint8_t Data;Data 0;for(ref0x01; ref0x0100; ref1){if(refCMD){DO_H(); //输出以为控制位}else DO_L();CLK_H(); //时钟拉高delay_us(10);CLK_L();delay_us(10);CLK_H();if(DI()){Data ref|Data;}}return Data; } //short poll static void PS2_ShortPoll(void) {CS_L();delay_us(16);PS2_Cmd(0x01); PS2_Cmd(0x42); PS2_Cmd(0X00);PS2_Cmd(0x00);PS2_Cmd(0x00);CS_H();delay_us(16); }//进入配置 static void PS2_EnterConfing(void) {CS_L();delay_us(16);PS2_Cmd(0x01); PS2_Cmd(0x43); PS2_Cmd(0X00);PS2_Cmd(0x01);PS2_Cmd(0x00);PS2_Cmd(0X00);PS2_Cmd(0X00);PS2_Cmd(0X00);PS2_Cmd(0X00);CS_H();delay_us(16); }//发送模式设置 static void PS2_TurnOnAnalogMode(void) {CS_L();PS2_Cmd(0x01); PS2_Cmd(0x44); PS2_Cmd(0X00);PS2_Cmd(0x01); //analog0x01;digital0x00 软件设置发送模式PS2_Cmd(0xEE); //Ox03锁存设置即不可通过按键“MODE”设置模式。//0xEE不锁存软件设置可通过按键“MODE”设置模式。PS2_Cmd(0X00);PS2_Cmd(0X00);PS2_Cmd(0X00);PS2_Cmd(0X00);CS_H();delay_us(16); } //振动设置 static void PS2_VibrationMode(void) {CS_L();delay_us(16);PS2_Cmd(0x01); PS2_Cmd(0x4D); PS2_Cmd(0X00);PS2_Cmd(0x00);PS2_Cmd(0X01);CS_H();delay_us(16); } //完成并保存配置 static void PS2_ExitConfing(void) {CS_L();delay_us(16);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_H();delay_us(16); } //清除数据缓冲区 void PS2_ClearData(void) {PS2_Data.DATE.ID 0;PS2_Data.DATE.verify 0;PS2_Data.DATE.key1_U.byte 0xff;PS2_Data.DATE.key2_U.byte 0xff;PS2_Data.DATE.PSS_RX 0;PS2_Data.DATE.PSS_RY 0;PS2_Data.DATE.PSS_LX 0;PS2_Data.DATE.PSS_LY 0; } //判断是否为红灯模式 //返回值0红灯模式 // 其他其他模式 uint8_t PS2_RedLight(void) {uint8_t Data;CS_L();PS2_Cmd(Comd[0]); //开始命令Data PS2_Cmd(Comd[1]); //请求数据CS_H();PS2_Data.DATE.ID Data;if( Data 0X73) return 0 ;else return 1; }//读取手柄数据 void PS2_ReadData(void) {volatile uint8_t byte0;volatile uint16_t ref0x01;uint8_t data;CS_L();PS2_Cmd(Comd[0]); //开始命令PS2_Data.DATE.ID PS2_Cmd(Comd[1]); //请求数据for(byte1;byte8;byte) //开始接受数据{data 0;for(ref0x01;ref0x100;ref1){CLK_H();delay_us(10);CLK_L();delay_us(10);CLK_H();if(DI()){data ref|data;}} PS2_Data.byte[byte] data;delay_us(16);}CS_H(); }//对读出来的PS2的数据进行处理 //只处理了按键部分 //默认数据是红灯模式 只有一个按键按下时 //按下为0 未按下为1 uint8_t PS2_DataKey(void) {uint8_t index;uint16_t Handkey;PS2_ClearData();PS2_ReadData();if(PS2_Data.DATE.verify 0x5a){Handkey(PS2_Data.byte[3]8)|PS2_Data.byte[2]; //这是16个按键 按下为0 未按下为1for(index0;index16;index){ if((Handkey(1(MASK[index]-1)))0){return index1;}}}return 0; //没有任何按键按下 }//得到一个摇杆的模拟量 范围0~256 //返回1得取成功0得取失败 uint8_t PS2_AnologData(_e_RockerSelect button,uint8_t *qdata) {PS2_ClearData();PS2_ReadData();if(PS2_Data.DATE.verify 0x5a){if(button PSS_RX) *qdata PS2_Data.DATE.PSS_RX;else if(button PSS_RY) *qdata PS2_Data.DATE.PSS_RY;else if(button PSS_LX) *qdata PS2_Data.DATE.PSS_LX;else *qdata PS2_Data.DATE.PSS_LY;return 1;}else{return 0;} } /****************************************************** Function: void PS2_Vibration(uint8_t motor1, uint8_t motor2) Description: 手柄震动函数 Calls: void PS2_Cmd(uint8_t CMD); Input: motor1:右侧小震动电机 0x00关其他开motor2:左侧大震动电机 0x40~0xFF 电机开值越大 震动越大 ******************************************************/ void PS2_Vibration(uint8_t motor1, uint8_t motor2) {CS_L();delay_us(16);PS2_Cmd(0x01); //开始命令PS2_Cmd(0x42); //请求数据PS2_Cmd(0X00);PS2_Cmd(motor1);PS2_Cmd(motor2);PS2_Cmd(0X00);PS2_Cmd(0X00);PS2_Cmd(0X00);PS2_Cmd(0X00);CS_H();delay_us(16); } //手柄配置初始化 void PS2_SetInit(void) {CS_H();CLK_H();DO_H();PS2_ShortPoll();PS2_ShortPoll();PS2_ShortPoll();PS2_EnterConfing(); //进入配置模式PS2_TurnOnAnalogMode(); //“红绿灯”配置模式并选择是否保存PS2_VibrationMode(); //开启震动模式PS2_ExitConfing(); //完成并保存配置CS_H();CLK_H();DO_H(); } bsp_hal_ps2.h #ifndef __BSP_HAL_PS2_H__ #define __BSP_HAL_PS2_H__/* 包含头文件 ----------------------------------------------------------------*/ #include main.h /* 宏定义 --------------------------------------------------------------------*/ //These are our button constants #define PSB_SELECT 1 #define PSB_L3 2 #define PSB_R3 3 #define PSB_START 4 #define PSB_PAD_UP 5 #define PSB_PAD_RIGHT 6 #define PSB_PAD_DOWN 7 #define PSB_PAD_LEFT 8 #define PSB_L2 9 #define PSB_R2 10 #define PSB_L1 11 #define PSB_R1 12 #define PSB_GREEN 13 #define PSB_RED 14 #define PSB_BLUE 15 #define PSB_PINK 16 /* 类型定义 ------------------------------------------------------------------*/ typedef enum {PSS_RX 0,PSS_RY,PSS_LX,PSS_LY, }_e_RockerSelect; typedef union {uint8_t byte;struct{uint8_t SELECT :1;uint8_t L3 :1;uint8_t R3 :1;uint8_t START :1;uint8_t UP :1;uint8_t RIGHT :1;uint8_t DOWN :1;uint8_t LEFT :1;}bit; }_u_key1; typedef union {uint8_t byte;struct{uint8_t L2 :1;uint8_t R2 :1;uint8_t L1 :1;uint8_t R1 :1;uint8_t TRI :1;uint8_t CIRCLE :1;uint8_t FORK :1;uint8_t REC :1;}bit; }_u_key2; typedef union {uint8_t byte[8];struct{uint8_t ID;uint8_t verify;_u_key1 key1_U;_u_key2 key2_U;uint8_t PSS_RX;uint8_t PSS_RY;uint8_t PSS_LX;uint8_t PSS_LY;}DATE; }_u_PS2_Data;/* 扩展变量 ------------------------------------------------------------------*/ extern _u_PS2_Data PS2_Data; /* 函数声明 ------------------------------------------------------------------*/ void PS2_SetInit(void); void PS2_ClearData(void); void PS2_ReadData(void); void PS2_Vibration(uint8_t motor1, uint8_t motor2); uint8_t PS2_AnologData(_e_RockerSelect button,uint8_t *qdata); uint8_t PS2_DataKey(void); uint8_t PS2_RedLight(void);#endif // __BSP_HAL_PS2_H__ 2.主函数 初始化 PS2_SetInit();uint8_t a;主循环 if( !PS2_RedLight()) {//判断手柄是否为红灯模式是指示灯LED点亮HAL_Delay(50); //延时很重要不可去for(a0; a8; a)//清除数据缓冲区PS2_Data.byte[a] 0x00;PS2_ReadData();// y_axisbuff (128 - PS2_Data.DATE.PSS_LY)*2;//最高速度256 // x_axisbuff (PS2_Data.DATE.PSS_LX - 128)*2; // yawbuff ( -128PS2_Data.DATE.PSS_RX)*2;// if(ABS(y_axisbuff) 50) y_axisbuff 0; //限制遥控中间位置的误差 // if(ABS(yawbuff) 50) yawbuff 0; // if(ABS(x_axisbuff) 50) x_axisbuff 0;}else{//判断手柄不是红灯模式指示灯LED熄灭PS2_ClearData();}HAL_Delay(50);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/925019.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

task1_1.c

include <stdio.h> int main() { printf(" o \n"); printf("\n"); printf("I I\n"); printf(" o \n"); printf("\n"); printf("I I\n"); return 0…

解码AVL树

为什么要关注二叉树的平衡性?—— 从 BST 的缺陷说起 二叉搜索树(BST)的核心优势是 “高效搜索”:利用 “左子树所有节点值<根节点值<右子树所有节点值” 的特性,能从根节点开始快速定位目标节点。但 BST 有个致…

服务发现与注册中心设计:从Eureka到Nacos的CAP权衡——AP与CP的边界,藏在服务列表的一致性里 - 教程

服务发现与注册中心设计:从Eureka到Nacos的CAP权衡——AP与CP的边界,藏在服务列表的一致性里 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: blo…

LinuxWindows环境下Nacos3.1.0详细安装部署指南:从零到生产就绪

Linux&Windows环境下Nacos3.1.0详细安装部署指南:从零到生产就绪pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: &q…

商务网站创建流程是什么宿州哪家做网站不做

1月16号 MySQL 官方发布 8.3 创新版 和 8.0.36 长期支持版本 (该版本 没有新增功能&#xff0c;更多是修复bug )&#xff0c;本文基于 官方文档 说一下 8.3 版本带来的变化。 一 增加的特性 1.1 GTID_NEXT 支持增加 TAG 选项。 之前的版本中 GTID_NEXTUUID:number &#xff…

哪个网站有律师做的案件有没有资源免费的

应该是挺简单的代码, 记录一下分享. 首先最直接的想法就是使用循环, 用局部变量记录已选的checkbox, 达到最大值就将余下的checkbox都禁止选择, 例如以下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ""> <html xmlns"…

交通建设集团网站但无法选择(select)wordpress数据库.

文章目录 JAVA13概述语法层面特性switch表达式(预览)文本块(预览) API层次特性重新实现旧版套接字API 其他变化ZGC取消未使用的内存增加废弃和移除增加项移除项废弃项 JAVA13概述 2019年9月17日&#xff0c;国际知名的OpenJDK开源社区发布了Java编程语言环境的最新版本OpenJDK…

JAVA SE 基础语法 —— A / 初识 - 指南

JAVA SE 基础语法 —— A / 初识 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mo…

2025年掘进机厂家权威推荐榜:实力品牌与技术创新深度解析

2025年掘进机厂家权威推荐榜:实力品牌与技术创新深度解析在基础设施建设与矿山开采行业高速发展的今天,掘进机作为核心工程装备,其性能优劣直接关系到工程进度与施工安全。随着技术的不断革新,掘进机市场呈现出智能…

2025机械加工供货厂家权威口碑排行:实力与服务深度解析!

2025机械加工供货厂家权威口碑排行:实力与服务深度解析!行业背景在当今制造业蓬勃发展的大背景下,机械加工行业作为制造业的核心支柱之一,扮演着至关重要的角色。随着科技的不断进步和市场需求的日益多样化,机械加…

NOIP 集训日记 2.0

yuanshen,qidong!111

重庆网站seo搜索引擎优化常用的搜索引擎有哪些?

我们是否充分意识到云端所面临的网络安全威胁&#xff1f; 在当今互联互通的世界中&#xff0c;维护安全的环境至关重要。云的出现扩大了潜在威胁的范围&#xff0c;因为它催生了机器身份&#xff08;称为非人类身份 (NHI)&#xff09;及其秘密。随着组织越来越多地转向云原生…

2025舒适轮胎权威推荐榜:静音科技与驾乘体验口碑之选

2025舒适轮胎权威推荐榜:静音科技与驾乘体验口碑之选随着汽车工业的持续发展和消费者对驾乘体验要求的不断提升,舒适轮胎市场正迎来新一轮技术革新与产品升级。根据行业数据显示,2024年全球舒适轮胎市场规模已突破千…

2025七水硫酸锌厂家权威推荐榜:优质供应与专业定制首选

2025七水硫酸锌厂家权威推荐榜:优质供应与专业定制首选随着现代农业和工业的快速发展,七水硫酸锌作为重要的微量元素肥料和工业原料,其市场需求持续增长。在环保要求日益严格、产品质量标准不断提升的背景下,选择合…

深圳网站建设公司权威推荐榜:专业定制与创新设计口碑之选

深圳网站建设公司权威推荐榜:专业定制与创新设计口碑之选在数字化转型浪潮席卷各行各业的今天,企业网站已从简单的信息展示窗口升级为品牌形象展示、业务拓展和客户服务的重要平台。作为中国科技创新前沿阵地的深圳,…

UV面光源实力厂家权威推荐:专业制造与品质保障口碑之选

UV面光源实力厂家权威推荐:专业制造与品质保障口碑之选在精密制造、电子组装、医疗设备等高端工业领域,UV面光源作为关键固化设备,其性能优劣直接关系到产品质量和生产效率。随着产业升级和技术进步,市场对UV面光源…

郴州网站建设流程什么是工业互联网

在本文中&#xff0c;我们将介绍 10 多个最好的 IntelliJ IDEA 插件&#xff0c;以提高工作效率并在更短的时间内完成更多工作。如果将这些插件合并到您的工作流程中&#xff0c;您将能够更有效地应对开发挑战。 1、TabNine TabNine 是一个 IntelliJ IDEA 插件&#xff0c;可…

2025微弧氧化实力厂家推荐:专业表面处理技术深度解析

2025微弧氧化实力厂家推荐:专业表面处理技术深度解析在工业制造领域,表面处理技术一直是提升产品性能和使用寿命的关键环节。微弧氧化作为一种先进的表面处理技术,近年来在航空航天、汽车制造、电子设备等领域展现出…

网站建设类论文格式定制一款软件需要多少钱

背景 在flink基于事件的时间处理中&#xff0c;水位线记录的生成是一个很重要的环节&#xff0c;本文就来记录下几种水位线记录的生成方式的其中一种&#xff1a;周期性水位线生成器 周期性水位线生成器 1.1 BoundedOutOfOrdernessTimeStampExtractor 他会接收一个表示最大延…

实用指南:Ansible Playbook:自动化配置管理的利器

实用指南:Ansible Playbook:自动化配置管理的利器2025-10-02 14:33 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; disp…