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

📄 c_isr.#1

📁 Cygnal C8051f系列单片机的flash存储器加密程序
💻 #1
字号:
#include <c8051F320.h>					// SFR declarations
/*
采用中断实现
定时器2为LED动态扫描定时
定时器3为秒定时基准
*/
//-----------------------------------------------------------------------------
// 全局常量
//-----------------------------------------------------------------------------
#define T2L_VAL 0xc0					//4ms
#define T2H_VAL 0xe0

#define T3L_VAL 0xc0					//20ms
#define T3H_VAL 0x63

unsigned char seg[]={0x81,0xcf,0x92,0x86,0xcc,0xa4,0xa0,0x8f,0x80,0x8c};
unsigned char un_dig[] ={0x7f,0xbf,0xdf,0xef,0xf7,0xfb};

//-----------------------------------------------------------------------------
// 全局变量
//-----------------------------------------------------------------------------
unsigned char dd;    
unsigned char second_all;
unsigned char ring_tmr;

unsigned char second;
unsigned char minute;
unsigned char hour;
unsigned char disbuf[6];

unsigned char tmr3_done;
bit tmr2_done;

sbit RED_LED = P0^7;                   // Red LED: '1' is ON
sbit GREEN_LED = P1^0;	               // Green LED: '1' is ON
sbit RING = P1^1;                      // RING:'0' is ON

//-----------------------------------------------------------------------------
// 函数原型
//-----------------------------------------------------------------------------
void SYSCLK_Init (void);
void PORT_Init (void);
void Timer2_Init (void);
void Timer2_ISR (void);
void Timer3_Init (void);
void Timer3_ISR (void);
unsigned char da_adjust(unsigned char da);

extern void lock (void);

//-----------------------------------------------------------------------------
// MAIN Routine
//-----------------------------------------------------------------------------
void main (void) {
	
lock ();

   PCA0MD &= ~0x40;						// WDTE = 0,disnable watchdog timer 
	
   SYSCLK_Init ();                      // Initialize system clock to 24MHz
   PORT_Init ();                        // Initialize crossbar and GPIO
   Timer2_Init ();						// Init Timer2/3 to generate 
   Timer3_Init();

   dd=0;
   dd=0;
   dd=0;   
   dd=0;   
   second_all=50;
   second=0;
   minute=0;
   hour=0;

   EA = 1;								// enable global interrupts
	PCA0CPH4=0;
	while (1)
	{
	if (tmr2_done == 1&tmr3_done != 8)
		{
		PCA0CPH4=0;
		tmr2_done = 0;
		tmr3_done++;
		}
	}
}

//-----------------------------------------------------------------------------
// SYSCLK_Init
//-----------------------------------------------------------------------------
void SYSCLK_Init (void)
{
   int i;
   PCA0MD&=0xf1;
   PCA0CPL4=255;
   PCA0MD|=0x60;
   CLKMUL|=0x80;
   for(i=0;i<7;i++)
   {}
   CLKMUL|=0xc0;
   CLKSEL|=0x02;
    
}

//-----------------------------------------------------------------------------
// PORT_Init
//-----------------------------------------------------------------------------

void PORT_Init (void)
{
  
   XBR1     = 0xc0;                       
   P0MDOUT |= 0x80;                       
   P1MDOUT |= 0x01;
   P2MDOUT |= 0x00;
   RED_LED  = 1;
   GREEN_LED= 0;
   RING     =1;
}

//-----------------------------------------------------------------------------
// Timer2_Init
//-----------------------------------------------------------------------------
void Timer2_Init ()
{
	TMR2CN  = 0x00;                        // Stop Timer2; Clear TF2;
                                          // use SYSCLK/12 as timebase
   CKCON   = 0x00;                       

   TMR2L   = T2L_VAL ;                   
   TMR2H   = T2H_VAL ;
   TMR2RLL = T2L_VAL ;
   TMR2RLH = T2H_VAL ;                   
   ET2     = 1;                           // enable Timer2 interrupts
   TR2     = 1;                           // start Timer2
}

//-----------------------------------------------------------------------------
// Timer3_Init
//-----------------------------------------------------------------------------
void Timer3_Init ()
{
   TMR3CN  = 0x00;                        // Stop Timer3; Clear TF3;
                                         
   TMR3L   = T3L_VAL ;                   
   TMR3H   = T3H_VAL ;
   TMR3RLL = T3L_VAL ;
   TMR3RLH = T3H_VAL ;                   
   EIE1   |= 0x80;                        // enable Timer3 interrupts
   TMR3CN  = 0x04;                        // start Timer3
}

//-----------------------------------------------------------------------------
// da_adjust
//-----------------------------------------------------------------------------
unsigned char da_adjust(unsigned char da)
{ 
	unsigned char hig,low; 
	hig=(da&0xf0)>>4;
	low=da&0x0f;
	if(low>9) da+=0x06;
	if(hig>9)  da+=0x60;
	return (da);
  
}

//-----------------------------------------------------------------------------
// Interrupt Service Routines
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
// Timer2_ISR
//-----------------------------------------------------------------------------
// This routine changes the state of the LED whenever Timer2 overflows.
void Timer2_ISR (void) interrupt 5
{
	TF2H = 0;                              // clear Timer2 interrupt flag
   P1 |= 0xfc;
   P2=seg[disbuf[dd]];
   P1&=un_dig[dd];
   if(dd==5) dd=0;
   else     dd++;
 	tmr2_done = 1;
}

//-----------------------------------------------------------------------------
// Timer3_ISR
//-----------------------------------------------------------------------------
// This routine changes the state of the Ring whenever Timer3 overflows.
void Timer3_ISR (void) interrupt 14
{
   TMR3CN &= 0x7F;
 if(second_all!=0) second_all--;
   else{second_all=50;
        RING=0;
		GREEN_LED=~GREEN_LED;
		RED_LED=~RED_LED;
        if(second<0x59) {second++;second=da_adjust(second);ring_tmr=5;}
		else{second=0;
		     if(minute<0x59) {minute++;minute=da_adjust(minute);ring_tmr=25;}
			 else {minute=0;ring_tmr=50;
			       if(hour<0x23) {hour++;hour=da_adjust(hour);}
				   else hour=0;
				   }
            }
        disbuf[0]=(hour&0xf0)>>4;
		disbuf[1]=hour&0x0f;
		disbuf[2]=(minute&0xf0)>>4;
		disbuf[3]=minute&0x0f;
		disbuf[4]=(second&0xf0)>>4;
		disbuf[5]=second&0x0f;
		}
	if(ring_tmr!=0)
	{
		ring_tmr--;
		if(ring_tmr==0) RING=1;
     }
   tmr3_done = 0; 
}

⌨️ 快捷键说明

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