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

📄 main.c

📁 针对philips的51单片机LPC931的具体应用的例子。实现对uart, spi, i2c等硬件资源的操作。还有针对小内存单片机操作系统的实现。
💻 C
字号:
#define  __SYSTEM_VAR__ 

#include "REG931.H"
#include "memory.h"
#include "system.h"
#include "key.h"
#include "vfd.h"
#include "display.h"
#include "uart.h"


extern void Init_MCU(void);
extern void Init_WDT(void) ;
extern void ClrWDT(void);	// clear watch dog timer

void WatchDogResetCheck(void){
	uchar RstFlag;
	if(RSTSRC & 0x04){		// happen watch dog reset 
		RstFlag=0x20;
		RSTSRC &= ~0x04;    // clear watch dog reset flag
		SendData2TxBuff(SYS_RST_FLAG_CMD, &RstFlag);
	}
}

void Event_Cancel(unsigned char Event){
	if (OS_FETCH_EVENT != Event)
		return;
	OS_FETCH_EVENT=OS_EVENT_IDLE;
}

//Input:  Keydata, key event information
//output:key information
uchar GetKeyInfor(uchar key, uchar event){
	uchar uc;
	uc = key & 0x0f;
	uc |= event << 4;
	return uc;
}

void SysKey(void){
	uchar keytemp;
	uchar KeyInfor;
	keytemp=KeyData&0x3f;
	switch(KeyEvent){
	case PRESS_DOWN:
		switch(keytemp){
		case K_1:
		case K_2:
		case K_3:
		case K_4:
			KeyInfor = GetKeyInfor(keytemp, SG_PRESS_DOWN);
			SendData2TxBuff(TXD_KEY_EVENT_CMD, &KeyInfor);
			break;
		case K_12:
		case K_13:
		case K_14:
		case K_23:
		case K_24:
		case K_34:
			KeyInfor=keytemp&0x0f;
			KeyInfor |= DB_PRESS_DOWN<<4;
			KeyInfor = GetKeyInfor(keytemp, DB_PRESS_DOWN);
			SendData2TxBuff(TXD_KEY_EVENT_CMD, &KeyInfor);
			break;
		}
		KeyEvent=IDLE;
		break;
	case PRESS_HOLD:
		switch(keytemp){
		case K_1:
		case K_2:
		case K_3:
		case K_4:
			if(Timer64ms)
				break;
//			Timer64ms=T64ms_3SEC;		// repeat rate
			Timer64ms=T64ms_384ms;		// repeat rate
			KeyInfor = GetKeyInfor(keytemp, SG_REPEAT);
			SendData2TxBuff(TXD_KEY_EVENT_CMD, &KeyInfor);
			break;
		case K_12:
		case K_13:
		case K_14:
		case K_23:
		case K_24:
		case K_34:
			if((!bDBKeyHoldEn)||Timer64ms)    // be in first power on
				break;
			Timer64ms=T64ms_384ms;		// repeat rate
			KeyInfor = GetKeyInfor(keytemp, DB_REPEAT);
			SendData2TxBuff(TXD_KEY_EVENT_CMD, &KeyInfor);
			break;
		}
		break;
	case PRESS_UP_SHORT:
		switch(keytemp){
		case K_1:
		case K_2:
		case K_3:
		case K_4:
			KeyInfor = GetKeyInfor(keytemp, SG_PRESS_UP_SHORT);
			SendData2TxBuff(TXD_KEY_EVENT_CMD, &KeyInfor);
			break;
		case K_12:
		case K_13:
		case K_14:
		case K_23:
		case K_24:
		case K_34:
			KeyInfor = GetKeyInfor(keytemp, DB_PRESS_UP_SHORT);
			SendData2TxBuff(TXD_KEY_EVENT_CMD, &KeyInfor);
			break;
		}
		KeyEvent=IDLE;
		break;
	case PRESS_UP_LONG:
		switch(keytemp){
		case K_1:
		case K_2:
		case K_3:
		case K_4:
			KeyInfor = GetKeyInfor(keytemp, SG_PRESS_UP_LONG);
			SendData2TxBuff(TXD_KEY_EVENT_CMD, &KeyInfor);
			break;
		case K_12:
		case K_13:
		case K_14:
		case K_23:
		case K_24:
		case K_34:
			bDBKeyHoldEn=0;
			KeyInfor = GetKeyInfor(keytemp, DB_PRESS_UP_LONG);
			SendData2TxBuff(TXD_KEY_EVENT_CMD, &KeyInfor);
			break;
		}
		KeyEvent=IDLE;
		break;
	}
}


