手柄使用的是 CD4021 ,datasheet 上说支持 3V - 15V 。

因为手柄是 5V 供电,2440 开发板上是GPIO 3.3V 电平,STM32 GPIO 也是 3.3V (也兼容5V)电平。

所以先在 STM32 上测试能用后,在接到 2440 开发板上。

正好是 8个键值,用来点 8个 LED 。按下一个键,就会亮一个灯。

c51 :

 #include <reg52.h>

 sbit CLK   = P2 ^ ;
sbit LATCH = P2 ^ ;
sbit DAT0 = P2 ^ ; void Delay10us() //@11.0592MHz
{
unsigned char i;
i = ;
while (--i);
} unsigned char joypad()
{
int i;
unsigned char cmd = ;
LATCH = ;
Delay10us();
LATCH = ;
for(i=; i<;i++)
{
Delay10us();
if(DAT0)
{
cmd |= <<i;
}
CLK = ;
Delay10us();
CLK = ;
}
LATCH = CLK = ;
return cmd;
} int main()
{
unsigned char cmd;
CLK = LATCH = DAT0 = ;
Delay10us();
while()
{
cmd = joypad();
//点灯
P1 = cmd;
}
}

STM32 : 主要部分,其它部分源码,可以在STM32分类里面找到。

 #include "stm32f10x.h"
#include "bitband.h"
#include "delay.h" void SystemInit()
{
RCC->CR |= RCC_CR_HSEON; /* 外部时钟开 */
while(! (RCC->CR & RCC_CR_HSERDY)); /* 检查标志位判断是否就续 */ RCC->CFGR = RCC_CFGR_PPRE1_2; /* APB1低速设备2分频72M/2=36M */
RCC->CFGR |= RCC_CFGR_PLLMULL9; /* PLL 9 倍频 */
RCC->CFGR |= RCC_CFGR_PLLSRC; /* HSE 做为 PLL 输入 */ FLASH->ACR |= ; /* 2个等待状态 72M */ RCC->CR |= RCC_CR_PLLON; /* 启用 PLL */
while(! (RCC->CR & RCC_CR_HSERDY)); /* 检查标志位判断是否就续 */ RCC->CFGR |=RCC_CFGR_SW_PLL; /* 选择外部时钟作为系统时钟 */
while( != ((RCC->CFGR>>) & )); /* 检查标志位判断是否就续 */
} u8 joypad()
{
int i;
u8 cmd = ;
GPC_BSRR() = ;
delay_us();
GPC_BRR() = ;
for(i=; i<;i++)
{
delay_us();
//低电平时表示按下了
if( == GPC_IDR())
{
cmd |= <<i;
}
GPC_BSRR() = ;
delay_us();
GPC_BRR() = ;
}
GPC_BRR() = ;
GPC_BRR() = ;
return cmd;
} int main(void)
{
u8 cmd;
//引脚启用时钟 IOA IOB IOC
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN | RCC_APB2ENR_IOPCEN; GPIOC->CRL = ; //配置LED灯引脚模式 PC7
GPIOC->CRL |= GPIO_CRL_MODE7; //MODE 设为 11 :50M 输出模式
GPC_BSRR() = ; //配置 手柄CLK引脚模式 PC0
GPIOC->CRL |= GPIO_CRL_MODE0; //MODE 设为 11 :50M 输出模式
//默认 低电平
GPC_BRR() = ; //配置 手柄LATCH引脚模式 PC1
GPIOC->CRL |= GPIO_CRL_MODE1; //MODE 设为 11 :50M 输出模式
//默认 低电平
GPC_BRR() = ; //手柄 DAT0 输入引脚 PC2
GPIOC->CRL |= GPIO_CRL_CNF2_1; //10 输入模式 上拉 / 下拉
//设置下拉
GPC_BRR() = ; //循环点亮
while()
{
cmd = joypad();
//如果有输入就点LED
if(cmd)
{
GPC_ODR() = ;
}
else
{
GPC_ODR() = ;
} }
return ;
}

