nes 红白机模拟器 第3篇 游戏手柄测试 51 STM32

Posted 宁次

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nes 红白机模拟器 第3篇 游戏手柄测试 51 STM32相关的知识,希望对你有一定的参考价值。

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

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

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

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

c51 :

 1 #include <reg52.h>
 2 
 3 sbit CLK   = P2 ^ 2;
 4 sbit LATCH = P2 ^ 1;
 5 sbit DAT0  = P2 ^ 0;
 6 
 7 void Delay10us() //@11.0592MHz
 8 {
 9     unsigned char i;
10     i = 2;
11     while (--i);
12 }
13 
14 unsigned char joypad()
15 {    
16     int i;
17     unsigned char cmd = 0;
18     LATCH = 1;
19     Delay10us();
20     LATCH = 0;
21     for(i=0; i<8;i++)
22     {        
23         Delay10us();
24         if(DAT0)
25         {
26             cmd |= 1<<i;
27         }
28         CLK = 1;
29         Delay10us();
30         CLK = 0;
31     }
32     LATCH = CLK = 0;
33     return cmd;
34 }
35 
36 int main()
37 {
38     unsigned char cmd;
39     CLK = LATCH = DAT0 = 0;
40     Delay10us();
41     while(1)
42     {
43         cmd = joypad();
44         //点灯
45         P1 = cmd;
46     }
47 }

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

 1 #include "stm32f10x.h"
 2 #include "bitband.h"
 3 #include "delay.h"
 4 
 5 void SystemInit()
 6 {
 7     RCC->CR |= RCC_CR_HSEON;      /* 外部时钟开 */
 8     while(! (RCC->CR & RCC_CR_HSERDY)); /* 检查标志位判断是否就续 */
 9     
10     RCC->CFGR  = RCC_CFGR_PPRE1_2; /* APB1低速设备2分频72M/2=36M */
11     RCC->CFGR |= RCC_CFGR_PLLMULL9; /* PLL 9 倍频 */
12     RCC->CFGR |= RCC_CFGR_PLLSRC;  /* HSE 做为 PLL 输入 */
13     
14     FLASH->ACR |= 2; /* 2个等待状态 72M */
15     
16     RCC->CR |= RCC_CR_PLLON;      /* 启用 PLL */
17     while(! (RCC->CR & RCC_CR_HSERDY)); /* 检查标志位判断是否就续 */
18     
19     RCC->CFGR |=RCC_CFGR_SW_PLL;   /* 选择外部时钟作为系统时钟 */
20     while(2 != ((RCC->CFGR>>2) & 3));   /* 检查标志位判断是否就续 */
21 }
22 
23 u8 joypad()
24 {    
25     int i;
26     u8 cmd = 0;
27     GPC_BSRR(1) = 1;
28     delay_us(10);
29     GPC_BRR(1) = 1;
30     for(i=0; i<8;i++)
31     {        
32         delay_us(10);
33         //低电平时表示按下了
34         if(0 == GPC_IDR(2))
35         {
36             cmd |= 1<<i;
37         }
38         GPC_BSRR(0) = 1;
39         delay_us(10);
40         GPC_BRR(0) = 1;
41     }
42     GPC_BRR(0) = 1;
43     GPC_BRR(1) = 1;
44     return cmd;
45 }
46 
47 int main(void)
48 {
49     u8 cmd;
50     //引脚启用时钟 IOA IOB IOC
51     RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN | RCC_APB2ENR_IOPCEN;
52     
53     GPIOC->CRL = 0;
54     
55     //配置LED灯引脚模式 PC7
56     GPIOC->CRL |= GPIO_CRL_MODE7; //MODE 设为 11 :50M 输出模式
57     GPC_BSRR(7) = 1;
58     
59     //配置 手柄CLK引脚模式 PC0
60     GPIOC->CRL |= GPIO_CRL_MODE0; //MODE 设为 11 :50M 输出模式
61     //默认 低电平
62     GPC_BRR(0) = 1;
63     
64     //配置 手柄LATCH引脚模式 PC1
65     GPIOC->CRL |= GPIO_CRL_MODE1; //MODE 设为 11 :50M 输出模式
66     //默认 低电平
67     GPC_BRR(1) = 1;
68     
69     //手柄 DAT0 输入引脚 PC2
70     GPIOC->CRL |= GPIO_CRL_CNF2_1;  //10 输入模式 上拉 / 下拉 
71     //设置下拉
72     GPC_BRR(2) = 1;
73     
74     //循环点亮
75     while(1)
76     {
77         cmd = joypad(); 
78         //如果有输入就点LED
79         if(cmd)
80         {
81             GPC_ODR(7) = 0;
82         }
83         else
84         {
85             GPC_ODR(7) = 1;        
86         }
87         
88     }
89     return 0;
90 }

 

以上是关于nes 红白机模拟器 第3篇 游戏手柄测试 51 STM32的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

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

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

NES 系统架构