标题:
stm32使用寄存器做一个流水灯
[打印本页]
作者:
yea1
时间:
2021-6-28 11:23
标题:
stm32使用寄存器做一个流水灯
使用寄存器方式,用stm32做一个流水灯。
硬件:stm32f103R6,一个按键,5个LED灯。
功能:按键可以实现左移、右移、从中间往两边移动。
原理图:
1.png
(70.27 KB, 下载次数: 90)
下载附件
2021-6-28 15:05 上传
波形仿真:
代码:
#include "stm32f10x.h"
/**
* @brief 延时函数
* @param time :X ms
* @retval none
*/
void delay_ms(u16 time)
{
u16 i=0;
while(time--)
{
i=12000; //自己定义
while(i--) ;
}
}
/**
* @brief LED初始化
* @param none
* @retval none
*/
void LED_Init(void)
{
RCC->APB2ENR|=1<<4; //使能PORTC时钟
GPIOC->CRL &= 0xFFF00000;
GPIOC->CRL |= 0x00033333;//PC0-PC4 推挽输出
GPIOC->ODR |= 0x0000001F; //PC0-PC4 输出高,灯关闭状态
}
/**
* @brief 按键初始化
* @param none
* @retval none
*/
void KEY_Init(void)
{
RCC->APB2ENR|=1<<3; //使能PORTB时钟
GPIOB->CRL &= 0xFFFFF000;
GPIOB->CRL |= 0x00000888; //PB0-PB2 上拉输入
GPIOB->ODR |= 1<<0;
}
/**
* @brief 流水灯左移
* @param none
* @retval none
*/
void LED_MoveLeft(void)
{
GPIOC->ODR |= 0x0000001F; //灯全部关闭
delay_ms(10);
GPIOC->ODR &= 0xFFFFFFEF; //右边第一个LED亮
delay_ms(10);
GPIOC->ODR &= 0xFFFFFFF7; //右边第二个LED亮
delay_ms(10);
GPIOC->ODR &= 0xFFFFFFFB; //右边第三个LED亮
delay_ms(10);
GPIOC->ODR &= 0xFFFFFFFD; //右边第四个LED亮
delay_ms(10);
GPIOC->ODR &= 0xFFFFFFFE; //右边第五个LED亮
delay_ms(10);
}
/**
* @brief 流水灯右移
* @param none
* @retval none
*/
void LED_MoveRight(void)
{
GPIOC->ODR |= 0x0000001F; //灯全部关闭
delay_ms(10);
GPIOC->ODR &= 0xFFFFFFFE; //右边第五个LED亮
delay_ms(10);
GPIOC->ODR &= 0xFFFFFFFD; //右边第四个LED亮
delay_ms(10);
GPIOC->ODR &= 0xFFFFFFFB; //右边第三个LED亮
delay_ms(10);
GPIOC->ODR &= 0xFFFFFFF7; //右边第二个LED亮
delay_ms(10);
GPIOC->ODR &= 0xFFFFFFEF; //右边第一个LED亮
delay_ms(10);
}
/**
* @brief 流水灯从中间往两边移动
* @param none
* @retval none
*/
void LED_MoveToSide(void)
{
GPIOC->ODR |= 0x0000001F; //灯全部关闭
delay_ms(10);
GPIOC->ODR &= 0xFFFFFFFB; //中间灯亮
delay_ms(10);
GPIOC->ODR &= 0xFFFFFFF1; //中间灯亮
delay_ms(10);
GPIOC->ODR &= 0xFFFFFFE0; //最外灯亮
delay_ms(10);
}
/**
* @brief 主函数
* @param none
* @retval none
*/
int main(void)
{
u16 t;
static u8 i=0;
LED_Init(); //LED初始化
KEY_Init(); //按键初始化
while(1)
{
t=GPIOB->IDR;
if(!(t & 0x0001))
{
i++;
if(i>3)
i=0;
switch(i)
{
case 1: LED_MoveLeft();//左移
break;
case 2: LED_MoveToSide();//两边移
break;
case 3:LED_MoveRight();//右移
break;
default:break;
}
}
//若要使用keil的逻辑示波器,取消延时注释,更方便观测波形
//delay_ms(200); //延时200ms
}
}
复制代码
作者:
heikeji2021
时间:
2021-6-29 12:03
现在主要芯片太贵
作者:
heikeji2021
时间:
2021-6-29 12:04
能不能用8脚芯片做?
作者:
parkine
时间:
2021-6-30 18:10
能不能用8脚芯片做?
作者:
heikeji2021
时间:
2021-6-30 22:23
编译出错,不会搞呀
作者:
512-DZ
时间:
2021-7-4 12:16
能不能用8脚芯片做?
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1