- #include "msp430x14x.h"
- #define uchar unsigned char
- #define uint unsigned int
- uchar num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
- uchar wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
- uchar n=0,i=0;
- void main( void )
- {
- uint a;
- // Stop watchdog timer to prevent time out reset
- WDTCTL = WDTPW + WDTHOLD;
- //IE1|=WDTIE;
- //WDTCTL=WDT_ADLY_1_9;
- P4DIR=0xff;
- P6DIR|=0x18;
- P4OUT=0x00;
-
- /*
- BCSCTL1&=~XT2OFF; //设置XT2CLK有效
- do
- {
- IFG1&=~OFIFG; //清除失效标志
- for(a=0xff;a>0;a--);//稳定时间
- }
- while((IFG1&OFIFG)!=0); //如果失效标志仍存在则继续循环清除 */
- BCSCTL2|=SELS; // 选择XT2CLK为SMCLK的时钟源
-
-
- CCTL0=CCIE; //CCR0中断允许
- CCR0=20000;
- TACTL=TASSEL_2+TACLR+MC_1;//定时器A时钟源为SMCLK,计数器清零,增计数模式
- _EINT();
- }
- #pragma vector=TIMERA0_VECTOR
- __interrupt void timer_A(void)
- {
- P6OUT=0x08;
- P4OUT=0x00;
- P4OUT=wei[i++];
- P6OUT=0x10;
- P4OUT=num[n++];
- P6OUT=0x00;
- if(i==8)i=0;
- if(n==8)n=0;
- }
上面的代码运行正常!有疑问的地方是:
比如上面的程序中选择子系统时钟源SMCLK为XT2,使用之前要打开XT2,XT2才进入工作状态
代码如下:
BCSCTL1&=~XT2OFF; //设置XT2CLK有效
do
{
IFG1&=~OFIFG; //清除失效标志
for(a=0xff;a>0;a--);//稳定时间
}
while((IFG1&OFIFG)!=0); //如果失效标志仍存在则继续循环清除 */
我在程序中屏蔽掉了这一段;但是程序依旧如开始一样运行良好
也就是说没打开XT2 ,子系统时钟会默认选择DCO 800KHZ 运行程序
按照这个时钟源频率 数码管刷新现象会变得很明显(即目视能看清数码管是一个一个动态刷新的,已验证),
可是数码管的刷新还是和原来没屏蔽这段的现象一样,如果屏蔽下面的一句代码
BCSCTL2|=SELS; // 选择XT2CLK为SMCLK的时钟源
就会出现目视能看清数码管是一个一个动态刷新的现象
查了下资料 为了方便下面是时钟模块的截图
C:\Documents and Settings\Administrator\桌面
即控制XT2是否输出的是一个三态门 只有在三态门的使能端EN = 1(相当于XT2OFF = 0) 时输出才随输入变化,
即当XT2OFF = 1时(相当于EN = 0)为第三种状态高阻态(既不是高电平也不是低电平)
可是上面的程序中明明屏蔽掉了打开XT2部分的代码,只是SMCLK选择了XT2做为时钟源 可是实验测试证明SMCLK工作的时钟源
不是默认的时钟源DCO而是XT2。
这是为什么呢???