/**********************************
***********************************
编译环境:IAR for MSP430
***项目名称:MINI时钟***
***芯片型号: MSP430G2553
***参数:
**数码管: 四段共阳数码管 型号:LG2841BH(可采用74HC595驱动)
*数据口: a~dp---P1.0~P1.7
*数码管段选: DB1~DB4---P2.0~P2.3(低电平有效)
***按键 : (按下为低电平)K1--P2.4;K2--P2.5;
**********************************
**********************************/
#include"in430.h"
#include "msp430g2553.h"
#define uint unsigned int
#define uchar unsigned char
uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数码管0~9显示数组
uchar SW=0,ss=0,as=0,bs=0,cs=0,dp=0,ac=0;//定义全局变量
/**********数码管显示函数***********/
void xianshi(uchar shi,uchar fen)
{
P1OUT=0x00;P2OUT&=0xF0;//数码管清零
uchar s1=0,s2=0,s3=0,s4=0;//定义局部变量
s1=shi/10;s2=shi%10;s3=fen/10;s4=fen%10;//数位分解
P2OUT&=~BIT0;P2OUT|=BIT1;P2OUT|=BIT2;P2OUT|=BIT3;
P1OUT=table[s1];
__delay_cycles(1000);
P2OUT|=BIT0;P2OUT&=~BIT1;P2OUT|=BIT2;P2OUT|=BIT3;
switch(dp)//小数点显示选择
{
case 1:P1OUT=(table[s2]&0x7F);break;
case 0:P1OUT=table[s2];break;
default:break;
}
__delay_cycles(1000);
P2OUT|=BIT0;P2OUT|=BIT1;P2OUT&=~BIT2;P2OUT|=BIT3;
P1OUT=table[s3];
__delay_cycles(1000);
P2OUT|=BIT0;P2OUT|=BIT1;P2OUT|=BIT2;P2OUT&=~BIT3;
P1OUT=table[s4];
__delay_cycles(1000);
}
/************P2.5输入判断函数******************/
void IO_INIT()
{
if((P2IN&0x20)==0)
{
__delay_cycles(2);
if((P2IN&0x20)==0)
{
SW++;
if(SW==3)
{SW=0;}
}
}
while((P2IN&0x20)==0);
}
void IO_INIT2()
{
if((P2IN&0x10)==0)
{
__delay_cycles(2);
if((P2IN&0x10)==0)
{
ac^=1;
}
}
while((P2IN&0x10)==0);
}
/*********IO口初始化函数********/
void SZ_INIT()
{
P1DIR|=0xFF;//配置P1口为输出
P1OUT|=0xff;//P1口赋初值,输出0xFF
P2DIR|=0x0F;//配置P2.0、P2.1、P2.2、P2.3为输出
P2DIR&=0xCF;//配置P2.4、P2.5为输入
}
/****************时钟调试函数**********************/
void xuanze()
{
switch(SW)
{
case 0: break;
case 1: while(SW==1)
{
_DINT();
if((P2IN&0x10)==0)
{
__delay_cycles(2);
if((P2IN&0x10)==0)
{
bs++;
if(bs==60)
{
bs=0;
}
}
}
while((P2IN&0x10)==0);
xianshi(as,bs);
IO_INIT();
}
break;
case 2:while(SW==2)
{
_DINT();
if((P2IN&0x10)==0)
{
__delay_cycles(2);
if((P2IN&0x10)==0)
{
as++;
dp=0;
if(as==24)
{
as=0;
}
}
}
while((P2IN&0x10)==0);
xianshi(as,bs);
IO_INIT();
}
break;
default:break;
}
}
/*****************定时器配置函数 ****************/
void dingshiqi()
{
TA0CCTL0 = CCIE; //打开中断 (Timer0_A3 Capture/Compare Control 0 )
TA0CCR0 = 10080; //设定计数变量
TA0CTL = TASSEL_2 + MC_3; //定时器选择时钟SMCLK,使用模式二连续计数方式
_EINT(); //开总中断
}
/****************定时器中断函数*****************/
#pragma vector = TIMER0_A0_VECTOR
__interrupt void time1(void)
{
ss++;
if(ss==25)
{
dp^=1;
}
if(ss==50)
{
dp^=1;
cs++;
ss=0;
}
if(cs==60)
{bs++;cs=0;}
if(bs==60)
{as++;bs=0;
if(as==24)
{as=0;}}
}
/***********************主函数*******************/
void main( void )
{
WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗
SZ_INIT();
dingshiqi();
IO_INIT();
_EINT(); //开总中断
while(1)
{
IO_INIT();
IO_INIT2();
xuanze();
_EINT();
if(ac==1)
{
xianshi(as,bs);
}
else if(ac==0)
{
P2OUT|=0x0f;
}
}
}
|