C语言点灯

头文件代码:

#ifndef __LED_H__
#define __LED_H__

#define RCC_AHB4_ENSETR  (*(volatile unsigned int*)0x50000A28)
#define GPIOE ((gpio_t*)0x50006000)
#define GPIOF ((gpio_t*)0x50007000)
//结构体封装寄存器
typedef struct{
    volatile unsigned int MODER;    //00
    volatile unsigned int OTYPER;   //04
    volatile unsigned int OSPEEDR;  //08
    volatile unsigned int PUPDR;    //0C
    volatile unsigned int IDR;      //10
    volatile unsigned int ODR;      //14
}gpio_t;

typedef enum{
    LED1 = 1,
    LED2 = 2,
    LED3 = 3,
}led_t;

typedef enum{
    OFF = 0,
    ON = 1,
}state_t;

//LED灯初始化函数
void led_init();
//LED灯状态函数
void led_state(led_t led,state_t state);

#endif

源文件代码:

#include"led.h"

//LED灯初始化函数
void led_init()
{
/*************************LED1--->PE10*************************/
    /****************RCC章节初始化**************/
    RCC_AHB4_ENSETR |= (0x1<<4);
    /****************GPIO章节初始化************/
    //设置PE10引脚为输出模式
    GPIOE->MODER &= (~(0x3<<20));
    GPIOE->MODER |= (0x1<<20);
    //设置PE10引脚为推挽输出模式
    GPIOE->OTYPER &= (~(0x1<<10));
    //设置PE10引脚为低速输出
    GPIOE->OSPEEDR &= (~(0x3<<20));
    //设置PE10引脚禁止上下拉
    GPIOE->PUPDR &= (~(0x3<<20));

/*************************LED2--->PF10*************************/
    /****************RCC章节初始化**************/
    RCC_AHB4_ENSETR |= (0x1<<5);
    /****************GPIO章节初始化************/
    //设置PE10引脚为输出模式
    GPIOF->MODER &= (~(0x3<<20));
    GPIOF->MODER |= (0x1<<20);
    //设置PE10引脚为推挽输出模式
    GPIOF->OTYPER &= (~(0x1<<10));
    //设置PE10引脚为低速输出
    GPIOF->OSPEEDR &= (~(0x3<<20));
    //设置PE10引脚禁止上下拉
    GPIOF->PUPDR &= (~(0x3<<20));

/*************************LED3--->PE8*************************/
    /****************RCC章节初始化**************/
    RCC_AHB4_ENSETR |= (0x1<<4);
    /****************GPIO章节初始化************/
    //设置PE10引脚为输出模式
    GPIOE->MODER &= (~(0x3<<16));
    GPIOE->MODER |= (0x1<<16);
    //设置PE10引脚为推挽输出模式
    GPIOE->OTYPER &= (~(0x1<<8));
    //设置PE10引脚为低速输出
    GPIOE->OSPEEDR &= (~(0x3<<16));
    //设置PE10引脚禁止上下拉
    GPIOE->PUPDR &= (~(0x3<<16));
}


//LED灯状态函数
void led_state(led_t led,state_t state)
{
    if(1==led && 1==state)
    {
        //LED1点亮
        GPIOE->ODR |= (0x1<<10);
    }
    else if(1==led && 0==state)
    {
        //LED1熄灭
        GPIOE->ODR &= (~(0X1<<10));
    }
    else if(2==led && 1==state)
    {
        //LED2点亮
        GPIOF->ODR |= (0x1<<10);
    }
    else if(2==led && 0==state)
    {
        //LED2熄灭
        GPIOF->ODR &= (~(0X1<<10));
    }
    else if(3==led && 1==state)
    {
        //LED3点亮
        GPIOE->ODR |= (0x1<<8);
    }
    else if(3==led && 0==state)
    {
        //LED3熄灭
        GPIOE->ODR &= (~(0X1<<8));
    }
}

测试文件代码:

#include "led.h"
extern void printf(const char *fmt, ...);
void delay_ms(int ms)
{
    int i,j;
    for(i = 0; i < ms;i++)
        for (j = 0; j < 1800; j++);
}


int main()
{
    //LED灯初始化
    led_init();
    while(1)
    {
        //实现san
        led_state(LED1,ON);
        delay_ms(1000);
        led_state(LED2,ON);
        delay_ms(1000);
        led_state(LED3,ON);
        delay_ms(1000);
        led_state(LED1,OFF);
        delay_ms(1000);
        led_state(LED2,OFF);
        delay_ms(1000);
        led_state(LED3,OFF);
        delay_ms(1000);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值