📄 main.c
字号:
/****************************************Copyright (c)**************************************************
** Guangzou ZLG-MCU Development Co.,LTD.
** graduate school
** http://www.zlgmcu.com
**
**--------------File Info-------------------------------------------------------------------------------
** File name: main.c
** Last modified Date: 2004-09-16
** Last Version: 1.0
** Descriptions: The main() function example template
**
**------------------------------------------------------------------------------------------------------
** Created by: Chenmingji
** Created date: 2004-09-16
** Version: 1.0
** Descriptions: The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Descriptions:
** 说明:
**
********************************************************************************************************/
#include "config.h" // 包含工程模板配制头文件
#include "USBConfig.h" // 加入USB配置头文件
#include "USBCI.h" // 加入USB命令接口层头文件
#include "USBDriver.h" // 加入USB应用层头文件
#define USB_INT 22 // 宏定义UDC的VIC通道号
/*********************************************************************************************************
** 函数名称 :DelayNS()
** 函数功能 :长软件延时
** 入口参数 :dly 延时参数,值越大,延时越久
** 出口参数 :无
*********************************************************************************************************/
void DelayNS (uint32 dly)
{
uint32 i;
for ( ; dly>0; dly--)
for (i=0; i<5000; i++);
}
/*********************************************************************************************************
;** Function name: SetISR
;**
;** Descriptions: Set ISR function for VIC
;**
;** input parameters: no : VIC Channel
;** pri : VIC PRI
;** isr_func : VIC ISR function
;** Returned value: None
----------------------------------------------------------------------------------
;********************************************************************************************************/
uint8 SetISR(uint32 no, uint32 pri, uint32 isr_func)
{
if(no > 31) return 0;
if(pri > 15) return 0;
*(volatile uint32*)((&VICVectAddr0)+no) = isr_func; // 设置中断服务函数
*(volatile uint32*)((&VICVectPri0)+no)= pri & 0x0F; // 设置中断优先级
VICIntSelect &= ~(1<<no); // 选择IRQ中断
VICIntEnable = 1<<no; // 使能相关中断
return 1; // 设置成功
}
/*******************************************************************************************************
** 函数名称 :ADC_Init()
** 函数功能 :初始化ADC,使用AD0.5通道
*******************************************************************************************************/
void ADC_Init(void)
{
PCONP |= (1 << 12); // 首先设置外设功率控制寄存器,打开ADC外设
PINSEL3 = (PINSEL3 & (~((unsigned)0x03 << 30)))|((unsigned)0x03 << 30 );// P1.31连接到AD0.5
/* 进行ADC模块设置 */
AD0CR = (0x01 << 5) | // 选择通道5
((Fpclk / 1000000 - 1) << 8) | // CLKDIV=Fpclk/1000000-1,转换时钟为1MHz
(0 << 16) | // BURST=0,软件控制转换操作
(0 << 17) | // CLKS=0, 使用11clock转换
(1 << 21) | // PDN=1,正常工作模式
(0 << 22) | // TEST1:0=00,正常工作模式
(0 << 24) | // START=1,直接启动ADC转换
(0 << 27); // 直接启动ADC转换时,此位无效
//DelayNS(10);
//ADC_Data = ADDR5; // 读取ADC结果,并清除DONE标志位
}
/*******************************************************************************************************
** 函数名称 :ADC_Read()
** 函数功能 :获取ADC转换结果
*******************************************************************************************************/
INT32U Get_ADCValue_X(void)
{
INT32U ADC_Data;
INT32U i,adsum = 0;
AD0CR=(AD0CR& (~0xff))|(0x01<<5); // 选择AD0.5
for (i = 0; i < 512; i++) // AD转换512次
{
AD0CR |= 1 << 24; // 启动转换
while((AD0STAT&(1<<5))==0); // 等待转换结束
AD0CR |= 1 << 24; // 再次启动转换
while((AD0STAT&(1<<5))==0); // 等待转换结束
ADC_Data = ADDR5; // 读取AD通道5的转换结果
ADC_Data = (ADC_Data >> 6) & 0x3ff; // 获取10位AD转换值
ADC_Data = ADC_Data * 2500; // 满额电压
ADC_Data = ADC_Data / 1024; // 10位AD转换,1024级
adsum += ADC_Data; // 累加ADC结果
}
adsum = adsum >> 9; // 计算平均值
return adsum; // 返回AD结果
}
/***************************************************************************************
** Name: Get_ADCValue_Y()
** Function: Get AD0.5 conversion result
****************************************************************************************/
INT32U Get_ADCValue_Y(void)
{
return Get_ADCValue_X(); /* return result */
}
/**********************************************************************************************************
** 函数名称 :main()
** 函数功能 :用P1.27控制BEEP,让BEEP鸣叫。
** 调试说明 :需将跳线JP21短接。
**********************************************************************************************************/
/* 全局变量 */
INT8U Last_X=0,Cur_X=0; // X轴的上一次与当前的位置值
INT8U Last_Y=0,Cur_Y=0; // Y轴的上一次与当前的位置值
int main (void)
{
INT8U err;
err = USB_Initialize(); // 初始化USB设备控制器
if (err != 0) // 若初始化失败
while(1); // 程序进入死循环
SetISR(USB_INT,3,(uint32)Usb_Exception); // 设置USB中断ISR及优先级
IRQEnable(); // 允许CPU的IRQ中断
ADC_Init(); // 初始化LPC214x ADC转换器
Last_X= Get_ADCValue_X(); // 取得ADC的值
Last_Y = Get_ADCValue_Y();
/****************** 主函数是一个无限循环结构 **************/
while(1)
{
usbserve(); // 处理USB事件,如USB控制传输,USB总线复位等等
if (bEPPflags.bits.configuration == 1) // 若USB设备控制器配置完毕
{
if(bEPPflags.bits.hid_enumed == 1) // 若HID类设备枚举成功
{
DISABLE();
Cur_X = Get_ADCValue_X(); // 取得ADC0.5的转换值
Cur_Y = Get_ADCValue_Y(); // 取得ADC0.5的转换值
GenEpBuf[0] = 0x00;
GenEpBuf[1] = Cur_X-Last_X; // X: 发送ADC0.5变化值作为鼠标移动值
GenEpBuf[2] = Cur_Y-Last_Y; // Y: 发送ADC0.5变化值作为鼠标移动值
GenEpBuf[3] = 0x00;
USB_WriteEndpoint(3,4,GenEpBuf); // 通过逻辑端点1的IN端点发送鼠标移动值到USB主机
ENABLE();
Last_X=Cur_X; // 保存 X Y 的当前位置值
Last_Y=Cur_Y;
}
}
}
return 0;
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -