📄 mainloop.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 + -