按键控制流水灯快慢及其方向

说明:目的是为了实现通过两个按键控制,一个实现控制流水灯的方向,另一个是控制流水灯的快慢。

2:芯片基于STM32F103RB    型号为——CT117E

#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x.h"
#include "core_cm3.h"
#include "misc.h
"

#define LED0    GPIO_Pin_8
#define LED1    GPIO_Pin_9
#define LED2    GPIO_Pin_10
#define LED3    GPIO_Pin_11
#define LED4    GPIO_Pin_12
#define LED5    GPIO_Pin_13
#define LED6    GPIO_Pin_14
#define LED7    GPIO_Pin_15
#define LED_ALL (LED0 | LED1 | LED2 | LED3 | LED4 | LED5 | LED6 | LED7)
#define LED_PORT GPIOC
#define N_LE	GPIO_Pin_2
#define N_LE_PORT	GPIOD
#define SWN	4	/*????*/
#define N_K1	GPIO_Pin_0
#define N_K2	GPIO_Pin_8
#define N_K3	GPIO_Pin_1
#define N_K4	GPIO_Pin_2
#define N_K1C	GPIOA
#define N_K2C	GPIOA
#define N_K3C	GPIOB
#define N_K4C	GPIOB

#define LED_OUT(x) 	GPIO_SetBits(LED_PORT,LED_ALL), \
			GPIO_ResetBits(LED_PORT, x<<8), \
			GPIO_SetBits(N_LE_PORT,N_LE), \
			GPIO_ResetBits(N_LE_PORT,N_LE)

标记的定义:
typedef enum
{ 
	FALSE = 0,
  	TRUE
}y_bool;
static y_bool led_t = TRUE;	//发光标记
static y_bool rl = TRUE;	//左移右移
static y_bool km = TRUE;	//快慢
static y_bool key_t = FALSE;	//按键检测标记


 
 
void init()
{
	GPIO_InitTypeDef GPIO_InitStructure;
	//
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE);				
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD , ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);				
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);

	//LED
	GPIO_InitStructure.GPIO_Pin = LED_ALL ;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_Init(LED_PORT , &GPIO_InitStructure);

	/*N_LE*/ 
	GPIO_InitStructure.GPIO_Pin=N_LE;
	GPIO_Init(N_LE_PORT , &GPIO_InitStructure);
	
	/*    */
	GPIO_InitStructure.GPIO_Pin =  N_K1 | N_K2;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Init(N_K1C , &GPIO_InitStructure);
	GPIO_InitStructure.GPIO_Pin =  N_K3 | N_K4;
	GPIO_Init(N_K3C , &GPIO_InitStructure);


	/* 时钟*/
   	//SysTick_Config(8000);
}
//SysTick定义快慢
void SysTick_Handler()				
{
	static uint16_t i = 0;
	if(++i >= 1000)        
		i = 0;
	if(i % 20 == 0)
		key_t = TRUE;
	if(i%500 == 0)
		led_t = TRUE;
}

/*时钟的初始化*/
void SysT()
{
	if(km)
	SysTick_Config(8000);
	else
		 SysTick_Config(2000);
}

/*Led显示*/
void Led()
{
	static uint8_t led_b = 0x01;
	LED_OUT(led_b);//数据输出
	SysT();//调用时钟
	if(rl)//判断左移还是右移
	{
		if((led_b <<= 1) == 0x00)
			led_b = 0x01;
	}
	else
	{
		if((led_b >>= 1) == 0x00)
			led_b = 0x80;
	}
}


/*按键的检测*/
uint8_t key_c()
{
	static uint8_t key_o = 0x0f;
	uint8_t i, key_n, x;
	const uint16_t key_pin[SWN] = {N_K1, N_K2, N_K3, N_K4};		//引脚
	const GPIO_TypeDef* key_port[SWN] = {N_K1C, N_K2C, N_K3C, N_K4C};//各个端口
	for(key_n = 0, i = 0; i < SWN; i++)
	{
		key_n <<= 1;
		if(GPIO_ReadInputDataBit((GPIO_TypeDef*)key_port[i], key_pin[i]))
		  key_n |= 0x01;  
	}
	x = (key_n ^ key_o) & key_o;//检测有无按键按下
	key_o = key_n;//当前按键值作为下一次比较的值
	return x;
}
/*按键的处理*/
void key_d(uint8_t x)
{
	if(x & 0x08)
		rl = !rl;
	if(x & 0x04)
		km = !km;
}

主函数:

int main()
{	
	uint8_t key_dn;
	init();	
	while(1)
	{
		if(led_t)
		{
			led_t = FALSE;
			Led();		
		}
		/*°´¼üÒ»¼ì²â£¨×óÓÒÒƶ¯£©*/
		if(key_t)
		{
			key_t = FALSE;
			key_dn = key_c();
		}
		if(key_dn)
		{
			key_d(key_dn);
			key_dn = 0x00;
		}
  }
		
}






  • 11
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是Python中使用GPIO控制流水灯流动方向的代码示例: ```python import RPi.GPIO as GPIO import time # 设置GPIO模式为BCM GPIO.setmode(GPIO.BCM) # 定义LED引脚 led_pins = [17, 18, 27, 22] # 设置引脚为输出模式 for pin in led_pins: GPIO.setup(pin, GPIO.OUT) # 定义按键引脚 button_pin = 23 # 设置按键引脚为输入模式,上拉电阻 GPIO.setup(button_pin, GPIO.IN, pull_up_down=GPIO.PUD_UP) # 定义流水灯流动方向 direction = 1 # 循环流水灯 while True: # 检测按键状态 if GPIO.input(button_pin) == GPIO.LOW: # 按键按下,改变流动方向 direction *= -1 time.sleep(0.2) # 点亮LED for i in range(len(led_pins)): if i % 2 == 0: GPIO.output(led_pins[i], GPIO.HIGH) else: GPIO.output(led_pins[i], GPIO.LOW) # 等待一段时间 time.sleep(0.2) # 熄灭LED for i in range(len(led_pins)): if i % 2 == 0: GPIO.output(led_pins[i], GPIO.LOW) else: GPIO.output(led_pins[i], GPIO.HIGH) # 等待一段时间 time.sleep(0.2) # 改变流动方向 if direction == -1: led_pins.reverse() # 清理GPIO口 GPIO.cleanup() ``` 在这个例子中,我们使用了RPi.GPIO库来控制GPIO口。我们定义了4个LED引脚和1个按键引脚,并将它们分别设置为输出和输入模式。我们使用一个while循环来循环流水灯,并检测按键状态来改变流动方向。在每次循环中,我们点亮偶数引脚的LED,等待一段时间,然后熄灭偶数引脚的LED,再等待一段时间。最后,如果流动方向为反向,我们将LED引脚列表翻转,以改变流动方向

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值