#include <stdio.h>
#include "NUC1xx.h"
#include "DrvGPIO.h"
#include "DrvSYS.h"
#include "DrvTIMER.h"
#include "led.h"
int flag=0,flag1=0;
int k1,k2;
int L_num=0,R_num=0;
/*初始化*/
void Sys_Init()
{
UNLOCKREG();
SYSCLK->PWRCON.XTL12M_EN = 1;//设定12M外部晶振
DrvSYS_Delay(5000);//等待时钟就绪
DrvGPIO_Open(E_GPA,2,E_IO_OUTPUT);//LED端口设置为输出
DrvGPIO_Open(E_GPA,3,E_IO_OUTPUT);
DrvGPIO_Open(E_GPA,4,E_IO_OUTPUT);
DrvGPIO_Open(E_GPA,5,E_IO_OUTPUT);
DrvGPIO_Open(E_GPB,14,E_IO_INPUT);//按键接口设置为输入
DrvGPIO_Open(E_GPB,15,E_IO_INPUT);
DrvGPIO_Open(E_GPB,10,E_IO_OUTPUT);//蜂鸣器端口设置为输出
DrvGPIO_ClrBit(E_GPB,10);//关闭蜂鸣器
}
/***************************************************************
定时器1回调函数
用于按一定时间间隔扫描按键
如检测到有按键按下,则使能定时器2
***************************************************************/
void TMR1_Callback(void)
{
k1=DrvGPIO_GetBit(E_GPB,15);//取按键状态
k2=DrvGPIO_GetBit(E_GPB,14);
if(k1==0||k2==0) //有按键按下
{
DrvTIMER_DisableInt(E_TMR1);//禁止定时器1中断
DrvTIMER_EnableInt(E_TMR2);//使能定时器2中断
DrvTIMER_Start(E_TMR2);//启动定时器2
}
}
/***************************************************************
定时器2回调函数
用于延时一段时间进行按键消抖
如仍有按键按下,则使能定时器3;如没有,使能定时器1
***************************************************************/
void TMR2_Callback(void)
{
k1=DrvGPIO_GetBit(E_GPB,15);//取按键状态
k2=DrvGPIO_GetBit(E_GPB,14);
if(k1==0||k2==0) //仍有按键按下
{
DrvTIMER_DisableInt(E_TMR2);//禁止定时器2中断
DrvTIMER_EnableInt(E_TMR3);//使能定时器3中断
DrvTIMER_Start(E_TMR3);//启动定时器3
if(k1==0) flag1=1;
if(k2==0) flag1=2;
}
else
{
DrvTIMER_DisableInt(E_TMR2);//禁止定时器2中断
DrvTIMER_EnableInt(E_TMR1);//使能定时器3中断
DrvTIMER_Start(E_TMR1);//启动定时器3
}
}
/***************************************************************
定时器3回调函数
用于延时一段时间等待按键松开
***************************************************************/
void TMR3_Callback(void)
{
k1=DrvGPIO_GetBit(E_GPB,15);//取按键状态
k2=DrvGPIO_GetBit(E_GPB,14);
if(k1==1&k2==1) //按键松开
{
DrvTIMER_DisableInt(E_TMR3);//禁止定时器3中断
DrvGPIO_SetBit(E_GPB,10);//启动蜂鸣器
if(flag1==1)
{
flag=2;
R_num++;
flag1=0;
}
if(flag1==2)
{
flag=1;
L_num++;
flag1=0;
}
DrvTIMER_EnableInt(E_TMR1);//使能定时器1中断
DrvTIMER_Start(E_TMR1);//启动定时器1
}
}
/*定时器初始化*/
void Timer_Init()
{
DrvTIMER_Init();//定时器初始化函数
/*定时器0配置*/
// DrvSYS_SelectIPClockSource(E_SYS_TMR0_CLKSRC,0);//时钟源选择,0为外部晶振
// DrvTIMER_Open(E_TMR0,100,E_PERIODIC_MODE);//设定tick周期启动定时器,每秒100次,周期模式
// DrvTIMER_SetTimerEvent(E_TMR0,100,(TIMER_CALLBACK)TMR0_Callback,0);//设定定时器处理事件,每100tick周期执行一次
// DrvTIMER_EnableInt(E_TMR0);//使能定时器0中断
// DrvTIMER_Start(E_TMR0);//启动定时器0
/*定时器1配置*/
DrvSYS_SelectIPClockSource(E_SYS_TMR1_CLKSRC,0);//时钟源选择
DrvTIMER_Open(E_TMR1,1000,E_PERIODIC_MODE);//设定tick周期启动定时器,每秒1000次,周期模式
DrvTIMER_SetTimerEvent(E_TMR1,20,(TIMER_CALLBACK)TMR1_Callback,0);//设定定时器处理事件,每20tick周期执行一次
DrvTIMER_EnableInt(E_TMR1);//使能定时器1中断
DrvTIMER_Start(E_TMR1);//启动定时器1
/*定时器2配置*/
DrvSYS_SelectIPClockSource(E_SYS_TMR2_CLKSRC,0);//时钟源选择
DrvTIMER_Open(E_TMR2,1000,E_PERIODIC_MODE);//设定tick周期启动定时器,每秒1000次,周期模式
DrvTIMER_SetTimerEvent(E_TMR2,30,(TIMER_CALLBACK)TMR2_Callback,0);//设定定时器处理事件,每30tick周期执行一次
/*定时器3配置*/
DrvSYS_SelectIPClockSource(E_SYS_TMR3_CLKSRC,0);//时钟源选择
DrvTIMER_Open(E_TMR3,1000,E_PERIODIC_MODE);//设定tick周期启动定时器,每秒1000次,周期模式
DrvTIMER_SetTimerEvent(E_TMR3,50,(TIMER_CALLBACK)TMR3_Callback,0);//设定定时器处理事件,每50tick周期执行一次
}
main()
{
Sys_Init();
Timer_Init();
while(1)
{
if(flag==1)
{
DrvGPIO_ClrBit(E_GPB,10);
if(L_num>=10) L_num=0;
flag=0;
switch(L_num)
{
case 0:
led_allon();
break;
case 1:
led_one(1);
break;
case 2:
led_one(2);
break;
case 3:
led_one(3);
break;
case 4:
led_one(4);
break;
case 5:
led_l2r_one();
break;
case 6:
led_l2r_two();
break;
case 7:
led_l2r_three();
break;
case 8:
led_l2r_four();
break;
case 9:
led_all();
break;
default:break;
}
}
if(flag==2)
{
DrvGPIO_ClrBit(E_GPB,10);
if(R_num>=10) R_num=0;
flag=0;
switch(R_num)
{
case 0:
led_allon();
break;
case 1:
led_one(4);
break;
case 2:
led_one(3);
break;
case 3:
led_one(2);
break;
case 4:
led_one(1);
break;
case 5:
led_r2l_one();
break;
case 6:
led_r2l_two();
break;
case 7:
led_r2l_three();
break;
case 8:
led_r2l_four();
break;
case 9:
led_all();
break;
default:break;
}
}
}
}