#include /* common defines and macros */ #include /* derivative information */ #pragma LINK_INFO DERIVATIVE "mc9s12xdp512" void MCUInit(void) { SYNR = 0x02; //时钟合成寄存器 REFDV = 0x01; //时钟分频寄存器 //锁相环产生的时钟频率f=2*foscclk*(SYNR+1)/(REFDV+1) //对于S12dg128 16MHz外部晶体振荡器,总线时钟为24MHz //片内系统时钟为48MHz /*等待锁相环频率锁定*/ while((CRGFLG & 0x08) !=0x08); CLKSEL |= 0x80; //时钟选择寄存器 } void SCIInit(void) { unsigned char t; SCI0BDL = 0x9c; SCI0BDH = 0x00; SCI0CR1 = 0x00; t=SCI0DRL; t=SCI0SR1; SCI0CR2 = 0x2C; SCI1BDL = 0x9c; SCI1BDH = 0x00; SCI1CR1 = 0x00; t=SCI1DRL; t=SCI1SR1; SCI1CR2 = 0x0C; } void put_char0(unsigned char c) { while ((SCI0SR1 & 0X80) == 0);//D7=1时说明要发送的数据已经移入移位寄存器 //可以发送新的数据 SCI0DRL=c; } void put_char(unsigned char c) { while ((SCI1SR1 & 0X80) == 0);//D7=1时说明要发送的数据已经移入移位寄存器 //可以发送新的数据 SCI1DRL=c; } void delay(){ unsigned int i; for(i=0;i<3000;i++); for(i=0;i<2000;i++); } void main(void) { MCUInit(); DDRB=0XFF; PORTB=0X00; SCIInit(); EnableInterrupts; for(;;) { put_char('A'); delay(); } } interrupt void SCI1_ISR(void){ unsigned char ch; asm sei if((SCI0SR1 & 0x20)) PORTB^=0XFF; ch=SCI0DRL; put_char0(ch); put_char0(' '); // PORTB=0x0F; //读数据寄存器 //输出完一个字符后跟着输出一个空格 asm cli }