nes 红白机模拟器 第3篇 游戏手柄测试 51 STM32的更多相关文章

  1. nes 红白机模拟器 第7篇 编译使用方法

    模拟器,基于 InfoNES ,作者添加修改以下功能: 1, joypad 真实手柄驱动程序(字符型设备驱动) 2,原始图像只有256*240 ,添加 图像放大算法,这里实现了2种,a, 最近邻插值 ...

  2. arm 2440 linux 应用程序 nes 红白机模拟器 第1篇

    对比了很多种,开源的 NES 模拟器 VirtuaNES , nestopia , FakeNES , FCEUX , InfoNES , LiteNES 最后决定使用 LiteNES 进行移值,它是 ...

  3. nes 红白机模拟器 第1篇

    对比了很多种,开源的 NES 模拟器 VirtuaNES , nestopia , FakeNES , FCEUX , InfoNES , LiteNES 最后决定使用 LiteNES 进行移值,它是 ...

  4. arm 2440 linux 应用程序 nes 红白机模拟器 第4篇 linux 手柄驱动支持

    小霸王学习机的真实手柄,实测CPU 占用 80% 接线图: 手柄读时序: joypad.c 驱动: 普通的字符设备驱动. #include <linux/module.h> #includ ...

  5. arm 2440 linux 应用程序 nes 红白机模拟器 第2篇 InfoNES

    InfoNES 支持 map ,声音,代码比较少,方便 移值. 在上个 LiteNES  的基础上,其实不到半小时就移值好了这个,但问题是,一直是黑屏.InfoNES_LoadFrame ()  Wo ...

  6. nes 红白机模拟器 第6篇 声音支持

    InfoNES 源码中并没有包含 linux 的声音支持. 但提供 wince 和 win 的工程,文件,通过分析,win 的 DirectSound 发声,在使用 linux ALSA 实现. 先使 ...

  7. nes 红白机模拟器 第5篇 全屏显示

    先看一下效果图 放大的原理是使用最初级的算法,直接取对应像素法. /*================================================================= ...

  8. nes 红白机模拟器 第4篇 linux 手柄驱动支持

    小霸王学习机的真实手柄,实测CPU 占用 80% 接线图: 手柄读时序: joypad.c 驱动: 普通的字符设备驱动. #include <linux/module.h> #includ ...

  9. nes 红白机模拟器 第2篇 InfoNES

    InfoNES 支持 map ,声音,代码比较少,方便 移值. 在上个 LiteNES  的基础上,其实不到半小时就移值好了这个,但问题是,一直是黑屏.InfoNES_LoadFrame ()  Wo ...

随机推荐

  1. Android-简单拨号器案例

    Android [19]简单电话拨号器 @方法步骤 1.新建一个android程序,项目名设置为 phone  ,然后打开  phone->res->layout->activity ...

  2. [转]SQL三种获取自增长的ID方法

     最新更新请访问: http://denghejun.github.io   SQL SERVER中的三种获得自增长ID的方法  这个功能比较常用,所以记下来以防自己忘掉. SCOPE_IDENTIT ...

  3. asp.net identity 2.2.0 在WebForm下的角色启用和基本使用(四)

    有网友问及权限的问题,其实我觉得没什么改进. 主目录下的web.config基本不用改.要说要改的也就只有数据库连接了. <authentication mode="None" ...

  4. ios中调用友盟分享时qq可以分享但是微信失败,只显示文字,网页链接没有出现

    问题如下,最后在老大各种替换的情况下,找到了原因,是因为图片失效了,友盟分享微信时必须需要图片才可以,如果服务器图片失效,则会失败: 注意下面的图片是否能够获取???????????????????? ...

  5. (转)我如何利用前端技术得到 XXOO 网站的 VIP

    网页如图,这里只是说明整个网站的一些技术点,所以不该看的地方我都打上马赛克了,让我们揭开这些网站的整个前端工作原理首先刚进去的时候显示一堆乱七八糟的东西,点进去其中一个页面,下面各种虚假评论,然后每隔 ...

  6. PHP中include引用导致不能再次相对引用文件的一个小问题

    今天遇到一个问题:php,incldue_once引入多次文件,多层引用,所以,不同目录下的文件要使用一个文件得先确定目录,比如(下例是提取出来的精简例子,组织的有点乱乱的): /homepage/i ...

  7. 常见的JAVA包

    java.lang 提供利用 Java 编程语言进行程序设计的基础类.最重要的类是 Object(它是类层次结构的根)和 Class(它的实例表示正在运行的应用程序中的类). java.util 包含 ...

  8. JAVASE02-Unit07: 基本IO操作 、 文本数据IO操作

    基本IO操作 . 文本数据IO操作 java标准IO(input/output)操作 package day07; import java.io.FileOutputStream; import ja ...

  9. 闲说HeartBeat心跳包和TCP协议的KeepAlive机制

    很多应用层协议都有HeartBeat机制,通常是客户端每隔一小段时间向服务器发送一个数据包,通知服务器自己仍然在线,并传输一些可能必要的数据.使用心跳包的典型协议是IM,比如QQ/MSN/飞信等协议. ...

  10. NOI 1.5 41:数字统计

    描述 请统计某个给定范围[L, R]的所有整数中,数字2出现的次数. 比如给定范围[2, 22],数字2在数2中出现了1次,在数12中出现1次,在数20中出现1次,在数21中出现1次,在数22中出现2 ...