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

📄 mainloop.c

📁 用keil c和vb开发的单片机通用usb键盘
💻 C
字号:
#include <stdio.h>
#include <string.h>
#include <reg51.h>                /* special function register declarations   */
#include "mainloop.h"
#include "isr.h"
#include "protozlg.h"

/*
//*************************************************************************
//  Public static data
//*************************************************************************
*/

extern EPPFLAGS bEPPflags;
extern unsigned char idata GenEpBuf[];
extern unsigned char idata EpBuf[];
extern unsigned int data d12_addr;

extern unsigned int data D12_DATA;
extern unsigned int data D12_COMMAND;


sfr CKCON = 0x8F;//87C52x2用
sbit clksel = P2^0;

//D12中断服务
usb_isr() interrupt 0
{
	DISABLE;
	fn_usb_isr();//调用D12中断服务子程序
	ENABLE;
}

void delayy(short i)
{
int j=0;
int k=0;
k=i*DELAY_VALUE;
while (j<k) j++;
}
 
unsigned char keyscan()
{
             
if (PINDRVKEY1==FALSE)        //P1_0 IS 0
delayy(DELAY_VALUE);            //DELAY
if (PINDRVKEY1==FALSE)        //again P1_0 IS 0
{delayy(DELAY_VALUE);           //delay again
if (PINDRVKEY1==FALSE)        //still p1_0 is 0
return 26;}

if (PINDRVKEY2==FALSE)        //P1_1 IS 0
delayy(DELAY_VALUE);            //DELAY
if (PINDRVKEY2==FALSE)        //again P1_1 IS 0
{delayy(DELAY_VALUE);           //delay again
if (PINDRVKEY2==FALSE)        //still p1_1 is 0
return 27;}

if (PINDRVKEY3==FALSE)        //P1_2 IS 0
delayy(DELAY_VALUE);            //DELAY
if (PINDRVKEY3==FALSE)        //again P1_2 IS 0
{delayy(DELAY_VALUE);           //delay again
if (PINDRVKEY3==FALSE)        //still p1_2 is 0
return 28;}

if (PINDRVKEY4==FALSE)        //P1_3 IS 0
delayy(DELAY_VALUE);            //DELAY
if (PINDRVKEY4==FALSE)        //again P1_3 IS 0
{delayy(DELAY_VALUE);           //delay again
if (PINDRVKEY4==FALSE)        //still p1_3 is 0
return 29;}

if (PINDRVKEY5==FALSE)        //P1_4 IS 0
delayy(DELAY_VALUE);            //DELAY
if (PINDRVKEY5==FALSE)        //again P1_4 IS 0
{delayy(DELAY_VALUE);           //delay again
if (PINDRVKEY5==FALSE)        //still p1_4 is 0
return 30;}

if (PINDRVKEY6==FALSE)        //P1_5 IS 0
delayy(DELAY_VALUE);            //DELAY
if (PINDRVKEY6==FALSE)        //again P1_5 IS 0
{delayy(DELAY_VALUE);           //delay again
if (PINDRVKEY6==FALSE)        //still p1_5 is 0
return 31;}

if (PINDRVKEY7==FALSE)        //P2_0 IS 0
delayy(DELAY_VALUE);            //DELAY
if (PINDRVKEY7==FALSE)        //again P2_0 IS 0
{delayy(DELAY_VALUE);           //delay again
if (PINDRVKEY7==FALSE)        //still p2_0 is 0
return 32;}

if (PINDRVKEY8==FALSE)        //P2_1 IS 0
delayy(DELAY_VALUE);            //DELAY
if (PINDRVKEY8==FALSE)        //again P2_1 IS 0
{delayy(DELAY_VALUE);           //delay again
if (PINDRVKEY8==FALSE)        //still p2_1 is 0
return 33;}

if (PINDRVKEY9==FALSE)        //P2_2 IS 0
delayy(DELAY_VALUE);            //DELAY
if (PINDRVKEY9==FALSE)        //again P2_2 IS 0
{delayy(DELAY_VALUE);           //delay again
if (PINDRVKEY9==FALSE)        //still p2_2 is 0
return 34;}

if (PINDRVKEY10==FALSE)        //P2_3 IS 0
delayy(DELAY_VALUE);            //DELAY
if (PINDRVKEY10==FALSE)        //again P2_3 IS 0
{delayy(DELAY_VALUE);           //delay again
if (PINDRVKEY10==FALSE)        //still p2_3 is 0
return 35;}

if (PINDRVKEY11==FALSE)        //P2_4 IS 0
delayy(DELAY_VALUE);            //DELAY
if (PINDRVKEY11==FALSE)        //again P2_4 IS 0
{delayy(DELAY_VALUE);           //delay again
if (PINDRVKEY11==FALSE)        //still p2_4 is 0
return 36;}

if (PINDRVKEY12==FALSE)        //P2_5 IS 0
delayy(DELAY_VALUE);            //DELAY
if (PINDRVKEY12==FALSE)        //again P2_5 IS 0
{delayy(DELAY_VALUE);           //delay again
if (PINDRVKEY12==FALSE)        //still p2_5 is 0
return 37;}

if (PINDRVKEY13==FALSE)        //P2_6 IS 0
delayy(DELAY_VALUE);            //DELAY
if (PINDRVKEY13==FALSE)        //again P2_6 IS 0
{delayy(DELAY_VALUE);           //delay again
if (PINDRVKEY13==FALSE)        //still p2_6 is 0
return 38;}

if (PINDRVKEY14==FALSE)        //P2_7 IS 0
delayy(DELAY_VALUE);            //DELAY
if (PINDRVKEY14==FALSE)        //again P2_7 IS 0
{delayy(DELAY_VALUE);           //delay again
if (PINDRVKEY14==FALSE)        //still p2_7 is 0
return 39;}

if (PINDRVKEY15==FALSE)        //P3_0 IS 0
delayy(DELAY_VALUE);            //DELAY
if (PINDRVKEY15==FALSE)        //again P3_0 IS 0
{delayy(DELAY_VALUE);           //delay again
if (PINDRVKEY15==FALSE)        //still p3_0 is 0
return 40;}

if (PINDRVKEY16==FALSE)        //P3_1 IS 0
delayy(DELAY_VALUE);            //DELAY
if (PINDRVKEY16==FALSE)        //again P3_1 IS 0
{delayy(DELAY_VALUE);           //delay again
if (PINDRVKEY16==FALSE)        //still p3_1 is 0
return 41;}

return 42;

}



