// FLSH_Q.C (PIC16HV540), CCS PCB // // When input PORTB7 is at ground, T_threshold is output to LED on PORTA0. // When input PORTB7 is not at ground, the current value of T_C is output on // the LED. Note that readings are dummied in a constant array. // // In outputting the quantity, a long flash indicates a minus. Each digit is // output as a series of 250 ms flashes. Interdigit time of 1 sec. Five seconds // between outputting each quantity. // // +12 VDC // | // 10K PIC16HV540 // | // GRD ---- \-------------- PORTB7 (term 13) LED // PORTA0 -------------- 330 -->|---- GRD // // 4.0 MHz Crystal, WDT Off // // copyright, Peter H. Anderson, Elmore, VT, July, '01 #case #device PIC16HV540 *=8 #include <defs_540.h> #include <delay.h> #define TRUE !0 #define FALSE 0 void config_processor(void); void flash_q(byte q, byte minus_flag); void main(void) { byte T_threshold = 34, T_C, minus_flag, n; char const T_C_array[5] = {-5, 0, 1, 25, 70}; DIRA = 0x0f; DIRB = 0xff; config_processor(); // set for 5V logic on PortA while(1) { if(!portb7) // if switch at ground { flash_q(T_threshold, FALSE); // display the T_thresh delay_ms(5000); } else { for (n = 0; n< 5; n++) { T_C = T_C_array[n]; if (T_C & 0x80) // if its negative { minus_flag = TRUE; T_C = (~T_C) + 1; // 2's comp } else { minus_flag = FALSE; } flash_q(T_C, minus_flag); } } delay_ms(5000); } } void flash_q(byte q, byte minus_flag) { byte n, digit; dira0 = 0; #asm MOVF DIRA, W TRIS PORTA #endasm if (minus_flag) { porta0 = 1; delay_ms(500); // long delay to indicate minus porta0 = 0; delay_ms(1000); } digit = q/10; // number of tens if (digit) // if non zero { for (n=0; n<digit; n++) { porta0 = 1; delay_ms(250); porta0 = 0; delay_ms(250); } delay_ms(1000); // separation between digits } digit = q%10; if (!digit) { digit = 10; } for (n=0; n<digit; n++) { porta0 = 1; delay_ms(250); porta0 = 0; delay_ms(250); } delay_ms(1000); // separation between digits } void config_processor(void) // configure OPTION2 register { not_pcwu = 1; // wakeup disabled not_swdten = 1; rl = 1; // regulated voltage is 5V sl = 1; // sleep level same as RL not_boden = 1; // brownout disabled #asm MOVF OPTIONS2, W TRIS 0x07 #endasm } #include <delay.c>
>hr>