msp430 MINI时钟

[复制链接]
399|1
手机看帖
扫描二维码
随时随地手机跟帖
dirtwillfly|  楼主 | 2018-4-23 10:51 | 显示全部楼层
/**********************************
***********************************
编译环境: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;
     }
  }
}



使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:欢迎进入TI MCU论坛      21ic TI技术交流1群:61549143(已满),  21ic TI技术交流2群:311421422 我的博客:http://blog.timcu.com/

1179

主题

34647

帖子

1115

粉丝