找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 785|回复: 0
打印 上一主题 下一主题
收起左侧

stm32单片机流水灯代码

[复制链接]
跳转到指定楼层
楼主
ID:1073139 发表于 2023-4-21 11:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
代码:
#include "stm32f10x.h"
#include "bsp_led.h"
#include "bsp_key.h"


void Tim3_Int_Init(u16 arr,u16 psc);
void TIM3_IRQHandler(void);
int x = 1;
int mode = 0;
int change = 0;
int y = 1;

/**
  * @brief  主函数
  * @param  无  
  * @retval 无
  */
int main(void)
{   
    /* LED 端口初始化 */
    LED_GPIO_Config();   

    while (1)
    {
        if (mode==1 && change==0)
        {
            Tim3_Int_Init(4999, 7199);
            change = 1;
        }
        else if (mode==2 && change==0)
        {
            Tim3_Int_Init(7199, 9999);
            change = 1;
        }
        TIM3_IRQHandler();
        if( Key_Scan(KEY2_GPIO_PORT,KEY2_GPIO_PIN) == KEY_ON )
        {
            mode += 1;
            change = 0;
            if (mode >= 5)
            {
                mode = 1;
            }
        }
        if( Key_Scan(KEY1_GPIO_PORT,KEY1_GPIO_PIN) == KEY_ON )
        {
            y += 1;
            LED1_ON;
        }
    }
}

void Tim3_Int_Init(u16 arr,u16 psc)
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;//配置定时器时钟
    NVIC_InitTypeDef NVIC_InitStruct;//配置中断控制器

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//使能定时器时钟

    TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;//设置时钟分割
    TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//设置为向上计数模式
    TIM_TimeBaseInitStruct.TIM_Period = arr;//设置在下一个更新时间装入活动的自动重装载寄存器周期的值
    TIM_TimeBaseInitStruct.TIM_Prescaler = psc;//预分频值

    TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);//初始化

    TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//使能TIM3中断,允许更新中断

    NVIC_InitStruct.NVIC_IRQChannel = TIM3_IRQn;
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 3;
    NVIC_Init(&NVIC_InitStruct);//NVIC

    TIM_Cmd(TIM3,ENABLE);//使能TIM3
}

void TIM3_IRQHandler(void)
{
    if(TIM_GetITStatus(TIM3,TIM_IT_Update) == 1)//检查TIM3更新中断发生与否
    {
        TIM_ClearITPendingBit(TIM3,TIM_IT_Update);//清除TIMx更新中断标志
        x += 1;
        switch(mode)
        {
            case 1:
                if (x==1)
                {
                    LED3_OFF;
                    LED1_ON;
                }
                else if (x==2)
                {
                    LED1_OFF;
                    LED2_ON;
                }
                else if (x==3)
                {
                    LED2_OFF;
                    LED3_ON;
                    x = 0;
                }
                break;
            case 2:
                if (x==1)
                {
                    LED2_OFF;
                    LED3_OFF;
                    LED1_ON;
                }
                else if (x==2)
                {
                    LED2_ON;
                    LED3_ON;
                    x = 0;
                }
                break;
            case 3:
                if (y==1)
                {
                    LED3_OFF;
                    LED1_ON;
                }
                else if (y==2)
                {
                    LED1_OFF;
                    LED2_ON;
                }
                else if (y==3)
                {
                    LED2_OFF;
                    LED3_ON;
                    y = 1;
                }
                break;
            default:
                break;
        }


    }

}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表