用开关控制LED(五)

这个比较简单,和之前说的控制LED没有本质的差别。

我们看一下原理图开关和LED的位置。


这里开关并不是灯连一起的,我们只能检测开关状态然后控制灯。


裸机下不知道怎么控制中断寄存器,就先用GPIO的输入功能先了。
我们把按键的gpio设置为输入功能,led的gpio设置为输出功能。

一个循环来检测按键的状态,如果按下就给灯的gpio输出低电平,就点亮。反之就输出高电平,灯灭了。


原理很简单,我们这里主要实现是 位控制。

我们的控制的原则是:不能破坏原来寄存器的状态,设置寄存器。

这里涉及到C语言的位操作,这里主要看C语言的位操作。

这里见我总结的C语言位运算,详细见:http://blog.csdn.net/zmnqazqaz/article/details/51266616


下面是代码时间:

├── startc.S
└── switch_led
    ├── led_switch.c
    └── Makefile

 led_switch.c
#include "../../pub/include/bit.h"
#define P_GPFCON      ((volatile unsigned long *)0x56000050)
#define P_GPFDAT      ((volatile unsigned long *)0x56000054)
#define P_GPGCON      ((volatile unsigned long *)0x56000060)
#define P_GPGDAT      ((volatile unsigned long *)0x56000064)

int  main()
{


        //关闭LED
        setNbit(P_GPFDAT,2,4,0x7);//111
        //按键默认抬起
        SetBit(*P_GPFDAT,0);
        SetBit(*P_GPFDAT,2);
        SetBit(*P_GPGDAT,3);

        //1.config
        setNbit(P_GPFCON,2,4*2,0x1);
        setNbit(P_GPFCON,2,5*2,0x1);
        setNbit(P_GPFCON,2,6*2,0x1);

        setNbit(P_GPFCON,2,0*2,0x0);
        setNbit(P_GPFCON,2,2*2,0x0);
        setNbit(P_GPGCON,2,3*2,0x0);

 while(1)
        {
                if(GetBit(*P_GPFDAT,0)==0){
                        ClearBit(*P_GPFDAT,4);//LED1
                }else{
                        SetBit(*P_GPFDAT,4);
                }


                if(GetBit(*P_GPFDAT,2)==0){
                        ClearBit(*P_GPFDAT,5);//LED1
                }else{
                        SetBit(*P_GPFDAT,5);
                }


                if(GetBit(*P_GPGDAT,3)==0){
                        ClearBit(*P_GPFDAT,6);//LED1
                }else{
                        SetBit(*P_GPFDAT,6);
                }
        }
}


这里首先将led的date寄存器默认值默认是低电平,一设置成输出灯立刻点亮。 
出现的现象就是灯一闪而过,然后可以正常控制了。

所以一开始吧data寄存器设置成高电平就好了。

下面是控制位的实现:

void setNbit(unsigned long *bits, int N, int start_bit, int value)
{
        int mask = 0, i = N;
        while (--i >= 0)
        {
                mask |= (0x1 << i);
        }
        *bits = *bits & (~(mask << start_bit)) | (value << start_bit);
}


void getNbit(unsigned long * bits, int N, int start_bit, int *value)
{
        int mask = 0, i = N;
        while (--i >= 0)
        {
                mask |= (0x1 << i);
        }
        *value = ( *bits >> start_bit) & mask;
}

#define GetBit(dat,i) (    (dat)&( 0x1<<(i)  )?1:0    )
#define SetBit(dat,i) (     (dat)|=( 0x1<<(i) )         )
#define ClearBit(dat,i) (   (dat)&=   ~(0x01<<(i))     )


STM32微控制器系列是由STMicroelectronics(简称ST公司)推出的高性能、低成本、低功耗的32位ARM Cortex-M核心MCU。其中,STM32芯片非常适合用于各种嵌入式应用,包括但不限于LED控制、传感器监测、电机驱动等。 在STM32微控制器上控制LED的操作通常涉及到以下几个步骤: ### 1. 硬件连接 首先需要将LED通过电路板上的GPIO (General-Purpose Input/Output) 引脚连接到STM32的数字输出端口。一般情况下,LED应该并联一个限流电阻到正电源(例如VCC),并串接在输出端口与地之间。 ### 2. 初始化GPIO配置 在STM32中,每个GPIO都有多种工作模式可以选择,比如输入、输出、中断等。对于控制LED而言,我们一般会选择输出模式。初始化GPIO需要设置以下内容: - **工作模式**:设置为推挽输出模式(Pull-up / Pull-down mode)。这允许直接控制LED的高电平和低电平状态。 - **速度**:设置适当的IO速度,确保能够快速改变输出状态而不会引起不必要的电流冲击。 - **内部上拉/下拉电阻**:可以设置为开路(Off)或者启用内置上拉/下拉电阻,以减少外部硬件的需求。 ```c GPIO_InitTypeDef GPIO_InitStructure; // 初始化GPIO GPIO_InitStructure.GPIO_Pin = LED_PIN; // 设置具体的GPIO引脚 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; // 设置工作频率(根据实际需求调整) GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; // 设置为通用输出模式 HAL_GPIO_Init(LED_PORT, &GPIO_InitStructure); // 配置GPIO ``` ### 3. 控制LED 一旦GPIO端口被正确配置,就可以通过改变对应的GPIO端口值来控制LED的状态了。当设置输出为高电平时,LED亮起;当设置为低电平时,LED熄灭。 ```c // 控制LED点亮或熄灭 void control_LED(bool is_on) { if(is_on) { HAL_GPIO_WritePin(LED_PORT, LED_PIN, GPIO_PIN_SET); } else { HAL_GPIO_WritePin(LED_PORT, LED_PIN, GPIO_PIN_RESET); } } ``` ### 相关问题: 1. 在STM32中如何判断LED是否正常工作? 2. STM32如何实现PWM控制LED亮度? 3. 如何利用STM32和按键控制LED开关状态? --- 请注意,在实际的项目实施中,务必考虑到电流限制和电压容限,合理设计电路以防短路或其他硬件损坏情况发生。同时,上述示例代码基于假设的GPIO端口号和配置,实际应用时需要将其替换为具体的硬件引脚信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值