寄存器开发控制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(); 
    }
}
相关推荐
悠哉悠哉愿意4 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
Lester_11014 天前
STM32霍尔传感器输入口设置为复用功能输入口时,还能用GPIO函数直接读取IO的状态吗
stm32·单片机·嵌入式硬件·电机控制
LCG元4 天前
低功耗显示方案:STM32L0驱动OLED,动态波形绘制与优化
stm32·嵌入式硬件·信息可视化
三佛科技-187366133974 天前
120W小体积碳化硅电源方案(LP8841SC极简方案12V10A/24V5A输出)
单片机·嵌入式硬件
z20348315204 天前
STM32F103系列单片机定时器介绍(二)
stm32·单片机·嵌入式硬件
Alaso_shuang4 天前
STM32 核心输入、输出模式
stm32·单片机·嵌入式硬件
脚后跟4 天前
AI助力嵌入式物联网项目全栈开发
嵌入式硬件·物联网·ai编程
2501_918126914 天前
stm32死锁是怎么实现的
stm32·单片机·嵌入式硬件·学习·个人开发
z20348315204 天前
STM32F103系列单片机定时器介绍(一)
stm32·单片机
星马梦缘4 天前
驱动层开发——蜂鸣器驱动
stm32·单片机·嵌入式硬件·hal·驱动