使用stm32来完成 花样流水灯
(1)LED灯从中间向两边依次点亮,每次点亮时间间隔不低于 500ms,到还剩最高位和最低位的 灯不亮时,显示5次呼吸灯,最后点亮全部灯(呼吸时间可调节)。
(2)待LED灯全部点亮后,再向两边往中间熄灭,每次熄灭时间间隔不低于 500ms,到中间熄灭 时,最后显示6次呼吸灯,全部熄灭(呼吸时间可调节)。
(3)在暂停后,按下另一个独立按键,可以增加 LED点亮和熄灭的时间间隔,按下一次增加时间 不少于 500ms.同时,当LED灯点亮和熄灭的时间间隔过长时,按下另外一个独立可以减小时间间隔,减少时间不少于500ms。
(4)用独立按键使 LED流水灯效果暂停,再次按下后 LED灯流水灯效果继续,必须从暂停处开始 运行(在呼吸灯状态下也同样暂停)。
我写的代码思路:用16进制控制8个LED灯达到循环效果 接下来用while循环嵌套实现呼吸灯次数控制
按键外部中断封装在Key.c里面 key模块会返回延时时间i
问题:代码现象是只有流水灯(中间往两边点亮 两边往中间熄灭) 没有呼吸灯的现象 按键也不能控制流水灯延时时间 按键按下去没反应 但是把流水灯代码注释之后又有呼吸灯的现象 我觉得不是流水灯把呼吸灯覆盖了 因为呼吸灯先 流水灯后 也还是没有呼吸灯现象
以下是重要模块代码
main.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "PWM.h"
#include "Key.h"
//Ҫͨ¹ý°´¼üº¯Êý²ÎÊý¸Ästm32f10x_rcc
int i=500;
int j;
int count2=0;
int main(void)
{
PWM_Init();
Key_Init();
Key_Get_Time();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
while (1)
{
GPIO_Write(GPIOA, ~0x18); //0000 0000 0000 0001
Delay_ms(i);
GPIO_Write(GPIOA, ~0x3C); //0000 0000 0000 0010
Delay_ms(i);
GPIO_Write(GPIOA, ~0x7E); //0000 0000 0000 0100
Delay_ms(i);
GPIO_Write(GPIOA, ~0xFF); //0000 0000 0000 1000
Delay_ms(i);
//ÏÔʾ5´ÎºôÎüµÆ
while(count2<=5)
{
for (j = 0; j <= 100; j++)
{
PWM_SetCompare1(j);
Delay_ms(10);
}
for (j = 0; j <= 100; j++)
{
PWM_SetCompare1(100 - j);
Delay_ms(10);
count2++;
}
}
GPIO_Write(GPIOA, ~0x7E); //0000 0000 0001 0000
Delay_ms(i);
GPIO_Write(GPIOA, ~0x3C); //0000 0000 0010 0000
Delay_ms(i);
GPIO_Write(GPIOA, ~0x18); //0000 0000 0100 0000
Delay_ms(i);
GPIO_Write(GPIOA, ~0x00); //0000 0000 1000 0000
Delay_ms(i);
Delay_ms(i);
//ÏÔʾ6´ÎºôÎüµÆ
while(count2<=6)
{
for (j = 0; j <= 100; j++)
{
PWM_SetCompare1(j);
Delay_ms(10);
}
for (j = 0; j <= 100; j++)
{
PWM_SetCompare1(100 - j);
Delay_ms(10);
}
count2++;
}
}
}
key.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
uint16_t count;
static int i;
void Key_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
//中断配置
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line = EXTI_Line14;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_InitStructure.EXTI_Mode =EXTI_Mode_Interrupt ;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_Init(&EXTI_InitStructure);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
NVIC_Init(&NVIC_InitStructure);
}
uint16_t Key_Get(void)
{
return count;
}
int Key_Get_Time(void)
{
return i;
}
void EXTI15_10_TRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line14)==SET)
{
count++;
EXTI_ClearITPendingBit(EXTI_Line14);
}
}
uint8_t Key_GetNum(void)
{
uint8_t KeyNum = 0;
if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0)
{
Delay_ms(20);
while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0);
Delay_ms(20);
KeyNum = 1;
i+=500;
}
if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0)
{
Delay_ms(20);
while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0);
Delay_ms(20);
KeyNum = 2;
i-=500;
}
return KeyNum;
}
key.h
#ifndef __KEY_H
#define __KEY_H
void Key_Init(void);
uint8_t Key_GetNum(void);
uint16_t Key_Get(void);
int Key_Get_Time(void);
#endif
PWM.c
#include "stm32f10x.h" // Device header
void PWM_Init(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
// GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2, ENABLE);
// GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
TIM_InternalClockConfig(TIM2);
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_Period = 100 - 1; //ARR
TIM_TimeBaseInitStructure.TIM_Prescaler = 720 - 1; //PSC
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCStructInit(&TIM_OCInitStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0; //CCR
TIM_OC1Init(TIM2, &TIM_OCInitStructure);
TIM_Cmd(TIM2, ENABLE);
}
void PWM_SetCompare1(uint16_t Compare)
{
TIM_SetCompare1(TIM2, Compare);
}