实验一 STM32的GPIO实验

#include "stm32f4xx.h"
#include <stdlib.h>


//==========================================================
int msCounter = 0;
int a,num;
u16 iRand=0;

void SysTick_Handler(void)//--- systickÖжϺ¯Êý ---
{
	msCounter++;
}
//==========================================================
void DelaymS(int t)
{
	int ta,tb;
	ta = tb = msCounter;
	while((tb - ta) < t){tb = msCounter;}
}

unsigned char const LEDTAB[] = 
{
	0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,
};

static unsigned char LEDSEG[]= 
{
    0x7e,                  
    0x0c,                  
    0xb6,                  
    0x9e,                  
    0xcc,                  
    0xda,                  
    0xfa,                  
    0x0e,                  
    0xfe,                  
    0xde,                  
};

void Gpio_Init(void)
{
	GPIO_InitTypeDef MyGPIO;
	
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
	MyGPIO.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 |
					         	GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
	MyGPIO.GPIO_Speed = GPIO_Speed_2MHz;
	MyGPIO.GPIO_Mode = GPIO_Mode_OUT;
	GPIO_Init(GPIOA,&MyGPIO);
	
	MyGPIO.GPIO_Pin = GPIO_Pin_10;
	MyGPIO.GPIO_Speed = GPIO_Speed_2MHz;
  MyGPIO.GPIO_PuPd = GPIO_PuPd_UP ;
	MyGPIO.GPIO_Mode = GPIO_Mode_IN;
	GPIO_Init(GPIOA,&MyGPIO);
	
	
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);
	MyGPIO.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 |
						        GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
	MyGPIO.GPIO_Speed = GPIO_Speed_2MHz;
	MyGPIO.GPIO_Mode = GPIO_Mode_OUT;
	GPIO_Init(GPIOB,&MyGPIO);
	
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);
	MyGPIO.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 |GPIO_Pin_4 | 
	                   GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 |GPIO_Pin_8;
	MyGPIO.GPIO_Speed = GPIO_Speed_2MHz;
	MyGPIO.GPIO_Mode = GPIO_Mode_OUT;
	GPIO_Init(GPIOD,&MyGPIO);
    
  MyGPIO.GPIO_Pin = GPIO_Pin_12;
	MyGPIO.GPIO_Speed = GPIO_Speed_2MHz;
  MyGPIO.GPIO_PuPd = GPIO_PuPd_UP ;
	MyGPIO.GPIO_Mode = GPIO_Mode_IN;
	GPIO_Init(GPIOD,&MyGPIO);
}

void key_scan(void)
{
			if(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_12)==0)
        {
            DelaymS(10);
            if(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_12)==0)
            {
              a++; 
              if(a>=3)
              {
                    a=0;
              }
            }
        }
        
        if(a==1)
        {
              srand(msCounter);
              iRand=(u16)( rand()%10);//²úÉúËæ»úÊý0~9 
              GPIO_Write(GPIOD,LEDSEG[iRand]);
        }
        else if(a==2)
        {
              GPIO_Write(GPIOD,LEDSEG[iRand]);
        }
        else    a=0;
				
				if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_10)==0)
        {
            DelaymS(10);
            if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_10)==0)
            {
              num++; 
              if(num>=10)
              {
                    num=0;
              }
            }
        }
}


int main(void)
{
	int i;
	Gpio_Init();
	if(SysTick_Config(SystemCoreClock / 1000)){while(1);} 
	while(1)
	{
      key_scan();  
			GPIO_Write(GPIOA,LEDSEG[num]);		
			for(i=0;i<sizeof(LEDTAB);i++)
			{ 
				GPIO_Write(GPIOD,LEDSEG[iRand]);
				GPIO_Write(GPIOB,LEDTAB[i]);
				DelaymS(10);
			}
	}
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值