–led.h
#ifndef __Led_h
#define __Led_h
#define BITBANDADDR(addr,n) ((addr & 0xF0000000) + 0x2000000 + ((addr & 0xFFFFF) << 5) + (n << 2))
#define MEMACCESS(addr) (*((volatile unsigned long *)addr))
#define BIT_ADDR(addr,n) (MEMACCESS(BITBANDADDR(addr,n)))
#define GPIOE_ODR_ADDR (GPIOE_BASE + 0x0C)
/*GPIOE 的 ODR 偏移量为 0x0c*/
#define GPIOE_IDR_ADDR (GPIOE_BASE + 0x08)
/*GPIOE 的 IDR 偏移量为 0x08*/
#define PEout(n) BIT_ADDR(GPIOE_ODR_ADDR,n)
#define PEin(n) BIT_ADDR(GPIOE_IDR_ADDR,n)
//位代操作,直接操作位
#define LED1_ON (GPIOE->ODR &= 0xFEFF)
// GPIO_ResetBits(GPIOE,GPIO_Pin_8)
#define LED1_OFF (GPIOE->ODR |= 0x0100)
// GPIO_SetBits(GPIOE,GPIO_Pin_8)
#define LED2_ON (GPIOE->ODR &= 0xFDFF)
// GPIO_ResetBits(GPIOE,GPIO_Pin_9)
#define LED2_OFF (GPIOE->ODR |= 0x0200)
// GPIO_SetBits(GPIOE,GPIO_Pin_9)
#define LED3_ON (GPIOE->ODR &= 0xFBFF)
// GPIO_ResetBits(GPIOE,GPIO_Pin_10)
#define LED3_OFF (GPIOE->ODR |= 0x0400)
// GPIO_SetBits(GPIOE,GPIO_Pin_10)
#define LED1 PEout(8)
#define LED2 PEout(9)
#define LED3 PEout(10)
#define LED4 PEout(11)
#define LED1_IN PEin(8)
#define LED2_IN PEin(9)
#define LED3_IN PEin(10)
#define LED4_IN PEin(11)
//位代直接操作位上面的小灯泡
void Led_Init(void);
void Led_FlowWater(void);
void Led_breath(void);
void delay(int);
void Led_FlowWater_PEout(void);
#endif
–led.c
#include <stdio.h>
#include "stm32f10x.h"
#include "delay.h"
#include "Led.h"
#define T 200
static int i = 0;
static int j = 0;
void Led_Init(void)
{
RCC->APB2ENR |= 0x0040;
//RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
GPIOE->CRH = (GPIOE->CRH&0xFFFF0000)|0x00003333;
//GPIO_InitTypeDef GPIO_InitStructure;
//GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10;
//GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
//GPIO_Init(GPIOE,&GPIO_InitStructure);
}
void Led_FlowWater(void) //流水灯
{
LED1_ON ;
LED2_OFF ;
LED3_OFF ;
delay(5);
LED1_OFF ;
LED2_OFF ;
LED3_ON ;
delay(5);
LED1_OFF ;
LED2_ON ;
LED3_OFF ;
delay(5);
}
void Led_breath(void)//呼吸灯
{
int time;
GPIOE->CRH = (GPIOE->CRH&0xFFFFF000)|0x00000003;
//GPIOE的高8位的8、9、10端口置0,然后推挽输出频率为50HZ(3 : 0011);
for( time = 1 ; time < T ; time += 1)
{
LED1_ON;
delay(time);
LED1_OFF;
delay( T - time);
}
for( time = T ; time > 0 ; time -= 1)
{
LED1_ON;
delay(time);
LED1_OFF;
delay( T - time);
}
}
void delay(int ms)
{
for( i = 0 ; i < 100 ; i++)
for(j = 0 ; j < ms ; j++);
}
void Led_FlowWater_PEout(void)
{
LED1 = 0 ;
delay(5000);
LED1 = 1 ;
delay(5000);
}