void SysMode(void){
	uchar keytemp;
	keytemp=KeyData&0x3f;
	switch(Mode){
		case SYS_WORK_PRE:
			if(!Timer64ms){
				Timer64ms=T64ms_128ms;
				Mode=SYS_READY;
			}
			break;
		case SYS_READY:
			if(!Timer64ms){
//				Counter32ms=95;
				Mode=SYS_IDLE;
			}
			break;
		case SYS_IDLE:
#if       0          // for debug
			if(Counter32ms>100){
				Counter32ms=0;
				SelfTestUnit=1;
				bSelfTest=1;
				Mode=SYS_SCREEN_TEST_SELF;
			}
#endif
			break;
		case SYS_EXIT:
			Mode=SYS_IDLE;
			break;
		case SYS_SCREEN_TEST_SELF:
			VFDTestSelf( );
			break;
	}
}


void main(   ){ 
	Init_MCU( );
	lpStruct=VFD.FrontBuff;
//#ifdef  INCLUDE_UART_CODE
	DisplayStr2Buff(LN4, 1, "12345678", NO_FILLSPACE, BACKUP_BUF);
	bFlashStr1=1;
//#endif
	while (1){	
	switch(OS_FETCH_EVENT){
        case OS_EVENT_4MS:		// 4ms
		if(Timer4ms)
			Timer4ms--;
//		I2C_Uart_InforProcess( );
#ifdef  INCLUDE_UART_CODE
		UartFrameResetCheck(  );
#endif
		Event_Cancel(OS_EVENT_4MS);
		break;
        case OS_EVENT_8MS:		// 8ms
		Event_Cancel(OS_EVENT_8MS);
		ClrWDT(  );
		break;
        case OS_EVENT_16MS:	//16ms
		KeyScan();
		CalKeyEvent(  );
		SysKey(  );
		Event_Cancel(OS_EVENT_16MS);
		break;
        case OS_EVENT_32MS:	// 32ms
        	Counter32ms++;
		SysMode(  );
		if(CommTimer){
			CommTimer--;
			DispIcon(Seg_Pulse, FTimer64ms & CommTimer);
			if(!CommTimer)
				VFD.BakupBuff[19] &= 0x7f;		// clear bit Pulse icon in backup buffer
		}
		Event_Cancel(OS_EVENT_32MS);
		break;
        case OS_EVENT_64MS:	// 64ms
		if(Timer64ms)
			Timer64ms--;
		FTimer64ms = ~FTimer64ms;
		Event_Cancel(OS_EVENT_64MS);
		break;
        case OS_EVENT_128MS:	// 128ms
//		if(Timer128ms)
//			Timer128ms--;
//      	FTimer128ms = ~FTimer128ms;
//		VFDBack2FrontProc(  );   	// for debug
		WatchDogResetCheck(  );
		Event_Cancel(OS_EVENT_128MS);
		ClrWDT(  );
		break;
        case OS_EVENT_256MS:	// 256ms
//		if(Timer256ms)
//			Timer256ms--;
        	FTimer256ms = ~FTimer256ms;
		VFDRollProcess(  );
		Event_Cancel(OS_EVENT_256MS);
		break;
        case OS_EVENT_512MS:	// 512ms
        	FTimer512ms = ~FTimer512ms;
		ClrWDT(  );
#if     0
//		TestChar(  );
		if(FTimer512ms){
	        	FTimer1s = ~FTimer1s;
//			if(FTimer1s){
//		        	FTimer2s = ~FTimer2s;
//			}
		}
#endif
		VFDFlashProcess( NORMAL_SEN );
		Event_Cancel(OS_EVENT_512MS);
		break;
        case OS_EVENT_RECOUNT:	// recount
		Event_Cancel(OS_EVENT_RECOUNT);
		break;
	}
	}
}



⌨️ 快捷键说明

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