跑马灯及其呼吸灯
跑马灯
1.需要在项目中添加GPIO的驱动(前篇已经讲到)
每个项目放到的文件夹可能不一样,所以具体看你自己的项目,前篇更为详细,这个项目内容有点乱
2.修改配置文件
现在已经初始化GPIOB5和GPIOE5,根据stm32的电路图我们可以知道GPIOB5和GPIOE5分别控制led0(红灯)和led1(绿灯)
编写或者定义功能函数
GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)来判断key_up按键是否有按下,当有按键按下时就 GPIO_SetBits(GPIOE,GPIO_Pin_5);或者
GPIO_ResetBits(GPIOE,GPIO_Pin_5);来置位或者重置led1(GPIOE绿灯)
2.硬件连接
J-OB 黄线连接SWD对应板子上连接SWDIO,连接CLK的橙色对应连接板子上SWDCLK,红线连接GND的对应连接板子上GND(线的颜色没影响,
主要时要对应连接)
呼吸灯
以上连接都不变,只需要将主函数中的程序修改即可
以下为呼吸灯的程序
void LedOnOff(uint16_t t,uint16_t i,uint8_t no)
{
GPIO_ResetBits(GPIOB,GPIO_Pin_5);//bsp_LedOn(no);
GPIO_SetBits(GPIOE,GPIO_Pin_5); //bsp_LedOff(no);
delay_us(i); //bsp_DelayUS(i);
GPIO_SetBits(GPIOB,GPIO_Pin_5); //bsp_LedOff(no);
GPIO_ResetBits(GPIOE,GPIO_Pin_5);
delay_us(t-i); //bsp_DelayUS(t-i);
}
int main(void)
{
int i=0;
delay_init(); //???????
LED_Init(); //???LED??
while(1)
{
for(i=1; i<25000; i+=416)
LedOnOff(25000,i,3);
for(i=25000; i>1; i-=416)
LedOnOff(25001,i,3);
}
}
通用型方法二
/*
原理分析,模拟人体呼吸,吸气和呼气各占1.5S,人眼的图像滞留时间0.04s(1/24帧画面)
按最快0.04s算,就是40ms。亮0.02S,灭0.02s,人眼看到的应该是一直亮(可以实验)
呼吸灯,就是改变这40ms中,亮和灭所占的百分比。
亮的百分比多,人眼看到的就亮,反之就是暗(实验,设置20ms一个周期,20ms内调整亮和灭的比例)
因此程序设计:1.5S需要1500/20=75个周期,75个周期中,亮度百分比有0%增长到100%,因此每个周期增长
时间为20ms/75=266us(点亮)。熄灭的原理,正好相反,熄灭时间增长。
*/
#define B_length 3000000
#define NUM 30000
#define FR NUM/(B_length/NUM)
int main(void)
{
int i=0;
delay_init(); //初始化延时函数
LED_Init(); //初始化LED端口
while(1)
{
// GPIO_ResetBits(GPIOB,GPIO_Pin_5); //LED0对应引脚GPIOB.5拉低,亮 等同LED0=0;
// GPIO_SetBits(GPIOE,GPIO_Pin_5); //LED1对应引脚GPIOE.5拉高,灭 等同LED1=1;
// GPIO_SetBits(GPIOB,GPIO_Pin_8);
// delay_ms(300); //延时300ms
// GPIO_SetBits(GPIOB,GPIO_Pin_5); //LED0对应引脚GPIOB.5拉高,灭 等同LED0=1;
// GPIO_ResetBits(GPIOE,GPIO_Pin_5); //LED1对应引脚GPIOE.5拉低,亮 等同LED1=0;
// GPIO_ResetBits(GPIOB,GPIO_Pin_8);
// delay_ms(300); //延时300ms
for(i=1; i<NUM+1; i+=FR)
LedOnOff(NUM+1,i,3);
for(i=NUM; i>1; i-=FR)
LedOnOff(NUM+1,i,3);
delay_ms(500);
}
}

2万+

被折叠的 条评论
为什么被折叠?



