手柄使用的是 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-java基础内部类

    @在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类.下面就来了解下成员内部类,局部内部类,匿名内部类 的使用方法 1.成员内部类 成员内部类是最普通的内部类,它的定义为 ...

  2. 重新用delphi7写东西

    晚上开始写通讯录的程序,又对表进行点修改.重新开始用delphi7很不习惯,太不好用了. TArecord=record Const UserName=’YHName’; ..... End; 这个在 ...

  3. Codeforces Round #383 (Div. 2) D 分组背包

    给出一群女孩的重量和颜值 和她们的朋友关系 现在有一个舞台 ab是朋友 bc是朋友 ac就是朋友 给出最大承重 可以邀请这些女孩来玩 对于每一个朋友团体 全邀请or邀请一个or不邀请 问能邀请的女孩的 ...

  4. 记一次程序排错与std::getline

    今天忙活了半个下午,查找正式环境上面一个程序的问题.这个程序的作用是监控文件夹,处理每一个文件,分析每个文件的每行记录,然后将这个文件拆分成两个结果文件投放到另外两个不同的目录下面去,当处理完这个文件 ...

  5. VSCODE 插件初探

    写在前面 分享一个vscode插件background(用于改变背景).点击直接跳到vscode插件开发步骤 做vscode的插件,很久就有这个想法了,但是一直因为这样,那样的事情耽误,放弃了N次.不 ...

  6. java连接mysql数据库详细步骤解析

    java连接mysql数据库详细步骤解析      第一步:下载一个JDBC驱动包,例如我用的是:mysql-connector-java-5.1.17-bin.jar      第二步:导入下载的J ...

  7. JavaScript:编程改变文本样式

    <!DOCTYPE HTML><html><head><meta http-equiv="Content-Type" Content=&q ...

  8. 使用openvswitch 和dnsmasq来实现虚拟机网络隔离

    openvswicth : 开源的网络虚拟化软件,可以划分vlan隔离虚拟机,做流量控制 dnsmasq:小心的dns,dhcp服务器 安装openvswicth wget  http://openv ...

  9. http-code 未译

    1xx Informational Request received, continuing process. This class of status code indicates a provis ...

  10. 一、oracle数据库成功安装步骤 (11gR2)

    下载安装包 从Oracle官方网站下载数据库软件安装包:http://www.oracle.com/technetwork/cn/database/enterprise-edition/downloa ...