TiveC微控制器基础练习1.4源码

本实验源码为参考代码,可以在EK-TM4C123GXL上进行验证。

演示代码并非最优代码,是从易于理解的角度出发,争取做到最好理解的代码。

//*****************************************************************************
// 基础练习1.4: 按键控制LED灯闪烁
//
// 过程描述:
//  1. 从硬件电路中可知,按键未按下时,读取引脚的值是高电平;按键按下时,接地,读取引脚的值是低电平;
//     按键相关的引脚设置为GPIO,输入. 采用轮询的方式读取按键(非中断的方式).
//  2. 把引脚配置成GPIO,输出。 通过输出高电平和低电平来控制LED的亮和灭。
//  3. 读取到低电平时,说明用户按键了,改变数组的下标,进而改变LED的延时时间,改变闪烁的快和慢.
//  4. K1->闪烁加快, K2->闪烁减慢
//
// 硬件描述:
//    LED2(蓝色) --PF0
//    LED3(绿色) --PA4  --使用
//    LED4(红色) --PD6
//    K1 -- PD7   --使用
//    K2 -- PF4 --使用
//    K3 -- PA3 
//    K4 -- PA2 
//
// 注意事项:
// 引脚PF0和PD7比较特殊,默认是保护的。要重新编程操作的话,需要先解锁
// 小技巧:
//  通过SysConfig工具进行引脚的初始配置,就不用考虑这些因素了.
//  SysConfig的使用可参考链接: https://www.bilibili.com/read/cv6258251
//
//
// 思考:
//  1. 仔细体会下按键的相应速度,多按几下,是不是每次都有响应?
//     当LED灯闪烁很慢的时候,有时候按键是没有响应的,因为代码这个时候还没执行到按键扫描的部分。
//     怎么改进呢? 按键可以考虑用中断的方式。
//
//*****************************************************************************

#include <stdbool.h>
#include <stdint.h>
#include "inc/hw_gpio.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/gpio.h"
#include "driverlib/sysctl.h"

//对于LED的延时时间,可以通过实验,获取8个不同亮度的延时系数.
//注意,为了降低难度,数组的下标0对应的数字暂时不用,下标index从1-8.
uint32_t const delay_tab[]={0,50000,100000,150000,200000,300000,400000,500000,800000};

void main(void)
{
    uint32_t ui32_delay;
    uint32_t ui32_delay_config;
    uint8_t index;

    //-----------外设使能-------------
    //使能PA外设的时钟,并等待Ready
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
    while(!SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOA))
    {
    }

    //使能PD外设的时钟,并等待Ready
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
    while(!SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOD))
    {
    }

    //使能PF外设的时钟,并等待Ready
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
    while(!SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOF))
    {
    }

    //-----------引脚配置-------------

    //PA4->绿色LED,将PA4配置成GPIO,输出
    GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE, GPIO_PIN_4);

    //PD6->红色LED,将PD6配置成GPIO,输出
    GPIOPinTypeGPIOOutput(GPIO_PORTD_BASE, GPIO_PIN_6);

    //PF0->蓝色LED,将PF0配置成GPIO,输出
    HWREG(GPIO_PORTF_BASE+GPIO_O_LOCK) = GPIO_LOCK_KEY;
    HWREG(GPIO_PORTF_BASE+GPIO_O_CR)   |= GPIO_PIN_0;
    HWREG(GPIO_PORTF_BASE+GPIO_O_LOCK) = 0x0;
    GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_0);

    //PD7->K1,将PD7配置成GPIO,输入
    HWREG(GPIO_PORTD_BASE+GPIO_O_LOCK) = GPIO_LOCK_KEY;
    HWREG(GPIO_PORTD_BASE+GPIO_O_CR)   |= GPIO_PIN_7;
    HWREG(GPIO_PORTD_BASE+GPIO_O_LOCK) = 0x0;
    GPIOPinTypeGPIOInput(GPIO_PORTD_BASE, GPIO_PIN_7);

    //PF4->K2,将PF4配置成GPIO,输入
    GPIOPinTypeGPIOInput(GPIO_PORTF_BASE, GPIO_PIN_4);

//    //PA3->K3,将PA3配置成GPIO,输入
//    GPIOPinTypeGPIOInput(GPIO_PORTA_BASE, GPIO_PIN_3);
//
//    //PA2->K4,将PA2配置成GPIO,输入
//    GPIOPinTypeGPIOInput(GPIO_PORTA_BASE, GPIO_PIN_2);


    //-----------LED状态初始化-------------

    //PA4输出高电平,绿色LED灭
    GPIOPinWrite(GPIO_PORTA_BASE,GPIO_PIN_4,0xFF);
    //PD6输出高电平,红色LED灭
    GPIOPinWrite(GPIO_PORTD_BASE,GPIO_PIN_6,0xFF);
    //PF0输出高电平,蓝色LED灭
    GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_0,0xFF);


    index = 5;
    ui32_delay_config =delay_tab[index];

    //按键动作的电平示意图:
    //(1) 用户没有动作时,高电平; 用户按下时, 低电平
    //
    //    +-----+     +------+
    // 按下| 松开  | 按下   |      |
    // ---+     +-----+      +---------
    //

    while(1)
    {
        //采用轮询的方式读取引脚的输入值

        //PD7->K1
        //判断第一个按键,引脚电平是否为低电平,为低表示按键按下
        if(0 == GPIOPinRead(GPIO_PORTD_BASE,GPIO_PIN_7))
        {
            //每次按键按下,数组下标左移一位,时间变短,闪烁变快
            index --;
            if(0 == index) index = 8;

            ui32_delay_config =delay_tab[index];

            //等待按键释放, 不然执行完大循环 之后又会再次进入
            while(0 == GPIOPinRead(GPIO_PORTD_BASE,GPIO_PIN_7));
        }

        //PF4->K2
        //判断第一个按键,引脚电平是否为低电平,为低表示按键按下
        if(0 == GPIOPinRead(GPIO_PORTF_BASE,GPIO_PIN_4))
        {
            //每次按键按下,数组下标右移一位,时间变长,闪烁变慢
            index ++;
            if(9 == index) index = 1;

            ui32_delay_config =delay_tab[index];

            //等待按键释放, 不然执行完大循环 之后又会再次进入
            while(0 == GPIOPinRead(GPIO_PORTF_BASE,GPIO_PIN_4));
        }

        //-----以下实现LED的闪烁效果

        //输出低电平,LED亮
        GPIOPinWrite(GPIO_PORTA_BASE,GPIO_PIN_4,0x00);
        //延时,延时的时间系数可以通过按键改变
        for(ui32_delay=0;ui32_delay<ui32_delay_config;ui32_delay++);

        //输出高电平,LED灭
        GPIOPinWrite(GPIO_PORTA_BASE,GPIO_PIN_4,0xFF);
        for(ui32_delay=0;ui32_delay< ui32_delay_config;ui32_delay++);


    }

}


 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HappyShengxiang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值