STM32F1开发指南笔记38----游戏手柄实验
相信80后小时候都玩过FC游戏机(又称:红白机/小霸王游戏机),那是一代经典,给童年带来了无限乐趣。本章,介绍如何通过STM32来驱动FC游戏机手柄,将FC游戏机的手柄作为战舰STM32开发板的输入设备(综合实验可以直接通过这个手柄来玩FC游戏)。
main.c函数
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"
#include "joypad.h" const u8*JOYPAD_SYMBOL_TBL[8]=
{"Right","Left","Down","Up","Start","Select","B","A"};//手柄按键符号定义int main(void)
{ u8 key;u8 t=0,i=0; delay_init(); //延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级uart_init(115200); //串口初始化为115200LED_Init(); //初始化与LED连接的硬件接口LCD_Init(); //初始化LCD JOYPAD_Init(); //手柄初始化POINT_COLOR=RED;//设置字体为红色 LCD_ShowString(30,50,200,16,16,"WarShip STM32"); LCD_ShowString(30,70,200,16,16,"JOYPAD TEST"); LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");LCD_ShowString(30,110,200,16,16,"2015/1/16");LCD_ShowString(30,130,200,16,16,"KEYVAL:"); LCD_ShowString(30,150,200,16,16,"SYMBOL:"); POINT_COLOR=BLUE;//设置字体为红色 while(1){key=JOYPAD_Read();if(key){LCD_ShowNum(116,130,key,3,16);//显示键值printf("键值:%d\n",key);for(i=0;i<8;i++){if(key&(0X80>>i)){LCD_Fill(30+56,150,30+56+48,150+16,WHITE);//清除之前的显示LCD_ShowString(30+56,150,200,16,16,(u8*)JOYPAD_SYMBOL_TBL[i]);//显示符号printf("符号:%s\n",JOYPAD_SYMBOL_TBL[i]);} } }delay_ms(10);t++;if(t==20){t=0;LED0=!LED0;}}
}
joypad.c函数
#include "joypad.h"//初始化手柄接口.
void JOYPAD_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD, ENABLE); //使能PB,PD端口时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //GPIOB11GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化GPIOGPIO_SetBits(GPIOB,GPIO_Pin_11); //上拉GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //GPIOD3GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOD, &GPIO_InitStructure); //初始化GPIOGPIO_SetBits(GPIOD,GPIO_Pin_3); //上拉GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //GPIOB10GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化GPIOGPIO_SetBits(GPIOB,GPIO_Pin_10); //上拉
}//手柄延迟函数
//t:要延迟的时间
void JOYPAD_Delay(u16 t)
{while(t--);
}//读取手柄按键值.
//FC手柄数据输出格式:
//每给一个脉冲,输出一位数据,输出顺序:
//A->B->SELECT->START->UP->DOWN->LEFT->RIGHT.
//总共8位,对于有C按钮的手柄,按下C其实就等于A+B同时按下.
//按下是1,松开是0.
//返回值:
//[7]:右
//[6]:左
//[5]:下
//[4]:上
//[3]:Start
//[2]:Select
//[1]:B
//[0]:A
u8 JOYPAD_Read(void)
{vu8 temp=0;u8 t;JOYPAD_LAT=1; //锁存当前状态JOYPAD_Delay(80);JOYPAD_LAT=0; for(t=0;t<8;t++){temp>>=1; if(JOYPAD_DAT==0)temp|=0x80;//LOAD之后,就得到第一个数据JOYPAD_CLK=1; //每给一次脉冲,收到一个数据JOYPAD_Delay(80);JOYPAD_CLK=0; JOYPAD_Delay(80); }return temp;
}
joypad.h文件
#ifndef __JOYPAD_H
#define __JOYPAD_H
#include "sys.h"//手柄连接引脚
#define JOYPAD_CLK PDout(3) //时钟 PD3
#define JOYPAD_LAT PBout(11) //锁存 PB11
#define JOYPAD_DAT PBin(10) //数据 PB10 void JOYPAD_Init(void); //初始化
void JOYPAD_Delay(u16 t); //延时
u8 JOYPAD_Read(void); //读取键值
#endif
其实就像读普通按键一样,读取对应IO的变化,JOYPAD_DAT就是在读数据线上的电平变化,当有数据传输过来时电平则被拉低,意味着有按键被按下。
不同的是游戏手柄有一套自己的读取时序,得按照规定的读取时序来读取数据。
STM32F1开发指南笔记38----游戏手柄实验相关推荐
- STM32F1开发指南笔记6----SYSTEM文件夹__delay函数、sys函数、usart函数
此文件夹是STM32F10x系列的底层核心驱动函数,可以用在STM32F10x系列的各个型号上面,方便快速构建自己的工程.SYSTEM文件夹下包含看delay.sys.usart等三个文件夹.分别包含 ...
- [微信开发] 开发指南笔记
(1)测试号申请 https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login (2)接入指南 1.每个用户对每个公众号有一个唯一的Op ...
- 我要大学答案———小程序开发指南 课后习题答案|实验报告|考研资料|期末真题的答案
我要大学答案-小程序开发原理 大学所有答案都能免费找 设计思路 我要大学答案-小程序 大学所有答案都能免费找 期末考试题库.清华.南昌理工大学.北大.江西理工大学考试题库 期末考试题库.清华.南昌理工 ...
- Node.js 开发指南笔记
第一章:node简介 介绍了node是什么:node.js是一个让javascript运行在服务器端的开发平台, node能做些什么:[书上的] 具有复杂逻辑的网站 基于社交网络的大规模Web应用 W ...
- 【TDA2x学习】番外篇三、VisionSDK开发指南笔记
1.介绍 Vision Software Development Kit (SDK)是一种多处理器.多通道的用于TI家族ADAS SoCs的软件开发平台.该软件框架允许用户创建不同的ADAS应用程序数 ...
- HTML5移动web开发指南笔记
手机内置浏览器: Android:Andriod Browser IOS:Mobile Safari BlackBerry:Webkit Symbian S60: Web Browser for S6 ...
- 【正点原子FPGA连载】第六章Petalinux设计流程实战摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Linux开发指南
1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=692450874670 3)全套实验源码+手册+视频下载地址: h ...
- 【正点原子FPGA连载】第十六章Petalinux设计流程实战摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Linux开发指南
1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=692450874670 3)全套实验源码+手册+视频下载地址: h ...
- STM32开发指南阅读记录
一.STM32的开发方式:标准库,HAL库,寄存器开发 1.寄存器开发:通过直接操作寄存器进行开发,但是由于STM32的寄存器数量众多,逐个查询比较繁琐. 2.标准库:ST公司为每一款芯片都编写了一份 ...
最新文章
- Android 获取SD卡路径和判断SD卡是否存在.
- PHPExcel设置自动列宽
- 为什么嵌入式工程师会对8位MCU有误解?
- linux 内核/proc
- WIN7下VS2005 VS2008 SQLSERVER2005安装顺序
- 137_原始套接字_发送UDP数据,模仿他人飞秋给另一个飞秋客户端发送信息
- 有道词典pc离线包打包下载_【超福利】安卓手机上最好用的离线词典
- Unity Shader - shader lab 的 SRP Batcher compatible 兼容性(未使用 RenderDoc 验证 API)
- 直连网线和交叉网线的线序
- PPT中修改已插入对象的图标
- [益智]:3个女儿的年龄
- 软件功能介绍之(数据维护)3.1数据编辑(1)
- 计算机工程科学怎么翻译,汉英机器翻译中汉语篇章时间信息系统模型 - 计算机工程与科学.pdf...
- Shell脚本 单引号、双引号和反引号的区别
- 鸿蒙os系统3.0体验,华为鸿蒙OS系统体验,和安卓系统差距很大,你愿意升级吗?...
- matlab电路分析教学视频,Matlab在《电路分析》课程教学中的应用
- 关于使用WinDebug查看线程死锁问题
- cocos 2dx使用webView
- 基于SSM的物联网下实验室云端监管系统
- java7 rhino,Java 7 可运行的 Nashorn,代替 Rhino