📄 c_isr.#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 + -