#include "systemInit.h"
#include "lm3s1138.h"
#include "direct.h"
#include "LED.H"
#include "LCD.H"
#include "KEY.H"
#include <hw_types.h>
#include <hw_memmap.h>
#include <hw_ints.h>
#include <hw_sysctl.h>
#include <hw_gpio.h>
#include <hw_timer.h>
#include <interrupt.h>
#include <sysctl.h>
#include <gpio.h>
#include <timer.h>
#include "LM3S1138_PinMap.H"
/* 将较长的标识符定义成较短的形式 */
#define SysCtlPeriEnable SysCtlPeripheralEnable
#define SysCtlPeriDisable SysCtlPeripheralDisable
#define GPIOPinTypeIn GPIOPinTypeGPIOInput
#define GPIOPinTypeOut GPIOPinTypeGPIOOutput
// 定义LED控制信号
#define LED_PERIPH SYSCTL_PERIPH_GPIOA
#define LED_PORT GPIO_PORTA_BASE
#define LED_PIN 0x7f
/* 定义按键 */
#define KEY_PORT SYSCTL_PERIPH_GPIOG
#define KEY_PIN GPIO_PORTG_BASE , GPIO_PIN_5
#define keyGet() GPIOPinRead(KEY_PIN)
// 定义全局的系统时钟变量
unsigned long TheSysClock = 12000000UL;
unsigned int iii=0,jjj=0;//码盘信号个数
unsigned char zdgs=0;//定时器中断标志
unsigned char a,b,c;//三个红外接收信号
unsigned char key_num=0;//按键个数
unsigned char change=0;//按键改变标志
unsigned int shi,ge;
unsigned int ge1,shi1,bai1,qian1,wan1;
unsigned int Speed;
unsigned int distance=0;
unsigned int dis0=0,dis1=0;
// GPIOF中断初始化
void GPIOF_IntInit(void)
{
SysCtlPeriEnable(SYSCTL_PERIPH_GPIOF); // 使能GPIOF端口
GPIOPinTypeIn(GPIO_PORTF_BASE , GPIO_PIN_4); // 设置PF4管脚为输入
GPIOIntTypeSet(GPIO_PORTF_BASE , // 设置PF4的中断类型
GPIO_PIN_4 ,
GPIO_RISING_EDGE);
GPIOPinIntEnable(GPIO_PORTF_BASE , GPIO_PIN_4); // 使能PF4管脚中断
GPIOPinTypeIn(GPIO_PORTF_BASE , GPIO_PIN_5); // 设置PF5管脚为输入
GPIOIntTypeSet(GPIO_PORTF_BASE , // 设置PF5的中断类型
GPIO_PIN_5 ,
GPIO_RISING_EDGE);
GPIOPinIntEnable(GPIO_PORTF_BASE , GPIO_PIN_5); // 使能PF5管脚中断
IntPrioritySet(INT_GPIOF , 2 << 5); // 设置GPIOF中断优先级为1
IntEnable(INT_GPIOF); // 使能GPIOF端口中断
}
// GPIOD中断初始化
void GPIOD_IntInit(void)
{
SysCtlPeriEnable(SYSCTL_PERIPH_GPIOD); // 使能GPIOD端口
GPIOPinTypeIn(GPIO_PORTD_BASE , GPIO_PIN_1); // 设置PD1管脚为输入
GPIOIntTypeSet(GPIO_PORTD_BASE , // 设置PD1的中断类型
GPIO_PIN_1 ,
GPIO_RISING_EDGE);
GPIOPinIntEnable(GPIO_PORTD_BASE , GPIO_PIN_1); // 使能PD1管脚中断
IntPrioritySet(INT_GPIOD , 0 << 5); // 设置GPIOF中断优先级为1
IntEnable(INT_GPIOD); // 使能GPIOD端口中断
}
// GPIOF的中断服务函数
void GPIO_Port_F_ISR(void)
{
unsigned long ulStatus;
ulStatus = GPIOPinIntStatus(GPIO_PORTF_BASE , true); // 读取中断状态
GPIOPinIntClear(GPIO_PORTF_BASE , ulStatus); // 清除中断状态,重要
if ( ulStatus & GPIO_PIN_4 ) // 如果PF4的中断状态有效
{
iii++;
}
if ( ulStatus & GPIO_PIN_5 ) // 如果PG5的中断状态有效
{
jjj++;
}
}
//GPIOD的中断程序
void GPIO_Port_D_ISR(void)
{
unsigned long ulStatus;
ulStatus = GPIOPinIntStatus(GPIO_PORTD_BASE , true); // 读取中断状态
GPIOPinIntClear(GPIO_PORTD_BASE , ulStatus); // 清除中断状态,重要
if ( ulStatus & GPIO_PIN_1 )
{
key_num++;
if(key_num>3)
{
key_num=0;
}
change=1;
}
}
//定时器中断初始化,程序跑
void Timer0A_IntInit(void)
{
SysCtlPeriEnable(SYSCTL_PERIPH_TIMER0); // 使能定时器模块
TimerConfigure(TIMER0_BASE , TIMER_CFG_32_BIT_PER); // 配置定时器为32位周期定时器
TimerLoadSet(TIMER0_BASE , TIMER_A , 30000000UL); // 设置定时器初值
IntPrioritySet(INT_TIMER0A , 1 << 5);
TimerIntEnable(TIMER0_BASE , TIMER_TIMA_TIMEOUT); // 使能定时器超时中断
IntEnable(INT_TIMER0A); // 使能定时器中断
IntMasterEnable(); // 使能处理器中断
TimerEnable(TIMER0_BASE , TIMER_A); // 使能定时器计数
}
//定时器中断初始化,速度用
void Timer1A_IntInit(void)
{
SysCtlPeriEnable(SYSCTL_PERIPH_TIMER1); // 使能定时器模块
TimerConfigure(TIMER1_BASE , TIMER_CFG_32_BIT_PER); // 配置定时器为32位周期定时器
TimerLoadSet(TIMER1_BASE , TIMER_A , 3000000UL); // 设置定时器初值0.5S
IntPrioritySet(INT_TIMER1A , 3 << 5);
TimerIntEnable(TIMER1_BASE , TIMER_TIMA_TIMEOUT); // 使能定时器超时中断
IntEnable(INT_TIMER1A); // 使能定时器中断
IntMasterEnable(); // 使能处理器中断
TimerEnable(TIMER1_BASE , TIMER_A); // 使能定时器计数
}
// 定时器的中断服务函数,固定编程运行
void Timer0A_ISR(void)
{
unsigned long ulStatus;
ulStatus = TimerIntStatus(TIMER0_BASE , true); // 读取中断状态
TimerIntClear(TIMER0_BASE , ulStatus); // 清除中断状态,重要!
if ( ulStatus & TIMER_TIMA_TIMEOUT ) // 如果是定时器超时中断
{ LED_Toggle(LED1); // 反转LED显示
zdgs++;
if(zdgs>1)
{
zdgs=0;
}
}
}
// 定时器的中断服务函数,速度
void Timer1A_ISR(void)
{
unsigned long ulStatus;
ulStatus = TimerIntStatus(TIMER1_BASE , true); // 读取中断状态
TimerIntClear(TIMER1_BASE , ulStatus); // 清除中断状态,重要!
if ( ulStatus & TIMER_TIMA_TIMEOUT ) // 如果是定时器超时中断
{
LCD_write_english_string(0,3,"Speed:");
dis1=13*(iii+jjj)/100;
distance=dis1-dis0;
Speed=distance*2;
bai=Speed/100;
shi=(Speed/10)%10;
ge=Speed%10;
LCD_Write_Num(bai);
LCD_Write_Num(shi);
LCD_Write_Num(ge);
LCD_write_english_string(0,2,"Dist:");
wan1=dis1/10000;
qian1=(dis1/1000)%10;
bai1=(dis1/100)%10;
shi1=(dis1/10)%10;
ge1=dis1%10;
LCD_Write_Num(wan1);
LCD_Write_Num(qian1);
LCD_Write_Num(bai1);
LCD_Write_Num(shi1);
LCD_Write_Num(ge1);
dis0=dis1;
}
}
// 系统初始化
void SystemInit(void)
{
SysCtlLDOSet(SYSCTL_LDO_2_50V); // 设置LDO输出电压
SysCtlClockSet(SYSCTL_USE_OSC | // 系统时钟设置,采用主振荡器
SYSCTL_OSC_MAIN |
SYSCTL_XTAL_6MHZ |
SYSCTL_SYSDIV_1);
/*
SysCtlLDOSet(SYSCTL_LDO_2_75V); // 配置PLL前须将LDO电压设置为2.75V
SysCtlClockSet(SYSCTL_USE_PLL | // 系统时钟设置,采用PLL
SYSCTL_OSC_MAIN | // 主振荡器
SYSCTL_XTAL_6MHZ | // 外接6MHz晶振
SYSCTL_SYSDIV_10); // 分频结果为20MHz
*/
SysCtlPeriEnable(LCD_PERIPH); // 使能GPIO B口LCD控制接口
GPIOPinTypeOut(LCD_PORT , LCD_RST); // 设置CS,CLK,DIO为输出
GPIOPinTypeOut(LCD_PORT , LCD_CE);
GPIOPinTypeOut(LCD_PORT , LCD_DC);
GPIOPinTypeOut(LCD_PORT , LCD_SCLK);
G