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

📄 mcu.c

📁 主要用于液晶电视解码,内置51单片机,全部代码用C编写,编译环境为KEILC
💻 C
字号:
#define _MCU_C_

#include "types.h"
#include "global.h"
#include "misc.h"
#include "DEBUG.h"
#include "Reg52.h"
#include "ms_reg.h"
#include "ms_rwreg.h"
#include "mcu.h"

void Init_MCU(void)
{
  EA=0;

  g_bMcuUseNewClock = 0;

  Init_IOPorts();
  Init_SerialPort();
  Init_Timer();
  Init_ExternalInterrupt();
  EA=1;
}


// Initialize I/O setting
void Init_IOPorts(void)
{
#if 1
    #if(ENABLE_WATCH_DOG)
	PWDT = 0x50;
	PWDT1 = 0xA0;
	#else
	PWDT = 0x55;
	PWDT1 = 0xAA;
	#endif

    WDTCON = 0x00; // disable WDT.

#else
	PWDT = 0x55;
	PWDT1 = 0xAA;
    #if(ENABLE_WATCH_DOG)
    WDTCON = 0x02; // enable WDT.
    #else
    WDTCON = 0x00; // disable WDT.
    #endif
#endif
				  //600ms
	CKCON = 0x98;//0xD8;//0xC0;
	P0 = Init_P0_Value;//0xFE;
	//P0SEL = 0xf9;
	//P0IO = 0xf9;

	P1SEL = 0xff;
	P1IO = 0xff;

	g_ucP4Value=Init_P4_Value;
	P4 = g_ucP4Value;

#ifdef P6_GPIO_Enable
	P6_IO_Ctrl|= 0xF0;
	P6|=Init_P6_Value;
#endif

#ifdef P5_GPIO_Enable
    P5_IO_Ctrl|=0x0F;
    P5|=Init_P5_Value;
#endif
}

/* initialize 8051 CPU timer & interrupt routine */
/* TCON.7(   TF1): Timer 1 overflow flag */
/* TCON.6(   TR1): Timer 1 stop/start bit */
/* TCON.5(   TF0): Timer 0 overflow flag */
/* TCON.4(   TR0): Timer 0 stop/start bit */
/* TCON.3(   IE1): Timer 1 INT1 interrupt flag */
/* TCON.2(   IT1): Timer 1 INT1 interrupt style setup*/
/* TCON.1(   IE0): Timer 0 /INT0 interrupt flag */
/* TCON.0(   IT0): Timer 0 /INT0 interrupt style setup */

void Init_ExternalInterrupt(void)
{
    //INT0 setting
    //for DDC2BI
    IT0 = 0; // set INT0 type(edge triger)
    PX0 = 1; // set INT0 priority high
    EX0 = 1; // enable INT0 interrupt

    //INT1 setting
    IT1 = 1; // set INT1 type(edge triger)
#if ENABLE_MCU_USE_INTERNAL_CLOCK
    if(MCU_CLOCK_DIVIDER>8)
	PX1 = 1; // set INT1 priority high
    else
	PX1 = 0; // set INT1 priority high
#else
    PX1 = 1; // set INT1 priority high
#endif
    EX1 = 1; // enable INT1 interrupt

    //TIMER0 setting
    //McuInitTimer0();

    //Timer1 setting for uart

    //TIMER2 setting
    T2CON = 0x00;
    T2MOD = 0x00;

    EA = 1;        // interrupt enable
}

void Init_Timer(void)
{
    TMOD = (TMOD & 0xf0) | 0x01; // set TIMER0 mode 1
    PT0 = 0;      // set TIMER0 priority low
    TR0 = 1;      // TIMER0 enable
    ET0 = 1;      // enable TIMER0 interrupt
}

/*----------Timer 2 -------------------*/
/* T2CON.7(   TF2): overflow flag */
/* T2CON.6(  EXF2): extern enable flag */
/* T2CON.5(  RCLK): receive clock */
/* T2CON.4(  TCLK): transfer clock */
/* T2CON.3( EXEN2): extern enable flag */
/* T2CON.2(   TR2): stop/start timer 2 */
/* T2CON.1(  C_T2): intern clock(0)/extern counter(1) switch */
/* T2CON.0(CP_RL2): capture flag */

void Init_SerialPort(void)
{
    // timer1, mode 2, 8-bit auto reload
    TMOD = (TMOD & 0x0f) | 0x20; // timer1, mode 2, 8-bit reload

    // Timer1: Uart baudrate generator
    TH1 = TIMER1_MODE2_TH1;      // set timer1(buad rate)
    TR1 = 1;    // timer1 run

    // UART
    SCON = 0x50;    // mode 1, 8-bit UART, enable receive
    if(_SMOD) PCON |= 0x80;
    RI = 0;
    TI = 0; // clear transfer flag

    PS = 0; // set uart priority low
    ES = _DEBUG_EXTDEV_EN_;// 1; // enable uart interrupt
    // reset Uart variables
#if (IR_TIMER_SEL == IR_USE_TIMER1)
    g_bUartDisable = 0;
#endif
    g_UartCommand.Index = 0;

    g_bDebugASCIICommandFlag = _DISABLE;
    g_bDebugProgStopFlag = FALSE;
}

#if ENABLE_MCU_USE_INTERNAL_CLOCK
void McuUseInternalClock(void)
{
    WORD wTmp;

    wTmp = ((DWORD)NEW_MCU_XTAL_CLK_HZ*_SMOD+NEW_MCU_XTAL_CLK_HZ+(TIMER1_MODE2_DIVIDER/2))/TIMER1_MODE2_DIVIDER;
    //printf("\r\nNew TIMER1_MODE2_TH1=%d", wTmp);

    //msWriteByte( BK0_00_REGBK, REG_BANK_SCALER);
    msWriteByte( BK0_EE_PDMD2, BK0_EE_VAL );

    ES = 0;
    TR1 = 0;
    RI = 0;
    TI = 0; // clear transfer flag

    TH1 = 256 - wTmp;
    g_bMcuUseNewClock = 1;

    TR1 = 1;
    ES = _DEBUG_EXTDEV_EN_;// 1;
}
#endif

#if(ENABLE_WATCH_DOG)
void McuWatchDogSetTimer(EnuWatchDogTime WatchDogType)
{
if(WatchDogType==WatchDogTime_5S)   //5 s'
	CKCON = 0xD8;
else //600 ms
	CKCON = 0x98;
}

void WatchDogClear(void)
{
    WDTCON = 1;
}
#else
void WatchDogClear(void)
{}
#endif

⌨️ 快捷键说明

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