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

📄 main.c

📁 使用PIDUSBD12芯片实现的usb接口程序
💻 C
字号:
/****************************************Copyright (c)**************************************************
**                               广州周立功单片机发展有限公司
**                                     研    究    所
**                                        产品一部 
**
**                                 http://www.zlgmcu.com
**
** 文   件   名: main.c
** 最后修改日期: 2004年11月15日
** 描        述: 用户应用程序
** 版	     本: V5.0
**********************************************************************************************************/
#include "stc51.h"
//#include <reg52.h>
#include "D12Config.h"
#include "Descriptor.h"
#include "Chap_9.h"
#include "D12Driver.h"
#include <intrins.h>


//定义按键及LED引脚
sbit MCU_SWM0     = P2^0;				//按键
sbit MCU_SWM1     = P2^1;	
sbit MCU_KO1      = P1^0;				//按键
sbit MCU_KO2      = P1^1;
sbit MCU_LED0	  = P1^2;				//LED
sbit MCU_LED1	  = P1^3;
sbit RST_CS5466   = P1^4;
sbit Mcubz	      = P2^4;

unsigned char Time_S;
unsigned char Time_M;
unsigned char Time_x;

void check_key_LED(void);
void delay_ak(unsigned char times);
void InitTimer(void);
void Inc_time();
void InitCPUIO(void);
//////////////////////////////////////////////////////////////////
main()
{
   unsigned char ktso[16]={0,0,0,0,0,0,0,0,0,0,0,0};
	INT32U cnt;
    InitCPUIO();
	AUXR=0x02;
    InitTimer();
	//复位后LED亮
	for(cnt = 0; cnt <= 0x5000; cnt++)	//延时 
	{
		MCU_LED0 = 0;					//D2和D3点亮
 		MCU_LED1 = 0;
	}
	MCU_LED0 = 1;						//D2和D3灭
  	MCU_LED1 = 1;	
	
	if (Init_D12()!=0)					//初始化D12
	  return;							//如果初始化不成功,返回
	EX0 = 1;							//开外部中断0
	PX0 = 0;							//设置外部中断0中断优先级
	EA = 1;								//开80C51总中断

	while(1)
	{
		usbserve();						//处理USB事件
		if(bEPPflags.bits.configuration)
		{
			check_key_LED();			//连接正常,调用按键和LED控制处理
		}
	   if(Time_M>2)
	     {
		  ktso[2]=TL1;
          ktso[3]=220;
		  ktso[4]=0;
		  ktso[5]=0;
		  Time_M=0;
		  Time_S=0;
		  TH1=0;
          TL1=0;
		  D12_WriteEndpoint(3, 16, ktso);
		  }

	}
}


/******* 下面为与D12 Smart板相关的操作 *************/

/*******************************************************************
** 函数名称: check_key_LED()
** 功能描述: 检测D12 Smart板上的按键以及控制LED
** 输	 入: 无
** 输	 出: 无
********************************************************************/
void check_key_LED(void)
{
	static unsigned char c, last_key = 0xf;  
    unsigned char kts[16]={1,3,5,7,9,2,4,6,8,10,0x0a,0x0b,0x0c,0x0d,15};
    unsigned char k;

	c = MCU_SWM0 & MCU_SWM1;				//读取两个按键状态
	c &= 0x0f;
    kts[15]=c;
	if (c != last_key) {
		D12_WriteEndpoint(3, 16, kts);		//按键状态改变,发送信息给主机
	}

	last_key = c;							//保留按键状态

	if(bEPPflags.bits.ep1_rxdone) {
		DISABLE();							//接收到主机发来的LED控制信息
		bEPPflags.bits.ep1_rxdone = 0;
		ENABLE();
        if(GenEpBuf[3]==1){
		   MCU_LED0 = !(GenEpBuf[4] & 0x1);	//控制LED状态
           MCU_KO1= !MCU_LED0;
		   MCU_LED1 = !(GenEpBuf[4] & 0x2);
		   MCU_KO2 = !MCU_LED1;
           //delay_ak(2);
        }
        else if(GenEpBuf[3]==2){
           for(k=0;k<GenEpBuf[4];k++){
               Mcubz=1;
               delay_ak(2);
               Mcubz=0;
			   delay_ak(2);
		   }
		 }           
	}
}
/////////////////////////////////////////////////////////////////////
void delay_ak(unsigned char times)
{
 unsigned int ktime1,ktime2;
 while(times--!=0){
      for(ktime1=0;ktime1<200;ktime1++)
           for(ktime2=0;ktime2<100;ktime2++);
  }
}    
////////////////////////////////////////////////////////////////////
void InitCPUIO(void)
{
  MCU_KO1=0;
  MCU_KO2=0;
  Mcubz=0;
  MCU_LED0 = 1;					
  MCU_LED1 = 1;
  RST_CS5466=0;
  delay_ak(1);
  RST_CS5466=1;
}
///////////////////////////////////////////////////////////////////
void InitTimer(void)
{
   TMOD=0x51;
   TR0=1;
   TR1=1;
   ET0=1;
   EA=1;
   TH1=0x00;
   TL1=0x00;
   TH0=0x20;
   TL0=0x00;
   Time_S=0;
   Time_M=0;
}     
///////////////////////////////////////////////////////////////
//功能:模拟时钟变化,
//Time_S为秒,Time_M为分
//------------------------------------------------------------------------------------
void Inc_time()
{ 
  Time_S++;
  if(Time_S>10)
  {
   Time_S=0;
   Time_M++;
  if(Time_M>59)
     {
      Time_M=0;
      Time_x++;
      if(Time_x>23) Time_x=0;
      }
   }
}
///////////////////////////////////////////////////////////////////////////////////////
void timer1_isr(void) interrupt 1 using 3
{ TF0=0;
  TH0=0x20;
  TL0=0x00;
  Inc_time();
  TR0=1;
}
////////////////////////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

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