相信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----游戏手柄实验相关推荐

  1. STM32F1开发指南笔记6----SYSTEM文件夹__delay函数、sys函数、usart函数

    此文件夹是STM32F10x系列的底层核心驱动函数,可以用在STM32F10x系列的各个型号上面,方便快速构建自己的工程.SYSTEM文件夹下包含看delay.sys.usart等三个文件夹.分别包含 ...

  2. [微信开发] 开发指南笔记

    (1)测试号申请 https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login (2)接入指南 1.每个用户对每个公众号有一个唯一的Op ...

  3. 我要大学答案———小程序开发指南 课后习题答案|实验报告|考研资料|期末真题的答案

    我要大学答案-小程序开发原理 大学所有答案都能免费找 设计思路 我要大学答案-小程序 大学所有答案都能免费找 期末考试题库.清华.南昌理工大学.北大.江西理工大学考试题库 期末考试题库.清华.南昌理工 ...

  4. Node.js 开发指南笔记

    第一章:node简介 介绍了node是什么:node.js是一个让javascript运行在服务器端的开发平台, node能做些什么:[书上的] 具有复杂逻辑的网站 基于社交网络的大规模Web应用 W ...

  5. 【TDA2x学习】番外篇三、VisionSDK开发指南笔记

    1.介绍 Vision Software Development Kit (SDK)是一种多处理器.多通道的用于TI家族ADAS SoCs的软件开发平台.该软件框架允许用户创建不同的ADAS应用程序数 ...

  6. HTML5移动web开发指南笔记

    手机内置浏览器: Android:Andriod Browser IOS:Mobile Safari BlackBerry:Webkit Symbian S60: Web Browser for S6 ...

  7. 【正点原子FPGA连载】第六章Petalinux设计流程实战摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Linux开发指南

    1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=692450874670 3)全套实验源码+手册+视频下载地址: h ...

  8. 【正点原子FPGA连载】第十六章Petalinux设计流程实战摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Linux开发指南

    1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=692450874670 3)全套实验源码+手册+视频下载地址: h ...

  9. STM32开发指南阅读记录

    一.STM32的开发方式:标准库,HAL库,寄存器开发 1.寄存器开发:通过直接操作寄存器进行开发,但是由于STM32的寄存器数量众多,逐个查询比较繁琐. 2.标准库:ST公司为每一款芯片都编写了一份 ...

最新文章

  1. Android 获取SD卡路径和判断SD卡是否存在.
  2. PHPExcel设置自动列宽
  3. 为什么嵌入式工程师会对8位MCU有误解?
  4. linux 内核/proc
  5. WIN7下VS2005 VS2008 SQLSERVER2005安装顺序
  6. 137_原始套接字_发送UDP数据,模仿他人飞秋给另一个飞秋客户端发送信息
  7. 有道词典pc离线包打包下载_【超福利】安卓手机上最好用的离线词典
  8. Unity Shader - shader lab 的 SRP Batcher compatible 兼容性(未使用 RenderDoc 验证 API)
  9. 直连网线和交叉网线的线序
  10. PPT中修改已插入对象的图标
  11. [益智]:3个女儿的年龄
  12. 软件功能介绍之(数据维护)3.1数据编辑(1)
  13. 计算机工程科学怎么翻译,汉英机器翻译中汉语篇章时间信息系统模型 - 计算机工程与科学.pdf...
  14. Shell脚本 单引号、双引号和反引号的区别
  15. 鸿蒙os系统3.0体验,华为鸿蒙OS系统体验,和安卓系统差距很大,你愿意升级吗?...
  16. matlab电路分析教学视频,Matlab在《电路分析》课程教学中的应用
  17. 关于使用WinDebug查看线程死锁问题
  18. cocos 2dx使用webView
  19. 基于SSM的物联网下实验室云端监管系统
  20. java7 rhino,Java 7 可运行的 Nashorn,代替 Rhino

热门文章

  1. 数据库简明教程-高琪-专题视频课程
  2. 基于jeesite+android开发 电子商务系统免费教程
  3. E店宝互联网思维与电子商务
  4. fluent user guide DPM学习
  5. 低成本高耐压20V移动电源方案IC首选钰泰ETA9870足5V2.4A输出
  6. 最近公共祖先(Least Common Ancestors,LCA)问题详解
  7. 理财U24 认股权证、可转债、可赎债 习题解读
  8. Element UI 表格数据格式化
  9. 安装sql数据库出现指定的驱动程序无效的问题
  10. 线代基础第四讲——方程组