#include #include #pragma CLOCK_FREQ 8000000 #pragma DATA 0x2007, _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _INTRC_IO & _MCLR_OFF & _LVP_OFF & _DEBUG_OFF //The defines //#DEFINE Temp_C PORTA, 0 //#DEFINE HD_Act PORTA, 1 #define SEGMENT_A 2 //#DEFINE OPEN PORTA, 3 ANALOG #define SEGMENT_B 4 #define Mode_SW 5 #define SEGMENT_C 6 #define SEGMENT_D 7 //#define a _portb, 0 //#define b _portb, 1 //#define c _portb, 2 //#define d _portb, 3 //#define e _portb, 4 //#define f _portb, 5 //#define g _portb, 6 //#define dp _portb, 7 //Define A2D equates #define chan0 0b10000001 //select channel AN0 on PA0 #define chan1 0b10001001 //select channel AN1 on PA1 #define chan2 0b10010001 //select channel AN2 on PA2 #define chan3 0b10011001 //select channel AN3 on PA3 #define Temp_C chan0 #define HD_Act chan1 unsigned char seg_a, seg_b, seg_c, seg_d, dp_place; #define MAX_DEVICE_MODE 4 unsigned char device_mode; unsigned char display_mode; #define SAMPLES 4 unsigned short TEMPinC_samples[SAMPLES]; unsigned short ACTonHD_samples[SAMPLES]; unsigned char sample_count = 0; unsigned short TEMPinC; unsigned short TEMPinF; unsigned short ACTonHD; unsigned short RAWtemp; char TenK = 0; char Thou = 0; char Hund = 0; char Tens = 0; char Ones = 0; void delay_20us ( void ) { char d1 = 0; _asm{ movlw 0x80 movwf _d1 Delay_0: decfsz _d1, F goto Delay_0 } } unsigned short sampleA2D ( char whichChannel ) { adcon0 = whichChannel; delay_20us(); set_bit( adcon0, GO ); while ( test_bit( adcon0,GO )); //Wait for conversion to complete return ( (adresh << 8) + adresl ); } unsigned short getAverage( unsigned short * values ) { unsigned short average = 0; unsigned char loopCounter = 0; for( loopCounter = 0;loopCounter>2; } void readInputs ( void ) { long temp_conversion = 0; sample_count++; if( sample_count > SAMPLES ) sample_count = 0; TEMPinC_samples[sample_count] = sampleA2D ( Temp_C ); TEMPinC = getAverage( TEMPinC_samples ); RAWtemp = TEMPinC; //TEMPinC = sampleA2D ( Temp_C ); temp_conversion = TEMPinC*1000; temp_conversion = temp_conversion >> 10; TEMPinC = temp_conversion; TEMPinF = TEMPinC*9; TEMPinF = TEMPinF/5; TEMPinF = TEMPinF+320; /* ACTonHD_samples[sample_count] = sampleA2D ( HD_Act ); ACTonHD = getAverage( ACTonHD_samples );*/ RAWtemp = sampleA2D ( HD_Act ); ACTonHD = RAWtemp - 23; ACTonHD = ACTonHD/10; ACTonHD = 100 - ACTonHD; } unsigned char hundreds; unsigned char tens_and_ones; void binary_to_bcd ( unsigned long bin ) { unsigned short tempValue = bin; unsigned char NumH = ((tempValue>>8)&0x00FF); unsigned char NumL = (tempValue&0x00FF); TenK = 0; Thou = 0; Hund = 0; Tens = 0; Ones = 0; _asm { swapf _NumH, W iorlw 0xF0 //b'11110000' movwf _Thou addwf _Thou,F addlw 0xE2 movwf _Hund addlw 0x32 movwf _Ones movf _NumH,W andlw 0x0F addwf _Hund,F addwf _Hund,F addwf _Ones,F addlw 0xE9 movwf _Tens addwf _Tens,F addwf _Tens,F swapf _NumL,W andlw 0x0F addwf _Tens,F addwf _Ones,F rlf _Tens,F rlf _Ones,F comf _Ones,F rlf _Ones,F movf _NumL,W andlw 0x0F addwf _Ones,F rlf _Thou,F movlw 0x07 movwf _TenK movlw 0x0A ; Ten Lb1: decf _Tens,F addwf _Ones,F btfss _status, 0 goto Lb1 Lb2: decf _Hund,F addwf _Tens,F btfss _status, 0 goto Lb2 Lb3: decf _Thou,F addwf _Hund,F btfss _status, 0 goto Lb3 Lb4: decf _TenK,F addwf _Thou,F btfss _status, 0 goto Lb4 } } void init ( void ) { clear_bit(status, RP0); //--------->Goto bank 0 porta = 0b00000000; //PORTA 0x00 portb = 0b11111111; //PORTB 0x00 //A2D adcon0 = 0b01000000; //Setup A2D on all portA pins and set osc. bits set_bit(status, RP0); //--------->Goto bank 1 trisa = 0b00101011; //PORTA is all inputs; trisb = 0b00000000; //PORTB.3 input, rest outputs //A2D adcon1 = 0b10000100; //Setup A2D right justified osccon = 0b01110000; //Set internal RCto 8MHz clear_bit(status, RP0); //--------->Goto bank 0 seg_a = 0b00000000; seg_b = 0b00000000; seg_c = 0b00000000; seg_d = 0b00000000; device_mode = 0; display_mode = 0; } void display_all( void ) { portb = 0x00; portb = seg_a; clear_bit( porta, SEGMENT_A ); delay_ms(5); set_bit( porta, SEGMENT_A ); portb = 0x00; portb = seg_b; clear_bit( porta, SEGMENT_B ); delay_ms(5); set_bit( porta, SEGMENT_B ); portb = 0x00; portb = seg_c; clear_bit( porta, SEGMENT_C ); delay_ms(5); set_bit( porta, SEGMENT_C ); portb = 0x00; portb = seg_d; clear_bit( porta, SEGMENT_D ); delay_ms(5); set_bit( porta, SEGMENT_D ); } void say_hello( void ) { char loop = 0; seg_a = 0b11111111; // " " seg_b = 0b11111111; seg_c = 0b11111111; seg_d = 0b11111111; for(loop=0;loop<20;loop++) display_all(); seg_d = 0b10001001; // " H" for(loop=0;loop<20;loop++) display_all(); seg_c = seg_d; // " HE" seg_d = 0b10000110; for(loop=0;loop<20;loop++) display_all(); seg_b = seg_c; // " HEL" seg_c = seg_d; seg_d = 0b11000111; for(loop=0;loop<20;loop++) display_all(); seg_a = seg_b; // "HELL" seg_b = seg_c; seg_c = seg_d; seg_d = 0b11000111; for(loop=0;loop<20;loop++) display_all(); seg_a = seg_b; // "ELLO" seg_b = seg_c; seg_c = seg_d; seg_d = 0b11000000; for(loop=0;loop<20;loop++) display_all(); seg_a = seg_b; // "LLO " seg_b = seg_c; seg_c = seg_d; seg_d = 0b11111111; for(loop=0;loop<20;loop++) display_all(); seg_a = seg_b; // "LO " seg_b = seg_c; seg_c = seg_d; seg_d = 0b11111111; for(loop=0;loop<20;loop++) display_all(); seg_a = seg_b; // "O " seg_b = seg_c; seg_c = seg_d; seg_d = 0b11111111; for(loop=0;loop<20;loop++) display_all(); seg_a = seg_b; // " " seg_b = seg_c; seg_c = seg_d; seg_d = 0b11111111; for(loop=0;loop<20;loop++) display_all(); } void display( char which_char ) { //Turn everyone off set_bit( porta, SEGMENT_A ); set_bit( porta, SEGMENT_B ); set_bit( porta, SEGMENT_C ); set_bit( porta, SEGMENT_D ); if( which_char == 0 ) { portb = seg_a; clear_bit( porta, SEGMENT_A ); } else if( which_char == 1 ) { portb = seg_b; clear_bit( porta, SEGMENT_B ); } else if( which_char == 2 ) { portb = seg_c; clear_bit( porta, SEGMENT_C ); } else if( which_char == 3 ) { portb = seg_d; clear_bit( porta, SEGMENT_D ); } else { portb = 0xFF; } } unsigned char bcd_to_7seg( unsigned char input ) { unsigned char converted_value = 0; switch ( input ) { case 0: converted_value = 0b11000000; // 0 break; case 1: converted_value = 0b11111001; // 1 break; case 2: converted_value = 0b10100100; // 2 break; case 3: converted_value = 0b10110000; // 3 break; case 4: converted_value = 0b10011001; // 4 break; case 5: converted_value = 0b10010010; // 5 break; case 6: converted_value = 0b10000011; // 6 break; case 7: converted_value = 0b11111000; // 7 break; case 8: converted_value = 0b10000000; // 8 break; case 9: converted_value = 0b10011000; // 9 break; case 10: converted_value = 0b10001000; // A break; case 11: converted_value = 0b10000000; // B break; case 12: converted_value = 0b11000110; // C break; case 13: converted_value = 0b11000000; // D break; case 14: converted_value = 0b10110000; // E break; case 15: converted_value = 0b10001110; // F break; default: converted_value = 0b11111111; // All off break; } return converted_value; } void setSegemnts( char mode ) { switch( mode ) { case 0: //This is the default so just show temp in C binary_to_bcd ( TEMPinC ); seg_a = bcd_to_7seg( Hund & 0x0F ); seg_b = bcd_to_7seg( Tens & 0x0F ); seg_c = bcd_to_7seg( Ones & 0x0F ); seg_d = bcd_to_7seg( 12 ); seg_b.7 = 0; break; case 1: //Show temp in F binary_to_bcd ( TEMPinF ); if( Thou > 0 ) { //xxxF seg_a = bcd_to_7seg( Thou & 0x0F ); seg_b = bcd_to_7seg( Hund & 0x0F ); seg_c = bcd_to_7seg( Tens & 0x0F ); seg_d = bcd_to_7seg( 15 ); } else { //xx.xF seg_a = bcd_to_7seg( Hund & 0x0F ); seg_b = bcd_to_7seg( Tens & 0x0F ); seg_c = bcd_to_7seg( Ones & 0x0F ); seg_d = bcd_to_7seg( 15 ); seg_b.7 = 0; } break; case 2: //Show HD activity from 0-100% binary_to_bcd ( ACTonHD ); if( Hund > 0 ) { seg_a = bcd_to_7seg( Hund & 0x0F ); seg_b = bcd_to_7seg( Tens & 0x0F ); } else if( Tens > 0 ) { seg_a = 0b11111111; seg_b = bcd_to_7seg( Tens & 0x0F ); } else { seg_a = 0b11111111; seg_b = 0b11111111; } seg_c = bcd_to_7seg( Ones & 0x0F ); seg_d = 0b11011011; break; case 3: //Test Mode binary_to_bcd ( RAWtemp ); seg_a = bcd_to_7seg( Thou & 0x0F ); seg_b = bcd_to_7seg( Hund & 0x0F ); seg_c = bcd_to_7seg( Tens & 0x0F ); seg_d = bcd_to_7seg( Ones & 0x0F ); break; default: //Show mode because it is out of range seg_a = 0b11101010; //A seg_b = 0b11010101; //5 seg_c = 0b10110101; //5 seg_d = 0b01110000; //device_mode seg_d |= (mode & 0x0F); //device_mode break; } } void main() { char i = 0; char timer = 0; char input_update = 0; char which_segment = 0; char mode3_timer = 0; char mode3_state = 0; init(); TEMPinC_samples[0] = 0; TEMPinC_samples[1] = 0; TEMPinC_samples[2] = 0; TEMPinC_samples[3] = 0; ACTonHD_samples[0] = 0; ACTonHD_samples[1] = 0; ACTonHD_samples[2] = 0; ACTonHD_samples[3] = 0; say_hello(); while(1) { //Display what is in the display shadows if( timer >= 5 ) { display( which_segment ); timer = 0; which_segment++; if( which_segment >= 4 ) which_segment = 0; } //Read the button if( !test_bit( porta, Mode_SW ) ) { //Debounce switch delay_ms(10); if( !test_bit( porta, Mode_SW ) ) { device_mode++; if( device_mode >= MAX_DEVICE_MODE ) device_mode = 0; } while(!test_bit( porta, Mode_SW )) { timer++; //Display MODE or something else like mode seg_a = 0b10111111; seg_b = 0b10111111; seg_c = 0b10111111; seg_d = bcd_to_7seg( device_mode & 0x0F ); display_all(); } } if( timer == 0 ) { input_update++; if( input_update >= 200 ) { mode3_timer++; if( mode3_timer > 3 ) { mode3_state++; if( mode3_state >= (MAX_DEVICE_MODE-1) ) mode3_state = 0; mode3_timer = 0; } //Read the A2Ds and store recorded values readInputs(); //Update display shadows if needed if( device_mode < 3 ) setSegemnts( device_mode ); else setSegemnts( mode3_state ); input_update = 0; } } delay_ms(1); timer++; } }