msp430 MINI时钟

[复制链接]
509|1
 楼主| dirtwillfly 发表于 2018-4-23 10:51 | 显示全部楼层 |阅读模式

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| dirtwillfly 发表于 2018-4-23 10:51 | 显示全部楼层
  1. /**********************************
  2. ***********************************
  3. 编译环境:IAR for MSP430
  4.     ***项目名称:MINI时钟***
  5. ***芯片型号:   MSP430G2553
  6. ***参数:
  7. **数码管:      四段共阳数码管 型号:LG2841BH(可采用74HC595驱动)
  8. *数据口:       a~dp---P1.0~P1.7
  9. *数码管段选:   DB1~DB4---P2.0~P2.3(低电平有效)
  10. ***按键 :    (按下为低电平)K1--P2.4;K2--P2.5;
  11. **********************************
  12. **********************************/
  13. #include"in430.h"
  14. #include "msp430g2553.h"
  15. #define uint unsigned int
  16. #define uchar unsigned char
  17. uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数码管0~9显示数组
  18. uchar  SW=0,ss=0,as=0,bs=0,cs=0,dp=0,ac=0;//定义全局变量
  19. /**********数码管显示函数***********/
  20. void xianshi(uchar shi,uchar fen)
  21. {
  22.    P1OUT=0x00;P2OUT&=0xF0;//数码管清零
  23.    uchar s1=0,s2=0,s3=0,s4=0;//定义局部变量
  24.    s1=shi/10;s2=shi%10;s3=fen/10;s4=fen%10;//数位分解
  25.    
  26.    P2OUT&=~BIT0;P2OUT|=BIT1;P2OUT|=BIT2;P2OUT|=BIT3;
  27.             P1OUT=table[s1];
  28.    __delay_cycles(1000);
  29.    
  30.    P2OUT|=BIT0;P2OUT&=~BIT1;P2OUT|=BIT2;P2OUT|=BIT3;
  31.            switch(dp)//小数点显示选择
  32.                      {
  33.                         case 1:P1OUT=(table[s2]&0x7F);break;
  34.                         case 0:P1OUT=table[s2];break;
  35.                         default:break;
  36.                      }
  37.    __delay_cycles(1000);
  38.    
  39.    P2OUT|=BIT0;P2OUT|=BIT1;P2OUT&=~BIT2;P2OUT|=BIT3;
  40.           P1OUT=table[s3];
  41.    __delay_cycles(1000);
  42.    
  43.    P2OUT|=BIT0;P2OUT|=BIT1;P2OUT|=BIT2;P2OUT&=~BIT3;
  44.            P1OUT=table[s4];
  45.    __delay_cycles(1000);
  46. }
  47. /************P2.5输入判断函数******************/
  48. void IO_INIT()
  49. {
  50.   if((P2IN&0x20)==0)
  51.   {
  52.     __delay_cycles(2);
  53.     if((P2IN&0x20)==0)
  54.     {
  55.        SW++;
  56.        if(SW==3)
  57.        {SW=0;}
  58.     }
  59.   }
  60.   while((P2IN&0x20)==0);
  61. }
  62. void IO_INIT2()
  63. {
  64.   if((P2IN&0x10)==0)
  65.     {
  66.       __delay_cycles(2);
  67.       if((P2IN&0x10)==0)
  68.           {
  69.               ac^=1;
  70.           }
  71.     }
  72.   while((P2IN&0x10)==0);
  73. }
  74. /*********IO口初始化函数********/
  75. void SZ_INIT()
  76. {
  77.      P1DIR|=0xFF;//配置P1口为输出
  78.      P1OUT|=0xff;//P1口赋初值,输出0xFF
  79.      P2DIR|=0x0F;//配置P2.0、P2.1、P2.2、P2.3为输出
  80.      P2DIR&=0xCF;//配置P2.4、P2.5为输入  
  81. }
  82. /****************时钟调试函数**********************/
  83. void xuanze()
  84. {
  85.    switch(SW)
  86.      {
  87.          case 0: break;
  88.          case 1: while(SW==1)
  89.                 {
  90.                   _DINT();
  91.                   if((P2IN&0x10)==0)
  92.                     {
  93.                       __delay_cycles(2);
  94.                       if((P2IN&0x10)==0)
  95.                           {
  96.                              bs++;
  97.                              if(bs==60)
  98.                                {
  99.                                   bs=0;
  100.                                }
  101.                           }
  102.                     }
  103.                   while((P2IN&0x10)==0);
  104.                   xianshi(as,bs);
  105.                   IO_INIT();
  106.                  }
  107.                  break;
  108.          case 2:while(SW==2)
  109.                 {
  110.                    _DINT();
  111.                   if((P2IN&0x10)==0)
  112.                     {
  113.                       __delay_cycles(2);
  114.                       if((P2IN&0x10)==0)
  115.                       {
  116.                          as++;
  117.                          dp=0;
  118.                          if(as==24)
  119.                            {
  120.                               as=0;
  121.                            }   
  122.                       }
  123.                     }
  124.                   while((P2IN&0x10)==0);
  125.                   xianshi(as,bs);
  126.                   IO_INIT();
  127.                  }
  128.                  break;
  129.              default:break;     
  130.      }
  131. }
  132. /*****************定时器配置函数 ****************/
  133. void dingshiqi()
  134. {
  135.   TA0CCTL0 = CCIE;     //打开中断 (Timer0_A3 Capture/Compare Control 0 )
  136.   TA0CCR0 = 10080;      //设定计数变量
  137.   TA0CTL = TASSEL_2 + MC_3; //定时器选择时钟SMCLK,使用模式二连续计数方式  
  138.   _EINT();       //开总中断
  139. }
  140. /****************定时器中断函数*****************/

  141. #pragma vector = TIMER0_A0_VECTOR
  142. __interrupt void time1(void)
  143. {
  144.    
  145.     ss++;
  146.     if(ss==25)
  147.     {
  148.        dp^=1;
  149.     }
  150.     if(ss==50)
  151.     {
  152.        dp^=1;
  153.       cs++;
  154.       ss=0;
  155.     }
  156.     if(cs==60)
  157.     {bs++;cs=0;}
  158.     if(bs==60)
  159.     {as++;bs=0;
  160.      if(as==24)
  161.      {as=0;}}
  162. }
  163. /***********************主函数*******************/
  164. void main( void )
  165. {
  166.   WDTCTL = WDTPW + WDTHOLD;    // 关闭看门狗
  167.   SZ_INIT();
  168.   dingshiqi();
  169.   IO_INIT();
  170.   _EINT();       //开总中断
  171.   while(1)
  172.   {  
  173.      IO_INIT();
  174.      IO_INIT2();
  175.      xuanze();
  176.      _EINT();
  177.      if(ac==1)
  178.      {  
  179.         xianshi(as,bs);
  180.      }
  181.      else if(ac==0)
  182.      {
  183.         P2OUT|=0x0f;
  184.      }
  185.   }
  186. }



您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

1199

主题

35121

帖子

1122

粉丝
快速回复 在线客服 返回列表 返回顶部