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

📄 main_1204.c

📁 Linux的实时性如何得到改观
💻 C
字号:

#include "RS232.h"
#include "KeyPad.h"
#include "LCD.h"

#include "44b.h"

////////////////////////////////////
/*
void Test_Interrupt()
{	
	init_Interrupt_EINT4567();
	
	RS232_send_string( "Press any Key && Check the RS232 output !\n" );
	
    while( 1 ) ;

}
*/
//////////////////////////////////
void Test_LowPwr(void)
{
	//Mode_LowPwr();
}

/////////////////////////////////
void Test_RS232(void)
{
	int Msg = 32;
	
	RS232_open(115200l,COM_8BIT|COM_NOPARITY|STOP_1BIT);
	
	while( Msg < 128 )
	{		
		RS232_send_char( Msg );		
		Msg++;	
	}	
}


volatile unsigned int Key_Flag;
volatile unsigned int Key_Buf;

volatile unsigned int Timer_Count;
volatile unsigned int Key_Time;
volatile unsigned int Com_Time;

extern struct KEY_struct KEY_inf;
extern void Key_scan();

/****************************************
 *  PWM Timer Interrupt0/1/2/3/4/5 test	*
 ****************************************/

void __irq Timer5Done(void)
{
    rI_ISPC |= BIT_TIMER5;
    Timer_Count++;  
    
    //RS232_send_char(variable);
    //rPDATE ^= (1<<3);
    //===== KeyPad scan =====
    if( KEY_inf.Work ){
    	KEY_inf.Timer++;
    	
    	if(KEY_inf.Timer > KEY_TIMER_MAX){
    		KEY_inf.Timer = 0;
    		Key_scan();
    	}    	
    }  
    
} 
 
void Timer5_init(void)
{
	rINTMSK |= BIT_TIMER5;
	
    Timer_Count = 0;
    
    pISR_TIMER5=(int)Timer5Done;  

//    rINTMSK=~(BIT_GLOBAL|BIT_TIMER5);    
//    pISR_TIMER5=(int)Timer5Done; 
	rPCONE = ( rPCONE & (~(3<<6)) ) | ( (0x1)<<6 ); 
	rPDATE &= ~(1<<3);  

    //rTCFG0 = 0xf0f0f;
    //rTCFG1 = 0x01234;
    rCLKCON	|= 1<<3;
    rTCFG0 	&= 0x0000FFFF;
    rTCFG1 	&= 0x000FFFFF;
    rTCFG1 	|= 0x3<<20;

    //rTCNTB5=0xffff;
    rTCNTB5	 = ( MCLK )/(1000*16);

    //rTCON=0x2222202;
    //rTCON=0x5999901;
    rTCON = 0x2<<24;
    rTCON = 0x5<<24;
    
    rINTMSK &= ~(BIT_GLOBAL|BIT_TIMER5);    

	
	//while(1);
    //rINTMSK=BIT_GLOBAL;   
}
/*
void Test_PWM(void)
{
	rPCONE = ( rPCONE & (~(3<<6)) ) | ( (0x2)<<6 ) ;
   	rPUPE = rPUPE & (~(1<<3)) ;
   	
	rTCON = rTCON & (~(0xf<<0)) ;			// clear manual update bit, stop Timer3

	rTCFG0 	&= 0xffff0000;					// set Timer 2&3 prescaler 0

	rTCFG1 	&= 0xfffffff0;					// set Timer 2 MUX 1/16
	rTCFG1  |= 0x00000003;					// set Timer 2 MUX 1/16

	rTCNTB0	 = ( MCLK )/(1000*16);				//if set inverter off, when TCNT2<=TCMP2, TOUT is high, TCNT2>TCMP2, TOUT is low
	rTCMPB0  = (rTCNTB0*(100-50))/100;	//if set inverter on,  when TCNT2<=TCMP2, TOUT is low,  TCNT2>TCMP2, TOUT is high

	rTCON = rTCON & (~(0xf<<0)) | (0x0a<<0) ;
	//自动重装,输出取反关闭,更新TCNTBn、TCMPBn,死区控制器关闭
	rTCON = rTCON & (~(0xf<<0)) | (0x09<<0) ;		//开启蜂鸣器的叫声   	
	
	while(1);
}

//=============================
void __irq MyKey_Interrupt(void) 
{	
	int which_int_key;
	
    which_int_key = rEXTINTPND ;
    rEXTINTPND = 0xf ;		//clear EXTINTPND reg.		
    rI_ISPC = BIT_EINT4567 ;		//clear pending_bit

    rPCONG &= ~(0xFF<<8);		//GPC567 is input

    switch(which_int_key)
   {
        	case 1:
        	    RS232_send_string("EINT==4\n");
        	    which_int_key=0;
        	    break;
        	case 2:
        	    RS232_send_string("EINT==5\n");
        	    which_int_key=0;
        	    break;
        	case 4:
        	    RS232_send_string("EINT==6\n");
        	    which_int_key=0;
        	    break;
        	case 8:
        	    RS232_send_string("EINT==7\n");
        	    which_int_key=0;
        	    break;
        	default :
        	    break;
    }
 
 	while( (rPDATG&0x00f0) != 0x00f0  ) ;
 	//Delay( 50 ) ;		//
    rPCONG = rPCONG | ( 0xff<<8 );		//EINT7~5
}

//=============================
void __irq Only_Interrupt(void) 
{
    rEXTINTPND = 0xF;		
    rI_ISPC |= BIT_EINT4567;

    rPCONG &= ~(0xFF<<8);
    
    KEY_inf.Trag = 1;
    
    RS232_send_string("EINT Trag\n");
}

void Test_EINT4567(void)
{
    //rINTMSK = 0x7ffffff;
    //pISR_EINT4567 = (unsigned)Key_Interrupt ;

	rINTMSK |= BIT_EINT4567;
	rCLKCON	|= 1<<10;

	rINTCON = 0x5 ;	
	rINTMOD = 0x0 ;	

    rPCONG  |= 0xFF<<8;
    rPUPG   &= ~(0xF<<4);	
	rEXTINT &= 0x0000FFFF;
	rEXTINT |= 0x33330000;
	//rEXTINT = rEXTINT & (~(0x222<<20)) ;

	rPCONC	&= ~0x3ff;
	rPCONC 	|= 0x155;	    
	rPDATC  &= ~0x1f;
	
    rEXTINTPND = 0xF;		
    rI_ISPC |= BIT_EINT4567;	
	
    pISR_EINT4567 = (unsigned)Only_Interrupt ;
    rINTMSK &= ~( BIT_GLOBAL | BIT_EINT4567 ) ;	
    
    while(1);
    
}

*/

struct RS232_inf{
	unsigned char Rx_ON;
	unsigned char Tx_ON;	
};

struct RS232_BUF_STRUCT{
	unsigned int pInput;
	unsigned int pOutput;
	unsigned char Data[2048];
};

struct RS232_BUF_STRUCT RS232_buf_inf; 

volatile unsigned int RS232_Timer;
volatile unsigned int RS232_Count;

void __irq ISR_RS232_Rx(void)
{
    rI_ISPC = BIT_URXD1;

	if(rUFSTAT1 & 0xf){
		RS232_Timer = 0;
	    while( (rUFSTAT1&0xf) >0 )
	    {
			RS232_buf_inf.Data[ RS232_buf_inf.pInput++ ] = rURXH1;
			RS232_buf_inf.pInput &= 0x7FF;
			RS232_Count++;
	    }
	    
	    if(RS232_Count > 15){
			RS232_Count = 0;
			RS232_send_char('G');
		}
	    
	}

}

//=============================
int RS232_init(unsigned int baud, unsigned int mode)
{
	rCLKCON	|= (1<<9);
	rPCONC	|= 0x0f000000;
	rPDATC	|= 0x4000;
	
	RS232_Timer = 0;
	RS232_Count = 0;
	RS232_buf_inf.pInput = 0;
	
	pISR_URXD1=(unsigned)ISR_RS232_Rx;
	
	rUBRDIV1= ( (int)(MCLK/(16*baud) + 0.5) -1 );
	
	
	//rUFCON1 = 0xf7;	// Reset FIFO
	//rUFCON1 = 0x00;
	rUFCON1 = (1<<4) | (3<<1) | 1;
	rUMCON1 = 0x0;
	
	rULCON1 = mode;	//
	
	//rUCON1 = 0x245; 
	//rUCON1 	= 0x05; 
	rUCON1 	= 0x285;  
	
	rINTMSK=~(BIT_GLOBAL|BIT_URXD1);    
		
	//rUBRDIV1=((mul_div(MCLK,2,baud<<4)+1)>>1)-1;//
	//rUBRDIV1= ( (int)(MCLK/(16*baud) + 0.5) -1 );
	//rUFCON1 = 0xf1;	// normal FIFO
	
	//while(1);
	
	return 0;
}

///////////////////////////////
void Test_KeyPad(void)
{
	Key_open();
	Timer5_init();
	
	while(1){
		
		if(KEY_inf.Value != 0){
			RS232_send_char(KEY_inf.Value);
			KEY_inf.Value = 0;
		}
	}
}

///////////////////////////////
int Main(void)
{
	unsigned char k;

StartTest:

	//RS232_open(115200,COM_8BIT|COM_NOPARITY|STOP_1BIT);
	LCD_open();	
	Key_open();
	
	LCD_clear_screen();	
	LCD_locate(1,6);	LCD_write_string("功能测试",1);
	LCD_locate(6,4);  	LCD_write_string("[1] 中断测试",0); 
	LCD_locate(8,4);  	LCD_write_string("[2] 低功耗测试",0);
	LCD_locate(10,4);  	LCD_write_string("[3] 串口测试",0);

	//Test_PWM();
	//Test_EINT4567();
	RS232_init(115200,COM_8BIT|COM_NOPARITY|STOP_1BIT);
	Test_KeyPad();

	k=0;	
	while(k<'1' || k>'3'){
		k = Key_get(1);
	}
	
	switch(k)
	{
		case '1':
			//Test_Interrupt();
			break;
		
		case '2':
			//Test_LowPwr();
			break;
			
		case '3':
			//Test_RS232();
			break;
						
		default:
			break;		
	}

	goto StartTest;	
	
}


⌨️ 快捷键说明

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