找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1795|回复: 0
打印 上一主题 下一主题
收起左侧

单片机口袋实验板中断控制程序

[复制链接]
跳转到指定楼层
楼主
ID:306209 发表于 2018-4-11 21:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//*****************************************************************************
// 本程序控制口袋实验板上的3个LED指示灯,移位闪烁点亮,K2、K3、K4为中断按键,分别控制红灯、蓝灯、绿灯的翻转
// 蓝色LED(D2)--PF0 绿色LED(D3)-PA4 红色LED(D4)-PD6
//*****************************************************************************
#include <stdint.h>
#include <stdbool.h>
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"//一些位带操作的宏定义
#include "inc/hw_gpio.h"// hw_gpio.h - Defines and Macros for GPIO hardware.
#include "driverlib/sysctl.h"//系统时钟
#include "driverlib/gpio.h"//gpio 定义
#include "driverlib/gpio.c"//gpio 定义
#include "driverlib/interrupt.c"//gpio 定义
#include "driverlib/interrupt.h"
#include <math.h>
#include "inc/hw_ints.h"
#include "inc/hw_nvic.h"


void GPIO_PORTA_ISR(void)//中断处理子函数
{
    unsigned char ucVal;
    unsigned long ulStatus;//中断状态标识
        
    ulStatus = GPIOIntStatus(GPIO_PORTA_BASE, true); // 读取中断状态
    GPIOIntClear(GPIO_PORTA_BASE, ulStatus); // 清除中断状态,重要
        
    switch (ulStatus ) // 如果KEY的中断状态有效
    {
             case 0x04:
                      ucVal = GPIOPinRead(GPIO_PORTF_BASE, GPIO_PIN_0); // 翻转LED(蓝)
          GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_0, ~ucVal);
          SysCtlDelay(10000000); // 延时约10ms,消除按键抖动
          while (GPIOPinRead(GPIO_PORTA_BASE, GPIO_PIN_2) == 0x00); // 等待KEY抬起
          SysCtlDelay(10000000); // 延时约10ms,消除松键抖动
                            break;
                         case 0x08:
                                 ucVal = GPIOPinRead(GPIO_PORTA_BASE, GPIO_PIN_4); // 翻转LED(绿)
          GPIOPinWrite(GPIO_PORTA_BASE,GPIO_PIN_4, ~ucVal);
          SysCtlDelay(10000000); // 延时约10ms,消除按键抖动
          while (GPIOPinRead(GPIO_PORTA_BASE, GPIO_PIN_3) == 0x00); // 等待KEY抬起
          SysCtlDelay(10000000); // 延时约10ms,消除松键抖动
                         break;

                        
                                 
    }
}



void GPIO_PORTF_ISR(void)//中断处理子函数
{
    unsigned char ucVal;
    unsigned long ulStatus;//中断状态标识
        
    ulStatus = GPIOIntStatus(GPIO_PORTF_BASE, true); // 读取中断状态
    GPIOIntClear(GPIO_PORTF_BASE, ulStatus); // 清除中断状态,重要
        
    switch (ulStatus ) // 如果KEY的中断状态有效
    {
             case 0x10:
                      ucVal = GPIOPinRead(GPIO_PORTD_BASE, GPIO_PIN_6); // 翻转LED(红)
          GPIOPinWrite(GPIO_PORTD_BASE,GPIO_PIN_6, ~ucVal);
          SysCtlDelay(10000000); // 延时约10ms,消除按键抖动
          while (GPIOPinRead(GPIO_PORTF_BASE, GPIO_PIN_4) == 0x00); // 等待KEY抬起
          SysCtlDelay(10000000); // 延时约10ms,消除松键抖动
                            break;
                        
                                 
    }
}


//*****************************************************************************
// main 函数,每个工程项目内有且只有1个
//*****************************************************************************
int main(void)
{


        //设置系统时钟为50MHz
    SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN |
                       SYSCTL_XTAL_16MHZ);
    // 端口GPIO F使能
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);          // 使能 GPIO F模块
          HWREG(GPIO_PORTF_BASE + GPIO_O_LOCK) = GPIO_LOCK_KEY; // 开锁 PORT F
    HWREG(GPIO_PORTF_BASE + GPIO_O_CR) |= GPIO_PIN_0;     // 解锁 F0 引脚
    HWREG(GPIO_PORTF_BASE + GPIO_O_LOCK) = 0;             // 重新上锁
        
        
          SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);   //使能GPIO A模块
          SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);  //使能GPIO D模块
    GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_0); // PF0设置为输出
          GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE, GPIO_PIN_4); // PA4设置为输出
          GPIOPinTypeGPIOOutput(GPIO_PORTD_BASE, GPIO_PIN_6); // PD6设置为输出
        
        
        //初始化三个灯的状态
         GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_0,1<<0);//蓝灯灭
        SysCtlDelay(10000000);
          GPIOPinWrite(GPIO_PORTD_BASE,GPIO_PIN_4,1<<4);//绿灯灭
                SysCtlDelay(10000000);
          GPIOPinWrite(GPIO_PORTA_BASE,GPIO_PIN_6,1<<6);//红灯灭
                SysCtlDelay(10000000);

        
          GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_0,0<<0);//蓝灯亮
          SysCtlDelay(10000000);
    GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_0,1<<0);  // 蓝灯灭
    SysCtlDelay(10000000);
                GPIOPinWrite(GPIO_PORTA_BASE,GPIO_PIN_4,0<<4); //绿灯亮
          SysCtlDelay(10000000);
    GPIOPinWrite(GPIO_PORTA_BASE,GPIO_PIN_4,1<<4);  // 口袋板绿灯灭
    SysCtlDelay(10000000);
          GPIOPinWrite(GPIO_PORTD_BASE,GPIO_PIN_6,0<<6);  //口袋板红灯亮
          SysCtlDelay(10000000);
    GPIOPinWrite(GPIO_PORTD_BASE,GPIO_PIN_6,1<<6);  //口袋板红灯灭
               
               
               
               
               
          //中断初始化
          GPIOPinTypeGPIOInput(GPIO_PORTA_BASE, GPIO_PIN_2); // PA2(K4)设置为输入
                GPIOPinTypeGPIOInput(GPIO_PORTA_BASE, GPIO_PIN_3); // PA3(K3)设置为输入
                GPIOPinTypeGPIOInput(GPIO_PORTF_BASE, GPIO_PIN_4); // PF4(K2)设置为输入
          GPIOIntTypeSet(GPIO_PORTA_BASE, GPIO_PIN_2, GPIO_LOW_LEVEL);//设置GPIOPA2中断
                GPIOIntTypeSet(GPIO_PORTA_BASE, GPIO_PIN_3, GPIO_LOW_LEVEL);//设置GPIOPA3中断
                GPIOIntTypeSet(GPIO_PORTF_BASE, GPIO_PIN_4, GPIO_LOW_LEVEL);//设置GPIOPF4中断
                GPIOIntEnable(GPIO_PORTA_BASE, GPIO_PIN_2); // 使能KEY所在管脚的中断
    GPIOIntEnable(GPIO_PORTA_BASE, GPIO_PIN_3);
                GPIOIntEnable(GPIO_PORTF_BASE, GPIO_PIN_4);
          IntEnable(INT_GPIOA);// 使能GPIOF端口总中断
                IntEnable(INT_GPIOF);
          IntMasterEnable(); // 使能处理器总中断
           
    while(1)    // 等待按键中断
    {
        }
}
// end of main


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表