我检查了程序,并没有用到什么特殊的寄存器。注:SMALL模式 /*************************************************
PLL初始化
*************************************************/ void PLL_init(void) { CLKSEL_PLLSEL=0; // 选用外部晶振作为系统时钟 PLLCTL_PLLON=0; // 锁相环电路禁止 SYNR=19; // 设置倍频系数,Fpllclk=2*4M*(19+1)/(1+1)=80M,所以总线频率为40M REFDV=1; PLLCTL_PLLON=1; // 锁相环电路使能 while(!CRGFLG_LOCK); CLKSEL_PLLSEL=1; // 选用锁相环电路作为系统时钟 }
/*************************************************
CPU硬件部分初始化
*************************************************/ void periph_init(void) { DDRB_DDRB0 = 0; // Port B[0..3] input (SW3 1-4) DDRB_DDRB1 = 0; DDRB_DDRB2 = 0; DDRB_DDRB3 = 0; DDRB_DDRB4 = 1; // Port B[4..7] output (LED1-LED4) DDRB_DDRB5 = 1; DDRB_DDRB6 = 1; DDRB_DDRB7 = 1;
LED1 = OFF; // 将LED全部关闭 LED2 = OFF; LED3 = OFF; LED4 = OFF;
DDRP_DDRP0 = 0; // Port BP_0 and BP_1 equals input DDRP_DDRP1 = 0; // SW1 and SW2
PUCR_PUPBE = 1; // Turn on the pullups for SW3 (1-4)
DDRJ_DDRJ7=0; // PJ7定义为输入 PPSJ_PPSJ7=0; // 下降沿触发中断 PIEJ_PIEJ7=1; // PJ7中断使能 } /*************************************************
定时器初始化程序
*************************************************/ void Timer_init(void) { TSCR1_TEN=0; // 禁止定时器 TSCR1_TFFCA=1; // 快速清除标志位 TSCR2_TOI=1; // TOF置1时申请硬件中断 TSCR2_PR=3; // 预分频系数为8 //TSCR2_PR1=1; //TSCR2_PR0=1; TCNT=0x1000; // 设置定时计数器初值 TSCR1_TEN=1; // 使能定时器 } /************************************************* 定时器溢出中断程序
*************************************************/ #pragma CODE_SEG NON_BANKED interrupt void TimerOverflow_ISR(void) { DisableInterrupts; TFLG2_TOF=1; // 写1清标志位 TCNT=0x1000; // 重新载入定时计数器初值 LED4=~LED4; EnableInterrupts; } #pragma CODE_SEG DEFAULT void main(void) { uint intTempData; uchar charTempData; PLL_init(); periph_init(); Timer_init(); EnableInterrupts; // 全局中断使能 for(;;) {
} }
[此贴子已经被作者于2008-9-10 11:33:56编辑过] |