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

📄 main.c

📁 基于LPC2300平台的简易USB HID例程
💻 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 + -