void main(void)
{
	P0 = 0xFF;//初始化I/O口
	P1 = 0xFF;
	P2 = 0xFF;
	P3 = 0xFF;

//	CKCON = 0x00;
	CKCON = 0x00;

//	if(clksel == 1)
//		CKCON = CKCON | 0x01;

	D12_DATA = 0xff02;			//定义数据地址
	D12_COMMAND = 0xff03;		//定义命令地址


	MCU_D12CS = 0x0;
	D12SUSPD = 0x0;

	IT0 = 0;//初始化中断
	EX0 = 1;
	PX0 = 0;
	EA = 1;


	MCU_D12CS = 0x1;
	MCU_D12CS = 0x0;
	D12_SetDMA(0x0);
	bEPPflags.value = 0;

	reconnect_USB();//联接USB总线

	/* Main program loop */
	while( TRUE ){
		if(bEPPflags.bits.configuration)
			check_key();//连接正常,调用按键和LED控制处理

		usbserve();//USB服务数据处理

	} // Main Loop
}

void check_key(void)
{
	static unsigned char c, last_key =42;

	
	c =keyscan();
	if (c != last_key) {
		D12_WriteEndpoint(3, 1, &c);//按键状态改变,发送信息给主机
	}
	last_key = c;

	
}



⌨️ 快捷键说明

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