#include "msp430G2553.h" #include "math.h" #define Clear 0x00 #define D3 BIT7 #define D4 BIT2 #define D5 BIT3 #define D6 BIT4 #define D7 BIT5 #define RS BIT0 #define EN BIT1 long temp, IntDegC; int data,set,tenths,units,decimal1,decimal2,decimal3,decimal4,delay,select_function,result_adr,displaysign; float med1,med2,med3,med4,med5,med6,med7,med8,med9,med10,med11,med12,med13,med14,med15,med16,med17,med18,med19,med20; float sum,average,temp_val_c,temp_val; float convert_temp(float); void move_cursor_xy(int,int); void configure_lcd(int); void display_char(unsigned char); int delay_time(int); int delay_long(int); void main(void){ WDTCTL = WDTPW + WDTHOLD; // disable watch dog timer P1DIR = 0xE7; P2DIR = 0xFF; P3DIR = 0xF8; // 1111 1000 P1OUT = 0x00; P2OUT = 0x00; P3OUT = 0x00; select_function = 0x00; result_adr = 0x02; DCOCTL = CALDCO_16MHZ; // set internal oscillator at 16MHz BCSCTL1 = CALBC1_16MHZ; // set internal oscillator at 16MHz //--------------------config PWM P3SEL |= (BIT3); // P3.3 Select as TA1 output TA1CCR0 = 5000; TA1CCR2 = (2500); TA1CCTL2 |= OUTMOD_7; //toggle TA1CTL |= TASSEL_2 + MC_1 +ID_3; //smclk div/8 upmode. ADC10CTL1 |= CONSEQ1 + INCH_5; //continuous sample mode, CH5 ADC10CTL0 |= ADC10SHT_2 + ADC10ON + MSC; //sample and hold time, adc on, cont. sample ADC10AE0 |= 0x20; // select channel A5 ADC10CTL0 |= ADC10SC + ENC; // start conversions delay_time(delay); delay = 5000; configure_lcd(1); move_cursor_xy(1,1); display_char('T'); display_char('.'); display_char('i'); display_char('n'); display_char('t'); display_char(' '); display_char(' '); display_char(' '); display_char(' '); display_char(' '); display_char(' '); display_char(' '); display_char(' '); display_char(' '); display_char(0xDF); display_char('C'); move_cursor_xy(1,2); display_char('B'); display_char('y'); display_char(':'); display_char('M'); display_char('a'); display_char('r'); display_char('i'); display_char('u'); display_char('s'); display_char(' '); display_char('T'); display_char('a'); display_char('c'); display_char('i'); display_char('u'); display_char('c'); for(;;) { volatile unsigned int i; //-----------------------------------------------------selectare functie si canal conversie if ( P1IN >= 0x05 ){ if (( P1IN == 0x08) && ( select_function > 0x01 )){ select_function = select_function - 1; delay_time(delay); move_cursor_xy(16,2); display_char(select_function + 0x30); } if (( P1IN == 0x10 ) && ( select_function < 0x02 )){ select_function = select_function + 1; delay_time(delay); // move_cursor_xy(16,2); // display_char(select_function + 0x30); } if ( select_function == 0x01 ){ ADC10CTL0 &= ~(ADC10SC + ENC); // stop conversions ADC10AE0 = 0x00; // deselect any channel ADC10CTL0 &= ~(ADC10SHT_2 + ADC10ON + MSC); // disable sample and hold time, adc on, cont. sample ADC10CTL1 &= ~(CONSEQ1 + INCH_0); //disable continuous sample mode, CH7 ADC10CTL1 &= ~INCH_5; ADC10CTL1 &= ~INCH_6; ADC10CTL1 &= ~INCH_7; delay_time(delay); ADC10CTL1 |= CONSEQ1 + INCH_5; //continuous sample mode, CH5 ADC10CTL0 |= ADC10SHT_2 + ADC10ON + MSC; //sample and hold time, adc on, cont. sample ADC10AE0 |= 0x20; // select channel A5 00001000 ADC10CTL0 |= ADC10SC + ENC; // start conversions move_cursor_xy(1,1); display_char('T'); display_char('.'); display_char('i'); display_char('n'); display_char('t'); display_char(' '); display_char(' '); display_char(' '); display_char(' '); display_char(' '); display_char(' '); display_char(' '); display_char(' '); display_char(' '); display_char(0xDF); display_char('C'); } if ( select_function == 0x02 ){ ADC10CTL0 &= ~(ADC10SC + ENC); // stop conversions ADC10AE0 = 0x00; // deselect any channel ADC10CTL0 &= ~(ADC10SHT_2 + ADC10ON + MSC); // disable sample and hold time, adc on, cont. sample ADC10CTL1 &= ~(CONSEQ1 + INCH_0); //disable continuous sample mode, CH7 ADC10CTL1 &= ~INCH_5; ADC10CTL1 &= ~INCH_6; ADC10CTL1 &= ~INCH_7; delay_time(delay); ADC10CTL1 |= CONSEQ1 + INCH_0; //continuous sample mode, CH0 ADC10CTL0 |= ADC10SHT_2 + ADC10ON + MSC; //sample and hold time, adc on, cont. sample ADC10AE0 |= 0x01; // select channel A0 ADC10CTL0 |= ADC10SC + ENC; // start conversions move_cursor_xy(1,1); display_char('T'); display_char('.'); display_char('e'); display_char('x'); display_char('t'); display_char(' '); display_char(' '); display_char(' '); display_char(' '); display_char(' '); display_char(' '); display_char(' '); display_char(' '); display_char(' '); display_char(0xDF); display_char('C'); } } IntDegC = ADC10MEM; temp_val_c = convert_temp (IntDegC); //-----------------------------------------------------medie aritmetica if (IntDegC > 0x00){ med1 = med2; med2 = med3; med3 = med4; med4 = med5; med5 = med6; med6 = med7; med7 = med8; med8 = med9; med9 = med10; med10 = med11; med11 = med12; med12 = med13; med13 = med14; med14 = med15; med15 = med16; med16 = med17; med17 = med18; med18 = med19; med19 = med20; med20 = temp_val_c; } sum = med1+med2+med3+med4+med5+med6+med7+med8+med9+med10+med11+med12+med13+med14+med15+med16+med17+med18+med19+med20; average = sum/20; temp_val = average; //----------------------------------------------------- Loop for div/mod Positive Values tenths = 0x00; units = 0x00; decimal1 = 0x00; decimal2 = 0x00; decimal3 = 0x00; decimal4 = 0x00; if ( temp_val >=0 ){ displaysign = 0; i = 27; do{ // div_/mod_ loop if ( temp_val >= 10 ){ temp_val = temp_val - 10; tenths = tenths + 1; } i--; }while (i != 0); i = 10; temp_val = temp_val*10; do{ // div_/mod_ loop if ( temp_val >= 10 ){ temp_val = temp_val - 10; units = units + 1; } i--; }while (i != 0); i = 10; temp_val = temp_val*10; do{ // div_/mod_ loop if ( temp_val >= 10 ){ temp_val = temp_val - 10; decimal1 = decimal1 + 1; } i--; }while (i != 0); i = 10; temp_val = temp_val*10; do{ // div_/mod_ loop if ( temp_val >= 10 ){ temp_val = temp_val - 10; decimal2 = decimal2 + 1; } i--; }while (i != 0); i = 10; temp_val = temp_val*10; do{ // div_/mod_ loop if ( temp_val >= 10 ){ temp_val = temp_val - 10; decimal3 = decimal3 + 1; } i--; }while (i != 0); i = 10; temp_val = temp_val*10; do{ // div_/mod_ loop if ( temp_val >= 10 ){ temp_val = temp_val - 10; decimal4 = decimal4 + 1; } i--; }while (i != 0); } //----------------------------------------------------- Loop for div/mod Negative Values if ( temp_val < 0 ){ displaysign = 1; i = 27; do{ // div_/mod_ loop if ( temp_val <= -10 ){ temp_val = temp_val + 10; tenths = tenths + 1; } i--; }while (i != 0); i = 10; temp_val = temp_val*10; do{ // div_/mod_ loop if ( temp_val <= -10 ){ temp_val = temp_val + 10; units = units + 1; } i--; }while (i != 0); i = 10; temp_val = temp_val*10; do{ // div_/mod_ loop if ( temp_val <= -10 ){ temp_val = temp_val + 10; decimal1 = decimal1 + 1; } i--; }while (i != 0); i = 10; temp_val = temp_val*10; do{ // div_/mod_ loop if ( temp_val <= -10 ){ temp_val = temp_val + 10; decimal2 = decimal2 + 1; } i--; }while (i != 0); i = 10; temp_val = temp_val*10; do{ // div_/mod_ loop if ( temp_val <= -10 ){ temp_val = temp_val + 10; decimal3 = decimal3 + 1; } i--; }while (i != 0); i = 10; temp_val = temp_val*10; do{ // div_/mod_ loop if ( temp_val <= -10 ){ temp_val = temp_val + 10; decimal4 = decimal4 + 1; } i--; }while (i != 0); } move_cursor_xy(6,1); if (displaysign == 1){ display_char('-'); } else{ display_char(' '); } display_char(tenths + 0x30); delay_time(delay); display_char(units + 0x30); delay_time(delay); display_char('.'); delay_time(delay); display_char(decimal1 + 0x30); delay_time(delay); display_char(decimal2 + 0x30); delay_time(delay); display_char(decimal3 + 0x30); delay_time(delay); display_char(decimal4 + 0x30); move_cursor_xy(33,2); // P1OUT = RS ; delay_long(delay); // P1OUT = Clear; delay_long(delay); } } void display_char(unsigned char ch){ volatile unsigned char temp; temp = ch; P2OUT = RS ; // R/W = 0 (write mode) RS = 1 (data) delay_time(delay); ch = ch >> 4; ch = ch << 2; P2OUT |= ch; // data char delay_time(delay); P2OUT |= EN; // Enable = 1 delay_time(delay); P2OUT = RS ; // Enable = 0 delay_time(delay); ch = temp; ch &= 0x0F; ch = ch << 2; P2OUT |= ch; // data char delay_time(delay); P2OUT |= EN; // Enable = 1 delay_time(delay); P2OUT &= ~( EN ) ; // Enable = 0 delay_time(delay); } int delay_time (int delay){ //-------------------------- delay--------------------- do delay--; while (delay != 0); return (int)(delay); } int delay_long (int){ // -------------------------- Delay lung------------- int j; j = 200; do{ delay_time(delay); j--; }while (j != 0); return (int)(delay); } float convert_temp (float IntDegC){ float temperature; float ua2; float r2; float t2k; ua2 = (3.51/1024*IntDegC); r2 = (3.51*9950/ua2-9950); //r2 = vcc*rdiv/uADCin -rdiv if (r2 == 9950 ){ r2 = r2+1;} // prevents log(1) t2k= ( (298.15*3380)/log(9950/r2) ) / (3380/log(9950/r2)-298.15); //T2= T1*B/ln(R1/R2) / ( B/ln(R1/R2) - T1 ) in Kelvin temperature = t2k - 273.15 ; return (float)(temperature); } void configure_lcd(int){ //-----------------------------LCD-SET-AND-CONFIGURE--------------------------------------- P2OUT = (D3 + D4 + D5); // comand xxxxxxxxxxxxxxxxxxxx 110000 means >> 8bit, 2lines, 5x8pixel char delay_time(delay); P2OUT |= EN; // Enable = 1 delay_time(delay); P2OUT &= ~(EN); // Enable = 0 delay_time(delay); P2OUT = (D3 + D4 + D5); // comand xxxxxxxxxxxxxxxxxxxx 110000 means >> 8bit, 2lines, 5x8pixel char delay_time(delay); P2OUT |= EN; // Enable = 1 delay_time(delay); P2OUT &= ~(EN); // Enable = 0 delay_time(delay); P2OUT = (D3 + D4 + D5); // comand xxxxxxxxxxxxxxxxxxxx 110000 means >> 8bit, 2lines, 5x8pixel char delay_time(delay); P2OUT |= EN; // Enable = 1 delay_time(delay); P2OUT &= ~(EN); // Enable = 0 delay_time(delay); //------------------------------------------------------------------------- P2OUT = D5; // comand xxxxxxxxxxxxxxxxxxxx 110000 means >> move right/ shift off delay_time(delay); P2OUT |= EN; // Enable = 1 delay_time(delay); P2OUT &= ~(EN); // Enable = 0 delay_time(delay); P2OUT = D5; // comand xxxxxxxxxxxxxxxxxxxx 110000 means >> move right/ shift off delay_time(delay); P2OUT |= EN; // Enable = 1 delay_time(delay); P2OUT &= ~(EN); // Enable = 0 delay_time(delay); P2OUT = D7; // comand xxxxxxxxxxxxxxxxxxxx 110000 means >> move right/ shift off delay_time(delay); P2OUT |= EN; // Enable = 1 delay_time(delay); P2OUT &= ~(EN); // Enable = 0 delay_time(delay); P2OUT = Clear; // comand xxxxxxxxxxxxxxxxxxxx 110000 means >> move right/ shift off delay_time(delay); P2OUT |= EN; // Enable = 1 delay_time(delay); P2OUT &= ~(EN); // Enable = 0 delay_time(delay); P2OUT = (D7 + D6); // comand xxxxxxxxxxxxxxxxxxxx 110000 means >> move right/ shift off delay_time(delay); P2OUT |= EN; // Enable = 1 delay_time(delay); P2OUT &= ~(EN); // Enable = 0 delay_time(delay); P2OUT = Clear; // comand xxxxxxxxxxxxxxxxxxxx 110000 means >> display/ cursor/ blinking delay_time(delay); P2OUT |= EN; // Enable = 1 delay_time(delay); P2OUT &= ~(EN); // Enable = 0 delay_time(delay); P2OUT = (D7 + D6 + D5 + D4); // comand xxxxxxxxxxxxxxxxxxxx 110000 means >> display/ cursor/ blinking delay_time(delay); P2OUT |= EN; // Enable = 1 delay_time(delay); P2OUT &= ~(EN); // Enable = 0 delay_time(delay); P2OUT = Clear; // comand xxxxxxxxxxxxxxxxxxxx 110000 means >> 8bit, 2lines, 5x8pixel char delay_time(delay); P2OUT |= EN; // Enable = 1 delay_time(delay); P2OUT &= ~(EN); // Enable = 0 delay_time(delay); P2OUT = D4; // comand xxxxxxxxxxxxxxxxxxxx 110000 means >> 8bit, 2lines, 5x8pixel char delay_time(delay); P2OUT |= EN; // Enable = 1 delay_time(delay); P2OUT &= ~(EN); // Enable = 0 delay_time(delay); P2OUT = Clear; // comand xxxxxxxxxxxxxxxxxxxx 110000 means >> 8bit, 2lines, 5x8pixel char delay_time(delay); P2OUT |= EN; // Enable = 1 delay_time(delay); P2OUT &= ~(EN); // Enable = 0 delay_time(delay); P2OUT = D4; // comand xxxxxxxxxxxxxxxxxxxx 110000 means >> 8bit, 2lines, 5x8pixel char delay_time(delay); P2OUT |= EN; // Enable = 1 delay_time(delay); P2OUT &= ~(EN); // Enable = 0 delay_time(delay); } void move_cursor_xy (int x,int y){ // --------------------------------------- Procedura afisare------------ unsigned char adress; // volatile to prevent optimization unsigned char temp; // volatile to prevent optimization x = x - 1; y = y - 1; adress = (128 + x + (64 * y)); temp = adress; P2OUT = Clear ; // R/W = 0 (write mode) RS = 1 (data) delay_time(delay); adress = adress >> 4; adress = adress << 2; P2OUT |= adress; // data char delay_time(delay); P2OUT |= EN; // Enable = 1 delay_time(delay); P2OUT = Clear ; // Enable = 0 delay_time(delay); adress = temp; adress &= 0x0F; adress = adress << 2; P2OUT |= adress; // data char delay_time(delay); P2OUT |= EN; // Enable = 1 delay_time(delay); P2OUT &= ~( EN ) ; // Enable = 0 delay_time(delay); }