📄 main.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 + -