⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 IAR EWARM嵌入式系统编程与实践光盘源码
💻 C
字号:
#include "includes.h"
#define MIN_CHANGE 5  // 定义驱动鼠标指针的最小电压变化量

unsigned int AdcHold;

/*************************************************************************
 * 说明:IRQ 中断句柄
 * 参数:无
 * 返回值:无
 *************************************************************************/
#pragma vector=0x18
__irq __arm void IRQ_ISR_Handler (void) {
void (*interrupt_function)();
unsigned int vector;
  vector = VICVectAddr;     // 获得中断向量
  interrupt_function = (void(*)())vector;
  (*interrupt_function)();  // 调用向量中断函数
}

/*************************************************************************
 * 说明:FIQ 中断句柄
 * 参数:无
 * 返回值:无
 *************************************************************************/
#pragma vector=0x1c
__fiq __arm void FIQ_ISR_Handler (void) {
void (*interrupt_function)();
unsigned int vector;
  vector = VICVectAddr;     // 获得中断向量
  interrupt_function = (void(*)())vector;
  (*interrupt_function)();  // 用向量中断函数
}

/*************************************************************************
 * 说明:非向量中断函数
 * 参数:无
 * 返回值:无
 *************************************************************************/
void NonVectISR(void) {
}

/*************************************************************************
 * 说明:清除标志函数
 * 参数: void* arg
 * 返回值:无
*************************************************************************/
void ClearFlag (void* arg) {
int * pFlag = (int *)arg;
  *pFlag = 0;
}

/*************************************************************************
 * 说明:100us延时函数
 * 参数:void *arg
 * 返回值:无
*************************************************************************/
void Dly100us(void *arg) {
int Flag = 1;
int Delay = (int)arg;
  TIMER_Stop(TIMER1);     // 停止 Timer 1
  TIMER_Reset(TIMER1);    // 复位 Timer 1
  // 设置CH0匹配工作方式
  TIMER_SetMatchAction(TIMER1, CH0, TimerAction_Interrupt | TimerAction_StopTimer,
  Delay usec_T1*100, ClearFlag, (void *)&Flag, DONOTHING);
  TIMER_Start(TIMER1);    // 启动 Timer 1
  while(Flag);            // 等待
}

/*************************************************************************
 * 说明:硬件系统初始化函数
 * 参数:无
 * 返回值:int
 *************************************************************************/
int SysInit(void) {
  // 系统初始化
#ifdef FLASH
  if (SYS_Init(FOSC, FCCLK, VPBDIV1, USER_FLASH, 0xB27E7FFF,0x80FFFFFF,0xFFFFFFFF,0))
    return 1;
#else
  if (SYS_Init(FOSC, FCCLK, VPBDIV1, USER_RAM,   0xB27E7FFF,0x80FFFFFF,0xFFFFFFFF,0))
    return 1;
#endif

  // Timer0 初始化
  if (TIMER_Init(TIMER0, TIMER_PRECISION))
    return 1;

  // VIC 初始化
  VIC_Init();
  VIC_SetProtectionMode(UserandPrivilegedMode);

  // USB 初始化
  if (USB_Init(VIC_Slot0,HID_CallBack,USB_NotFast))
    return 1;

  // Timer0 中断
  VIC_SetVectoredIRQ(TIMER0_ISR,VIC_Slot1,VIC_TIMER0);
  VIC_EnableInt(1<<VIC_TIMER0);

  // Timer1 中断
  VIC_SetVectoredIRQ(TIMER1_ISR,VIC_Slot2,VIC_TIMER1);
  VIC_EnableInt(1<<VIC_TIMER1);

  // 允许非向量中断
  VIC_DisableNonVectoredIRQ();

  return 0;
}

/*************************************************************************
 * 说明: 启动用户功能函数
 * 参数:无
 * 返回值:无
*************************************************************************/
void UserStart(void) {
  ButtonsInit();             // 按键初始化
  ADC_Init();                // ADC 接口初始化
  AdcHold = ADC_Measure();   // 获得当前通道3的A/D转换结果

  /* 系统时间初始化 */
  TIMER_SetMatchAction(TIMER0, CH0, TimerAction_Interrupt | TimerAction_ResetTimer,
  1sec_T0/TICK_PER_SECOND, SetSysTickFlag, (void *)&TickSysFlag, DONOTHING);
  TIMER_Start(TIMER0);

  HID_Init();  // HID 初始化
}

/*************************************************************************
 * 说明:主函数
 * 参数:无
 * 返回值: int
 *************************************************************************/
int main (void) {
LPC_INT8U X_Temp;
LPC_INT16U AdcCurr;
LPC_INT16S Y_Temp = 0;
signed char X = 0, Y = 0;

  if(SysInit() == 0)   {
    __enable_interrupt();   //启动用户程序
    UserStart();
  }
  while(1) {                // 主循环

    if(TickSysFlag) {
      TickSysFlag = 0;

      AdcCurr = ADC_Measure();       // 测量当前电压值
      if (abs((LPC_INT16S)(AdcCurr - AdcHold)) > MIN_CHANGE) {
        Y_Temp += AdcHold - AdcCurr; // 计算上次与当前测量值之差
        AdcHold = AdcCurr;
      }

      X_Temp = GetButtonsEvent();   // 获得按键信息
      if (X_Temp) {
        if (X_Temp&BUTT_EVENT_1) {  // 按键1压下,左移鼠标指针
           X = -10;
        }
        if (X_Temp&BUTT_EVENT_2) {  // 按键2压下,右移鼠标指针
          X = 10;
        }
      }
    }

    if(Y_Temp > 0) {                // 避免溢出
      if(Y_Temp > SCHAR_MAX) {
        Y = SCHAR_MAX;
        Y_Temp -= SCHAR_MAX;
      }
      else {
        Y = Y_Temp;
        Y_Temp = 0;
      }
    }
    else if (Y_Temp < 0) {
      if(Y_Temp < SCHAR_MIN) {
        Y = SCHAR_MIN;
        Y_Temp += SCHAR_MIN;
      }
      else {
        Y = Y_Temp;
        Y_Temp = 0;
      }
    }

    if(Y || X) {                    // 发送新偏移值
      if(HID_GetConfiguration()) {
        HID_SendReport(0,X,Y);
      }
      Y = X = 0;
    }
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -