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

📄 mainloop.c

📁 这是应用在Philips的D12上的源代码。很有用的哦。
💻 C
字号:
/*********************************************************************************************************
**				                               Small RTOS(51)
**                                   The Real-Time Kernel(For Keil c51)
**
**                                  (c) Copyright 2002-2002, chenmingji
**                                           All Rights Reserved
**
**                                                  V1.12.1
**
**
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名: Mainloop.C
**创   建   人: 刘英斌
**最后修改日期: 2003年7月1日
**描        述: DP-51的USB驱动例子
**
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 刘英斌
** 版  本: V1.00
** 日 期: 2003年6月20日
** 描 述: 原始版本,PUSB
**
**------------------------------------------------------------------------------------------------------
** 修改人:
** 版  本:
** 日 期:
** 描 述:
**
**------------------------------------------------------------------------------------------------------
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人: 刘英斌
** 日 期: 2003年6月20日
** 描 述: 
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/


#include "config.h"
#include "mainloop.h"
#include "d12ci.h"
#include "d12_isr.h"
#include<intrins.h>

uint8 ShowCase[5];                          //显示缓存,用来保存各个显示位的段码
uint8 KeyBordData;                          //保存当前闭合的键的位图
uint8 OS_Q_MEM_SEL NotUse _at_ 0x0000;      //指针的NULL为0,这个变量占用0地质避免出现有效的NULL指针
uint8 OS_Q_MEM_SEL CommandData[16];         //给命令消息队列分配的队列空间

extern EPPFLAGS bEPPflags;
extern unsigned char xdata GenEpBuf[EP1_PACKET_SIZE];

/*********************************************************************************************************
** 函数名称: init
** 功能描述: 初始化函数,一般在多任务环境启动前调用
** 输 入: 无
** 输 出: 无
** 全局变量: 无
**
** 作 者: 刘英斌
** 日 期: 2003年6月20日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
		void init(void)
{
	//"系统初始化"
	//CKCON = 0x01;

	IE = 0x00;      //"清除中断"
	TCON = 0;
    T2CON = 0x0;
    TR2 = 1;
    ET2 = 1;
                                            //系统节拍中断使用定时器2,中断频率为600Hz
    RCAP2H = (65536 - (11059200 / 12) / 600) / 256;
    RCAP2L = (65536 - (11059200 / 12) / 600) % 256;
    TH2 = (65536 - (11059200 / 12) / 600) / 256;
    TL2 = (65536 - (11059200 / 12) / 600) % 256;
                                            //设置dp-51使用的存储空间xdata、code均为0页
    XBYTE[0xf000] = 0;
    XBYTE[0xf001] = 0;
}

/*********************************************************************************************************
** 函数名称: main
** 功能描述: 主函数,用户程序从这里执行
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: init(),OSStart()
**
** 作 者: 刘英斌
** 日 期: 2003年6月20日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void main(void)
{
    init();
    OSStart();
}

/*********************************************************************************************************
** 函数名称: enumerate
** 功能描述: USB请求处理任务
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 
**
** 作 者: 刘英斌
** 日 期: 2003年6月30日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void enumerate(void)
{
	OSSemCreate(USB_setup,0);			//创建信号量0:USB_setup
	
	while (1)
	{
		OSWait(K_TMO,200);
		IT1 = 0;						//开放中断
		EX1 = 1;
		PX1 = 0;
		reconnect_USB();				//重新连接USB
		while (USB_VIN)
		{
			OSSemPend(USB_setup,0);		//等待信号量0(setup 包信号量)
			OSSemPend(D12_use,0);		//等待D12_use信号量
			control_handler();			//调用请求处理子程序
			OSSemPost(D12_use);			//释放D12_use信号量
		}
	}
}

/*********************************************************************************************************
** 函数名称: usb_isr
** 功能描述: USB中断处理任务
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 
**
** 作 者: 刘英斌
** 日 期: 2003年6月30日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void usb_isr(void)
{
	unsigned int i_st;
	OSSemCreate(D12_isr,0);					//创建信号量2:D12_isr
	OSSemCreate(D12_use,1);					//创建信号量1:D12_use

	while(1)
	{
		OSSemPend(D12_isr,0);				//等待D12_isr信号量
		OSSemPend(D12_use,0);				//等待D12_use信号量
		i_st = D12_ReadInterruptRegister();	//读取中断寄存器
		if(i_st != 0) {
			if(i_st & D12_INT_ENDP0IN)
				ep0_txdone();				//端点0IN中断
			if(i_st & D12_INT_ENDP0OUT)
				ep0_rxdone();				//端点0OUT中断
			if(i_st & D12_INT_ENDP1IN)
				ep1_txdone();				//端点1IN中断
			if(i_st & D12_INT_ENDP1OUT)
				ep1_rxdone();				//端点1OUT中断
			if(i_st & D12_INT_ENDP2IN)
				main_txdone();				//端点2IN中断
			if(i_st & D12_INT_ENDP2OUT)
				main_rxdone();				//端点2OUT中断
		}
		OSSemPost(D12_use);					//释放D12_use信号量
		EX1 = 1;							//开中断
	}
}

/*********************************************************************************************************
** 函数名称: check_key_LED
** 功能描述: LED和按键处理任务
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 
**
** 作 者: 刘英斌
** 日 期: 2003年6月30日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void check_key_LED(void)
{
	unsigned char kk=0xff;
	unsigned char c = 0xff;

	while(1)
	{
		LED_CS=1;
		KD_KEY=1;
		send(0x00);
		OSWait(K_TMO,3);
		if ((bit)c != KD_KEY)
		{
			OSWait(K_TMO,5);
			if ((bit)c != KD_KEY)
			{
				c=(unsigned char) KD_KEY;
				OSSemPend(D12_use,0);			//等待D12_use信号量
				D12_WriteEndpoint(3, 1,&c);		//发送按下按键状态
				OSSemPost(D12_use);				//释放D12_use信号量
			}
		}

		if(bEPPflags.bits.ep1_rxdone)
		{
			bEPPflags.bits.ep1_rxdone = 0;
			kk=~GenEpBuf[3];					//改变LED状态
		}
		LED_CS=1;
		send(kk);
		LED_CS=0;
		OSWait(K_TMO,20);
		LED_CS=1;
	}
}


void send(unsigned char a)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		if(_crol_(a,i)&0x80)
			SDA=1;
		else
			SDA=0;
		CLK=0;
		CLK=1;
	}
}	

/**********************end****************************************/

⌨️ 快捷键说明

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