//*****************************************************************************
// 本程序控制口袋实验板上的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
|