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

📄 main.c

📁 周立功 214x pack 配套光盘
💻 C
字号:
/****************************************Copyright (c)**************************************************
**                               Guangzou ZLG-MCU Development Co.,LTD.
**                                      graduate school
**                                 http://www.zlgmcu.com
**
**--------------File Info-------------------------------------------------------------------------------
** File name:			main.c
** Last modified Date:  2005-08-06
** Last Version:		1.0
** Descriptions:		LPC214x HID 类例子
**
**------------------------------------------------------------------------------------------------------
** Created by:			郑明远
** Created date:		2005-08-06
** Version:				1.0
** Descriptions:		The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Descriptions:
**
********************************************************************************************************/

#include "config.h"
#include "USBConfig.h"										/* 加入USB相关头文件 */
#include "USBCI.h"
#include "USBDriver.h"

/***************************************************************************************
** 函数名称  : Init_USBInterrupt()
** 功能描述  : 配置USB设备控制器的中断向量号和中断优先级
****************************************************************************************/
void Init_USBInterrupt(void)
{
	VICVectCntl0 = (0x20 | 22);								/* USB中断分配到向量中断0 */
   	VICVectAddr0 = (INT32U)Usb_Exception;					/* USB中断服务程序地址 */
   	VICIntEnable = 1 << 22;									/* 使能USB中断 */
}


/***************************************************************************************
** Function  : DelayNS()
** Descriptor: Delay time
** Input	 : uint32 value:   delay value	
****************************************************************************************/
void DelayNS(uint32 value)
{
	uint32 i;
	
	for (; value > 0; value --)
		for (i = 0; i < 5000; i++);
}


/***************************************************************************************
** Name:  	 ADC_Init()
** Function: Initialize the ADC of LPC214x 
****************************************************************************************/
void ADC_Init(void)
{
	INT32U ADC_Data;

	PINSEL1 &= ~(0x03 << 28);
	PINSEL1 |= (0x01 << 28);							/* P0.30 Connected to ADC  */
	
	/* configurate the AD conversion */
	AD0CR = (1 << 3)						|			/* select the AD0.3        */
			((Fpclk / 1000000 - 1) << 8)	|			/* CLKDIV = Fpclk / 1000000 - 1, conversion clock is 1MHz */
			(0 << 16)						|			/* BURST = 0, software controls conversion   */
			(0 << 17)						|			/* CLKS = 0, use 11 clock          */
			(1 << 21)						|  			/* PDN = 1, the A/D converter is operational */
			(0 << 22)						|  			/* TEST1:0 = 00, normal operation  */
			(1 << 24)						|			/* START = 1, start conversion now */
 			(0 << 27);
	
	DelayNS(10);
	ADC_Data = AD0GDR;						    		/* read ADC result and clear DONE flag bit */
}

/***************************************************************************************
** Name:  	 Get_ADCValue_X()
** Function: Get AD0.1 conversion result
****************************************************************************************/
INT32U Get_ADCValue_X(void)
{
	INT32U ADC_Data;
	INT32U i,adsum = 0;
	
	AD0CR &= ~0xFF;										/* select AD0.1  */
	AD0CR |= 0x01 << 3;
		
	for (i = 0; i < 256; i++)							/* conversion 256 times */
	{
		AD0CR |= 1 << 24;								/* first conversion */ 
		while ((AD0GDR & 0x80000000) == 0);				/* wait for conversion end */
		
		AD0CR |= 1 << 24;								/* conversion again */
		while ((AD0GDR & 0x80000000) == 0);				/* wait for conversion end */
		ADC_Data = AD0GDR;								/* read ADC result  */
		
		ADC_Data = (ADC_Data >> 6) & 0x3ff;
		ADC_Data = ADC_Data * 2480;						/* Vref = (3 / 4) * 3.3, here 3.3 is anolog power */
		ADC_Data = ADC_Data / 1024;		
		adsum += ADC_Data;
	}
		
	adsum = adsum >> 8;									/* get average   */
	return adsum;										/* return result */
	
	DelayNS(10);
}

/***************************************************************************************
** Name:  	 Get_ADCValue_Y()
** Function: Get AD0.2 conversion result
****************************************************************************************/
INT32U Get_ADCValue_Y(void)
{
	return Get_ADCValue_X();							/* return result */
}

/* 全局全量 */
INT32U last_x,cur_x;									/* X 轴上一次与当前的位置值 */
INT32U last_y,cur_y;									/* Y 轴上一次与当前的位置值 */


/***************************************************************************************
**   主函数:  main()
****************************************************************************************/
int main (void)
{	
	INT8U err; 
	
	err = USB_Initialize();								/* 初始化USB控制器 */
	if (err != 0)
		while(1);
		
	Init_USBInterrupt();								/* 配置USB中断向量 */
	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)
		{
			if (bEPPflags.bits.hid_enumed == 1)			/* HID 类枚举已经完成 */
			{
				DISABLE();
				cur_x = Get_ADCValue_X();				/* 取得ADC0.3的转换值 */
				cur_y = Get_ADCValue_Y();				/* 取得ADC0.3的转换值 */

				GenEpBuf[0] = 0x00;
				GenEpBuf[1] = cur_x - last_x;			/* X: 发送ADC0.3变化值作为鼠标移动值 */ 
				GenEpBuf[2] = cur_y - last_y;			/* Y: 发送ADC0.3变化值作为鼠标移动值 */
				GenEpBuf[3] = 0x00;
							
				USB_WriteEndpoint(3,4,GenEpBuf);		/* 发送鼠标移动值到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 + -