📄 main.c
字号:
//功能:利用定时器数码管的显示值从0000显示到9999
#include "msp430x14x.h"
#define SHUMA_PORT_DIR P5DIR//数码管数据口
#define SHUMA_PORT_OUT P5OUT
#define SHUMA_1_LOW P6OUT&=~BIT6//开数码管的第一位P6.6口控制数码管的第一位
#define SHUMA_1_HIGH P6OUT|=BIT6//灭第一位数码管
#define SHUMA_2_LOW P6OUT&=~BIT5//开数码管的第二位
#define SHUMA_2_HIGH P6OUT|=BIT5//灭数码管的第二位
#define SHUMA_3_LOW P6OUT&=~BIT4//开数码管的第三位
#define SHUMA_3_HIGH P6OUT|=BIT4//灭数码管的第三位
#define SHUMA_4_LOW P6OUT&=~BIT0//开数码管的第四位
#define SHUMA_4_HIGH P6OUT|=BIT0//灭数码管的第四位
static unsigned char flag=0;
void int_clk();//时钟初始化子程序声明
void int_timer();//定时器初始化程序声明
void delay_352us(unsigned int i);//352us延时程序声明
const unsigned char tabl1[11]={0xa0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xba,0X20,0x38,0xff};
// ;0 ,1 ,2 ,3 , 4, 5, 6 ,7 ,8 ,9 ,灭}
//定时初始化
void int_timer()
{
TACTL|=TASSEL1+TACLR+ID0+ID1+MC0+TAIE;//选择SMLK的8分频作为定时器的时钟,定时器为增加模式,并且使能中断
TACCR0=9999;//定时器计数值为9999+1,即定时10ms
}
//******************************************
//子程序名:int_clk()
//功能: 时钟初始化子程序
void int_clk()
{
unsigned char i;//定义局部变量i
BCSCTL1&=~XT2OFF;//打开高频晶体震荡器
BCSCTL2|=SELM1+SELS;//MCLK和SMCLK的时钟源都选择XT2CLK,即都是8MHZ
do//(至少执行一次DO循环)
{
IFG1&=~OFIFG;//清除晶体震荡出错标志位
for(i=0;i<100;i++)
_NOP();//简单的延时等待
}while((IFG1&OFIFG));//判断晶体震荡是否出错,如果还是出错,则继续执行DO循环
IFG1&=~OFIFG;
}
//IO口初始化子程序
void int_shuma_io()
{
SHUMA_PORT_DIR|=0XFF;//set P5 is out 设置控制数码管数据口的IO口为输出模式
P6DIR|=BIT0+BIT4+BIT5+BIT6;
P3DIR|=BIT0;//P3.0控制74HC573的OE,把这个口设置为输出
P3OUT&=~BIT0;//使能74573,使得74573的输出随输入变化
}
//******************************************************
//352微秒延时程序
void delay_352us(unsigned int i)//352us延时程序,延时时间的计算在前面已经讲过
{
unsigned char j;
while(i--)
{
for(j=0;j<255;j++)
{
_NOP();
_NOP();
_NOP();
_NOP();
}
}
}
//*************************************
# pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A(void)
{
switch(TAIV)
{
case 2:break;//捕获比较器1中断
case 4:break;//捕获比较器2中断
case 10:flag=1;break;//定时器溢出中断,置用户中断标志为1
}
}
int main( void )
{
unsigned char DISPLAY1,DISPLAY2,DISPLAY3,DISPLAY4;
unsigned char time=0x0;
unsigned char display=0x00;
WDTCTL = WDTPW + WDTHOLD;// Stop watchdog timer to prevent time out reset
int_clk();//初始化时钟
int_shuma_io();//初始化数码管控制口
int_timer();//定时器初始化
_EINT();//开中断
while(1)
{
while(flag)//判断定时器是否溢出
{
flag=0;//复位用户定时器中断标志
time++;//溢出次数累积
if(time==100)//判断是否溢出100次,即1s
{
display++;//显示值加一
time=0;//定时器溢出次数计数值清零
}
}
DISPLAY1=display/1000%10;//求取显示值的千位数据的BCD码
DISPLAY2=display/100%10;//求取显示值的百位的数据的BCD码
DISPLAY3=display/10%10;//求取显示值的十位数据的BCD码
DISPLAY4=display%10;//求取显示值的个位的数据的BCD码
//以下是数码管的动态扫描程序
SHUMA_PORT_OUT=tabl1[DISPLAY1];//求取BCD码对应的数码管段码,并送到控制数码管的数据扣
SHUMA_1_LOW;//开第一位数码管
delay_352us(10);//简单延时
SHUMA_1_HIGH;//灭第一位数码管
SHUMA_PORT_OUT=tabl1[DISPLAY2];//送数码管第二位显示的段码
SHUMA_2_LOW;//开显示第二位数码管
delay_352us(10);//延时
SHUMA_2_HIGH;//灭第二位数码管,接下去重复1二
SHUMA_PORT_OUT=tabl1[DISPLAY3];
SHUMA_3_LOW;
delay_352us(10);
SHUMA_3_HIGH;
SHUMA_PORT_OUT=tabl1[DISPLAY4];
SHUMA_4_LOW;
delay_352us(10);
SHUMA_4_HIGH;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -