This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

MSP430F2274: How to program a 4 digit 7 segment display?

Hi all, i'm really new here in this forum.

I would like to ask if anyone knows how to program a 4 digit 7 segment display using the above mentioned microcontroller.

I'm really stuck on this one.

Thanks for any help given in advance.

Cheers

  • This is the working code:

    //Include section - Add all #includes here
    #include  <msp430x14x.h>
    //#include "RTC.h"

    //Defines section -  Add all #defines here
    #define num_0  0x77  //0b 0111 0111     0x88  //0b 1000 1000    
    #define num_1  0x14  //0b 0001 0100     0xEB  //0b 1110 1011    
    #define num_2  0x5B  //0b 0101 10110    xA4  //0b 1010 0100    
    #define num_3  0x5E  //0b 0101  1110    xA1  //0b 1010 0001    
    #define num_4  0x3C  //0b 0011 11000    xC3  //0b 1100 0011    
    #define num_5  0x6E  //0b 0110 11100    x91  //0b 1001 0001    
    #define num_6  0x6F  //0b 0110 11110    x90  //0b 1001 0000    
    #define num_7  0x54  //0b 0101 01000    xAB  //0b 1010 1011    
    #define num_8  0x7F  //0b 0111 1111     0x80  //0b 1000 0000    
    #define num_9  0x7E  //0b 0111 1110     0x81  //0b 1000 0001    

    #define DP     0x80   //P2.7
    #define Dig_1  0x01   //P3.0
    #define Dig_2  0x02   //P3.1
    #define Dig_3  0x04   //P3.2
    #define Dig_4  0x08   //P3.3
    #define LED1   BIT0   //P5.0
    #define LED2   BIT1   //P5.1
    #define IR_PIN BIT4   //P1.4

    //  Variables section
    static unsigned char Arr_min_units[] =
      {
         num_0, num_1, num_2, num_3, num_4, num_5, num_6, num_7, num_8, num_9   //*0...*9
                               
      };

    static unsigned char Arr_hour_units[] =
      {
         num_0, num_1, num_2, num_3, num_4, num_5, num_6, num_7, num_8, num_9   //*0...*9
                               
      };

    //clock variables
    volatile unsigned char j;
    volatile unsigned char TI_second = 0;
    volatile unsigned char TI_minute = 0;
    volatile unsigned char TI_hour = 0;
    volatile unsigned int LoopCtr1;
    volatile unsigned char dig_num = 0; 

    void main( void )
    {
     
      //initialization
      WDTCTL = WDTPW + WDTHOLD;     // Stop watchdog timer
     
       //----mcu clock settings------------------------------------------------------
      DCOCTL=0x00;
      //BCSCTL2=0xC0;            //MCLK source = LFXT1CLK
      //BCSCTL1=0xC0;
      BCSCTL1 = XT2OFF + XTS + DIVA_0; //DIVA_3 - f/8
      do
        {
     //Try to clear "oscillator fault" flag
     IFG1 &= ~OFIFG;
        }
     // if "oscillator fault" flag is clear break loop
      while ((IFG1 & OFIFG));
     
      BCSCTL2 = SELM_3 | SELS | DIVS_3;
     
     
      //----Ports settings----------------------------------------------------------
      P1OUT = 0x00;
      P2OUT = 0x00;
      P3OUT = 0x00;
      P4OUT = 0x00;
      P5OUT = 0x00;
      P6OUT = 0x00;
      P1DIR |= 0x0C;
      P2DIR |= 0xFF;   // Set P2 to output direction
      P3DIR |= 0xFF;   // Set P3 to output direction
      P4DIR |= 0x60;
      P5DIR |= 0x03;  //P5.0, P5.1 - OUTPUTS
      P6DIR |= 0x00;
     
      //----TimerA settings---------------------------------------------------------
      //TACTL |= TACLR;   //clear timerA
      TACTL = TASSEL_1 + ID_3 + MC_2 + TAIE;//MC_1 //+ TAIE   // TimerA = ACLK!!!, 1:8, upmode,int en                              

      TACCTL1 |= CCIE;    // CCR1 interrupt enabled
      TACCR1 = 50000;     //50000 * 1uS = 50000uS = 50mS
     
      TACCTL2 |= CCIE;    // CCR1 interrupt enabled
      TACCR2 = 5000;     //5000 * 1uS = 5mS
     
    //---Interrupts settings--------------------------------------------------------
      _EINT();
    //---Variables settings---------------------------------------------------------  
     dig_num = 0;

      while(1)
      {
         //do something     
           
       }  // while
    }   //main

     #pragma vector=TIMERA1_VECTOR  __interrupt void Timer_A (void)
    {
      switch( TAIV )
      {
         case  2:     // CCR1
           {
             //TACCTL1 &= ~CCIFG;    
              Get_time();
              CCR1 += 50000;    // Add Offset to CCR1
           }
            break;                        
         case  4:    // CCR2
           {
             //TACCTL2 &= ~CCIFG;
             Display_time();
             CCR2 += 5000;
           }
            break;
           
         //case 10: P1OUT ^= 0x01;  // overflow
               // break;
      }
     
     
     }
      //TACCTL0 &= ~CCIFG;
      //TACTL &= ~TAIFG; 

     

    void Get_time(void)
    {
       j++;
      if (j==20)   //50mS * 20 = 1sec.
        {
          j=0;
         // P2OUT ^= DP;
          TI_second++;
          flags.flag_dp = 1;
          if (TI_second==60)
            {
              TI_second = 0;
              TI_minute++;
                 
              if (TI_minute==60)
               {
                 TI_minute = 0;
                 TI_hour++;
                               
                if (TI_hour==24)
                  {
                    TI_hour = 0;
                  }
               }
            } 
        } 
    }


    void Display_time(void)

    {
      switch( dig_num )
      {
        case 0:
          {
            P2OUT = Arr_min_units[TI_minute%10];    //load first digit for minutes
           // P3OUT &= 0xF1;
            P3OUT &= ~BIT1;  //clear P3.1 - dig#1
            P3OUT &= ~BIT2;  //clear P3.2 - dig#2
            P3OUT &= ~BIT3;  //clear P3.3 - dig#3
            P3OUT |= BIT0;   //set P3.0 - dig#0
           dig_num = 1;
          }
          break;
     
       case 1:
         {
           P2OUT = Arr_min_units[TI_minute/10];    //load second digit for minutes
           //P3OUT &= 0xF2;
           P3OUT &= ~BIT0;  //clear P3.0 - dig#0
           P3OUT &= ~BIT2;  //clear P3.2 - dig#2
           P3OUT &= ~BIT3;  //clear P3.3 - dig#3
           P3OUT |= BIT1;   //set P3.1 - dig#1
           dig_num = 2;
         }
         break;
     
      case 2:
        {
          P2OUT = Arr_hour_units[TI_hour%10];    //load first digit for hours
          //P3OUT &= 0xF4;
          P3OUT &= ~BIT0;  //clear P3.0 - dig#0
          P3OUT &= ~BIT1;  //clear P3.1 - dig#1
          P3OUT &= ~BIT3;  //clear P3.3 - dig#3
          P3OUT |= BIT2;   //set P3.2 - dig#2
          if(flags.flag_dp)
          {
            flags.flag_dp = 0;
            P2OUT ^= DP; 
            //P5OUT ^= BIT0;
          }
          dig_num = 3;
        }
        break;
     
      case 3:
        {
          P2OUT = Arr_hour_units[TI_hour/10];    //load second digit for hours
          //P3OUT &= 0xF8;
          P3OUT &= ~BIT0;  //clear P3.0 - dig#0
          P3OUT &= ~BIT1;  //clear P3.1 - dig#1
          P3OUT &= ~BIT2;  //clear P3.2 - dig#2
          P3OUT |= BIT3;   //set P3.3 - dig#3
          dig_num = 0;
        }
        break;
      }
    }

     

     

**Attention** This is a public forum