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 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.
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