📄 xf.c
字号:
#include "C5402DEF.h"
#define PLLMUL_10 0x9
#define PLLMUL_5 0x4
#define period 7999
int flag;
void delay(int n)
{
int i,j;
for(i=0;i<n;i++)
for(j=0;j<100;j++);
}
/******************************************************************************
*CLKMD寄存器中的PLLMUL、PLLDIV、PLLCOUNT和PLLON/OFF位只有在DIV模式下才能修改。*
*具体步骤:1、将PLLDIV位置0,转换到DIV模式。 *
* 2、查询PLLSTATUS位,直到PLLSTATUS=0,表明模式转换完成 *
* 3、设置PLLMUL和PLLDIV位,选择期望的乘法系数 *
* 4、设置PLLCOUNT位,选择合适的延迟时间 *
* 5、将PLLDIV位置1,转换到PLL模式 *
******************************************************************************/
void PLL_init(int mul)
{
SREG->CLKMD=0x0000;
while(SREG->CLKMD&(1<<CLKMD_PLLSTATUS));
SREG->CLKMD=(mul<<CLKMD_PLLMUL)|(0x7D<<CLKMD_PLLCOUNT)&(~(1<<CLKMD_PLLDIV))|(1<<CLKMD_PLLONOFF)|(1<<CLKMD_PLLNDIV);
//SREG->CLKMD=0x93EF;
}
void timer0_init(void)
{
Disable();
SREG->PMST&=0x007f;//用0x0001加载IPTR,中断向量移到0x0080开始的程序存储器空间
SREG->PMST|=0x0080;
TIMER0->TCR|=(1<<TCR_TSS);//停止计数
TIMER0->TCR|=(9<<TCR_TDDR);//T=Tc*(PRD+1)*(TDDR+1)
TIMER0->PRD=period;
TIMER0->TCR|=(1<<TCR_TRB);//装载PRD及TDDR
TIMER0->TCR&=~(1<<TCR_TSS);//开始计数
SREG->IFR|=(1<<IFR_TINT0);//清除已经中断标志
SREG->IMR|=(1<<IMR_TINT0);//开定时器中断
Enable();//开全局中断
}
void main(void)
{
PLL_init(PLLMUL_10);
timer0_init();
for(;;)
{
if(flag)
//delay(10000);
asm(" SSBX XF");
else
//delay(10000);
asm(" RSBX XF");
}
}
interrupt void time0_isr(void)
{
flag=!flag;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -