寄存器开发控制LED

利用STM32系列开发板与计算机Keil编程设计,载入程序以实现目标:

LED灯闪烁模式自动轮换------模式1:流水灯从左到右,从右到左依次闪烁三次

模式2:全部流水灯闪烁五次

模式3:流水灯编号1、3与流水灯编号2、4,依次闪烁三次

模式4:"流水灯1->流水灯4->流水灯2->流水灯3"依次点亮,循环四次

简单提供代码思路如下:

cpp 复制代码
#include "stm32f4xx.h" 

void delay_500ms(void)
{
       volatile unsigned int i, j;
    for(i = 0; i < 8400; i++)
    {
        for(j = 0; j < 1000; j++);
    }
}

void delay(void)
{
    unsigned int i,j=4000;
    while(j--)
    {
        for(i=0;i<200;i++);
    }
}

void LED_Init(void)
{
        RCC->AHB1ENR |= (1<<4);
    
        GPIOE->MODER &= ~(0xFF << (2*2));
    GPIOE->MODER |= (0x55 << (2*2));
    
       GPIOE->OTYPER &= ~(0x3C);
    
       GPIOE->OSPEEDR |= (0x55 << (2*2));
    
      GPIOE->PUPDR &= ~(0xFF << (2*2));
}

void LED_Set(unsigned char leds)
{
    GPIOE->ODR = (GPIOE->ODR & ~0x3C) | ((leds & 0x0F) << 2);
}

void mode_flow_light(void)
{
    unsigned char i, j;
    unsigned char led_pattern[4] = {0x1, 0x2, 0x4, 0x8};
    
    for(j=0; j<3; j++)
    {
               for(i=0; i<4; i++)
        {
            LED_Set(led_pattern[i]);
            delay_500ms();        }
        
             for(i=0; i<4; i++)
        {
            LED_Set(led_pattern[3-i]);
            delay_500ms();         }
    }
}

void mode_all_blink(void)
{
    unsigned char i;
    
    for(i=0; i<5; i++)
    {
        LED_Set(0x0F); 
        delay_500ms(); 
        LED_Set(0x00); 
        delay_500ms(); 
    }
}

void mode_13_24_blink(void)
{
    unsigned char i;
    
    for(i=0; i<3; i++)
    {
               LED_Set(0x05);
        delay_500ms(); 
        
              LED_Set(0x00);
        delay_500ms();
        
               LED_Set(0x0A);
        delay_500ms(); 
        
              LED_Set(0x00);
        delay_500ms(); 
    }
}

void mode_sequence_light(void)
{
    unsigned char i, j;
    unsigned char sequence[4] = {0x1, 0x8, 0x2, 0x4}; 
    
    for(j=0; j<4; j++)
    {
        for(i=0; i<4; i++)
        {
            LED_Set(sequence[i]);
            delay_500ms(); 
        }
        LED_Set(0x00);         delay_500ms();     }
}

int main(void)
{
    unsigned char current_mode = 0;
    
       LED_Init();
    
      LED_Set(0x00);
    
    while(1)
    {
        switch(current_mode)
        {
            case 0:
                mode_flow_light();                  
 break;
                
            case 1:
                mode_all_blink();                  
 break;
                
            case 2:
                mode_13_24_blink();                 
 break;
                
            case 3:
                mode_sequence_light();                
 break;
        }
        
        
        current_mode = (current_mode + 1) % 4;
        
        LED_Set(0x00); 
        delay_500ms(); 
        delay_500ms(); 
    }
}
相关推荐
番茄灭世神41 分钟前
PN学堂GD32教程第21篇——WiFiIOT
c语言·stm32·单片机·嵌入式·gd32
不怕犯错,就怕不做2 小时前
ARM设备异常断电容易造成数据损坏,硬件如何设计
linux·驱动开发·嵌入式硬件
jghhh012 小时前
基于DSP28335的RS485串口通信与AD采样开发方案
单片机·嵌入式硬件
say_fall2 小时前
微处理器及其体系结构:从8088到现代多核处理器
单片机·硬件架构·硬件工程
2301_775602382 小时前
晶振相关知识
单片机
2zcode3 小时前
基于STM32的直流电机串级PID伺服控制系统设计与实现
stm32·单片机·嵌入式硬件·直流电机
都在酒里3 小时前
STM32低功耗休眠详解——睡眠、停止与待机模式实战,综合应用(三)
stm32·单片机·嵌入式硬件
嵌入式小站3 小时前
STM32 零基础可移植教程 06:外部中断按键,不用一直在 while 里盯着它
stm32·单片机·嵌入式硬件
大卡片4 小时前
GPIO控制器原理
单片机·嵌入式硬件
余生皆假期-4 小时前
J-link Commander 命令操作 MCU 连接、调试、烧录、擦除等
单片机·嵌入式硬件