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

📄 mainloop.c

📁 Six objects here: The document you re reading & its Chinese version Set of "HWDesign" includes
💻 C
字号:
#include <reg51.h>	//SFR declarations

#include "base_io.h"
#include "d12_comm_if.h"
#include "mainloop.h"
#include "usb_standard_request.h"
#include "usb_usr_request.h"

#include "myLED.h"

extern EPPFLAGS bEPPflags;
CONTROL_XFER ControlData;

/*
//*************************************************************************
// USB protocol function pointer arrays
//*************************************************************************
*/
code void (*StandardDeviceRequest[])(void) =
{
	get_status,
	clear_feature,
	reserved,
	set_feature,
	reserved,
	set_address,
	get_descriptor,
	reserved,
	get_configuration,
	set_configuration,
	get_interface,
	set_interface,
	reserved,
	reserved,
	reserved,
	reserved
};

code void (*VendorDeviceRequest[])(void) =
{
	mini_nurse_LEDon_command,
	mini_nurse_LEDoff_command,
	reserved,
//	mini_nurse_XXXXXX_command,
//	mini_nurse_SPEAKER_command,
//	mini_nurse_REMOTE_command,
//	mini_nurse_SENSOR_command,
//	mini_nurse_LCD_command
};


void connect_USB(void)
{
	DISABLE;
	bEPPflags.value=0;
	ENABLE;

        D12_SetMode(0x12,0x43);
	//D12_SetMode(0x10,0x00);

        LEDctl(LEDoff,LEDA);
}

void disconnect_USB(void)
{
	D12_SetMode(0x44,0x43);
	//D12_SetMode(0x0,0x0);
}

void reconnect_USB(void)
{
        unsigned int tmpi;
        LEDctl(LEDon,LEDA);
	D12SUSPD=0;

        disconnect_USB();
        for(tmpi=0;tmpi<40960;tmpi++);
        connect_USB();

	LEDctl(LEDoff,LEDA);
}

void init_special_interrupts(void)
{
	IT0    = 0;
	EX0    = 1;
	PX0    = 0;
}

void init_port()
{
	P0 = 0xFF;
	P1 = 0xFC;
	P2 = 0xFF;
	P3 = 0xFF;
        MCU_D12CS =0x0;
        D12SUSPD  =0x0;
}

void main(void)
{
    init_port();
    init_special_interrupts();
    MCU_D12CS = 0X1;
    MCU_D12CS = 0X0;
    //D12_ReadChipID();   //only for debug
    bEPPflags.value=0;
    /* Main program loop */
    reconnect_USB();
    //ENABLE;
    while( TRUE ){
           if (bEPPflags.bits.bus_reset) {
		DISABLE;
               	bEPPflags.bits.bus_reset = 0;
		ENABLE;
                D12SUSPD = 0X1;
		} // if bus reset

           if (bEPPflags.bits.setup_packet){
		DISABLE;
		bEPPflags.bits.setup_packet = 0;
		ENABLE;
		control_handler();
                D12SUSPD = 0X1;
		} // if setup_packet

	} // Main Loop
}

void stall_ep0(void)
{
	D12_SetEndPStatus(0, 1);
	D12_SetEndPStatus(1, 1);
}

void init_unconfig(void)
{
	D12_SetEndPEN(0);	/* Disable all endpoints but EPP0. */
}

void init_config(void)
{
	D12_SetEndPEN(1);	/* Enable  generic/iso endpoints. */
}

void single_transmit(unsigned char * buf, unsigned char len)
{
	if( len <= EP0_PACKET_SIZE) {
		D12_WriteEndP(1, len, buf);
	}
}

void code_transmit(unsigned char code * pRomData, unsigned short len)
{
	ControlData.wCount = 0;
	if(ControlData.wLength > len)
		ControlData.wLength = len;

	ControlData.pData = pRomData;
	if( ControlData.wLength >= EP0_PACKET_SIZE) {
		D12_WriteEndP(1, EP0_PACKET_SIZE, ControlData.pData);
		ControlData.wCount += EP0_PACKET_SIZE;

		DISABLE;
		bEPPflags.bits.control_state = USB_TRANSMIT;
		ENABLE;
	}
	else {
		D12_WriteEndP(1, ControlData.wLength, pRomData);
		ControlData.wCount += ControlData.wLength;
		DISABLE;
		bEPPflags.bits.control_state = USB_IDLE;
		ENABLE;
	}
}


void control_handler()
{
	unsigned char type, req;

	type = ControlData.DeviceRequest.bmRequestType & USB_REQUEST_TYPE_MASK;
	req = ControlData.DeviceRequest.bRequest & USB_REQUEST_MASK;

	//help_devreq(type, req); // print out device request

	if (type == USB_STANDARD_REQUEST)
		(*StandardDeviceRequest[req])();
	else if (type == USB_VENDOR_REQUEST)
		(*VendorDeviceRequest[req])();
	else
		stall_ep0();
}

⌨️ 快捷键说明

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