手柄使用的是 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课程---关于GridView网格视图的学习

    activity_ui6.xml <?xml version="1.0" encoding="utf-8"?> <GridView xmlns ...

  2. linq 小记

    1.简单的linq语法 //1 var ss = from r in db.Am_recProScheme select r; //2 var ss1 = db.Am_recProScheme; // ...

  3. 贪吃蛇的java代码分析(一)

    自我审视 最近自己学习java已经有了一个多月的时间,从一开始对变量常量的概念一无所知,到现在能勉强写几个小程序玩玩,已经有了长足的进步.今天没有去学习,学校里要进行毕业答辩和拍毕业照了,于是请了几天 ...

  4. 给定一个double类型的数组arr,其中的元素可正可负可0,返回子数组累乘的最大乘积。例如arr=[-2.5,4,0,3,0.5,8,-1],子数组[3,0.5,8]累乘可以获得最大的乘积12,所以返回12。

    分析,是一个dp的题目, 设f[i]表示以i为结尾的最大值,g[i]表示以i结尾的最小值,那么 f[i+1] = max{f[i]*arr[i+1], g[i]*arr[i+1],arr[i+1]} ...

  5. Win32 设置窗口透明度 SetLayerTransparent

    注意: 在调用SetLayeredWindowAttributes 之前,需要给窗口加上WS_EX_LAYERED属性,否则会无效 void SetLayerTransparent(HWND hWnd ...

  6. PL/SQL %TYPE和%ROWTYPE的区别【转】

    %TYPE: 定义一个变量,其数据类型与已经定义的某个 数据变量的类型相同,或者与数据库表的某个列的数据类型 相同,这时可以使用%TYPE.         使用%TYPE 特性的优点在于: 1.所引 ...

  7. app活动页面上的痛点

    app项目上需要做一个小的活动,先看下页面布局 需求是这5个板块逐个展示,展示一块的时候,页面整体向上滚动一定的距离. 刚开始考虑的时候,是准备依赖css3属性的transition实现的,包括顺序延 ...

  8. 纯CSS实现下拉菜单及下拉容器等(纯CSS实现导航条及导航下拉容器)

    虽然网上类似甚至相同的案例有很多,但是我还是写下,以记下笔记,也可供大家参考 希望大家可以指导批评~~ 首先我们以列表ul li 来开始我们菜单也可以说导航条的制作: 在页面中我们首先构建以下XHTM ...

  9. 解决界面有搜索栏时,点击TableView的空白界面,键盘不消失的问题

    UITapGestureRecognizer * tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(h ...

  10. 启用CentOS6.5 64位安装时自带的MySQL数据库服务器

    本人在虚拟机上又安装了一台linux机器,作为MySQL数据库服务器用,在安装时选择了系统自带的MySQL服务器端,以下是启用步骤. 首先开启mysqld服务 #service mysqld star ...