/* * Loads the byte into the shift register and then sends it to the LCD as a char * Parameters: * c The byte (character) to display */ void lcd_putc(const char c) { lcd_load_byte(c); lcd_send_char(); }
void lcd_CGRAMInit_Mode(void) { uint8_t i=0; lcd_load_byte(0x48); lcd_send_cmd(); for (i=0;i<3;i++) // beide h Tag voll, Nacht off - - char 1 { lcd_putc(0x1B); lcd_send_char(); } lcd_load_byte(0x00);//freie Linie lcd_send_char(); for (i=3;i<6;i++) // { lcd_putc(0x00); lcd_send_char(); } lcd_load_byte(0x00);//freie Linie lcd_send_char(); for (i=0;i<3;i++) // beide h Tag voll, 2. h Nacht red - - char 2 { lcd_putc(0x1B); lcd_send_char(); } lcd_load_byte(0x00);//freie Linie lcd_send_char(); for (i=3;i<6;i++) // { lcd_putc(0x01+i%2); lcd_send_char(); } lcd_load_byte(0x00);//freie Linie lcd_send_char(); for (i=0;i<3;i++) // beide h Tag voll, 1. h Nacht red - - char 3 { lcd_putc(0x1B); lcd_send_char(); } lcd_load_byte(0x00);//freie Linie lcd_send_char(); for (i=3;i<6;i++) // { lcd_putc(0x08*((i%2)*2)); //0x08, 0x10 lcd_send_char(); } lcd_load_byte(0x00);//freie Linie lcd_send_char(); for (i=0;i<3;i++) // beide h Tag voll, Nacht red - - char 4 { lcd_putc(0x1B); lcd_send_char(); } lcd_load_byte(0x00);//freie Linie lcd_send_char(); for (i=3;i<6;i++) // { lcd_putc(0x09*((i%2)*2)); //0x09, 0x12 lcd_send_char(); } lcd_load_byte(0x00);//freie Linie lcd_send_char(); for (i=0;i<3;i++) // beide h Tag voll, 1. h Nacht red, 2. h voll - - char 5 { lcd_putc(0x1B); lcd_send_char(); } lcd_load_byte(0x00);//freie Linie lcd_send_char(); for (i=3;i<6;i++) // { lcd_putc(0x0B+(i%2*8)); //0x0B, 0x13 lcd_send_char(); } lcd_load_byte(0x00);//freie Linie lcd_send_char(); for (i=0;i<3;i++) // beide h Tag voll, 1. h Nacht voll, 2. h red - - char 6 { lcd_putc(0x1B); lcd_send_char(); } lcd_load_byte(0x00);//freie Linie lcd_send_char(); for (i=3;i<6;i++) // { lcd_putc(0x19+(i%2)); //0x0x19, 0x1A lcd_send_char(); } lcd_load_byte(0x00);//freie Linie lcd_send_char(); for (i=0;i<3;i++) // beide h Tag voll, Nacht voll - - char 7 { lcd_putc(0x1B); lcd_send_char(); } lcd_load_byte(0x00);//freie Linie lcd_send_char(); for (i=3;i<6;i++) // { lcd_putc(0x1B); // lcd_send_char(); } lcd_load_byte(0x00);//freie Linie lcd_send_char(); for (i=0;i<3;i++) // beide h Tag red, Nacht off - - char 7 { lcd_putc(0x09*((i%2)*2)); //0x09, 0x12 lcd_send_char(); } lcd_load_byte(0x00);//freie Linie lcd_send_char(); for (i=3;i<6;i++) // { lcd_putc(0x00); // lcd_send_char(); } lcd_load_byte(0x00);//freie Linie lcd_send_char(); lcd_load_byte(0x80); lcd_send_cmd(); }
void lcd_CGRAMInit_Titel(void) { uint8_t i=0; lcd_load_byte(0x48); lcd_send_cmd(); // Strich senkrecht mitte char 1 for (i=0;i<8;i++) { lcd_load_byte(0x84);// mittl Pixel lcd_send_char(); } // Ecke links oben char 2 for (i=0;i<3;i++) { lcd_load_byte(0x00); // leer lcd_send_char(); } lcd_load_byte(0x87); // obere Linie lcd_send_char(); for (i=0;i<4;i++) { lcd_load_byte(0x84); // mittl. Pixel lcd_send_char(); } // Ecke links unten char 3 for (i=0;i<3;i++) { lcd_load_byte(0x84); // mittl Pixel lcd_send_char(); } lcd_load_byte(0x87); // untere Linie lcd_send_char(); for (i=0;i<4;i++) { lcd_load_byte(0x00); // leer lcd_send_char(); } // Strich oben char 4 lcd_load_byte(0x9F); // obere Linie lcd_send_char(); for (i=0;i<7;i++) { lcd_load_byte(0x00);//freie Linie lcd_send_char(); } // Ecke rechts oben char 5 for (i=0;i<3;i++) { lcd_load_byte(0x00); // leer lcd_send_char(); } lcd_load_byte(0x9C); // obere Linie lcd_send_char(); for (i=0;i<4;i++) { lcd_load_byte(0x84); // Pixel mitte lcd_send_char(); } // Ecke rechts unten char 6 for (i=0;i<3;i++) { lcd_load_byte(0x84); // Pixel ganz rechts lcd_send_char(); } lcd_load_byte(0x9C); // untere Linie lcd_send_char(); for (i=0;i<4;i++) { lcd_load_byte(0x00); // leer lcd_send_char(); } // Pfeil nach oben char 7 lcd_load_byte(0x00); // obere Linie lcd_send_char(); lcd_load_byte(0x00); // leer lcd_send_char(); lcd_load_byte(0x84); // mittl. Pixel lcd_send_char(); lcd_load_byte(0x8E); // 3 mittl. Pixel lcd_send_char(); lcd_load_byte(0x9F); // 5 Pixel lcd_send_char(); // 3 freie Linien for (i=0;i<2;i++) { lcd_load_byte(0x00); // freie Linie lcd_send_char(); } // Pfeil nach unten char 8 // 3 freie Linien for (i=0;i<3;i++) { lcd_load_byte(0x00); // freie Linie lcd_send_char(); } lcd_load_byte(0x9F); // 5 Pixel lcd_send_char(); lcd_load_byte(0x8E); // 3 mittl. Pixel lcd_send_char(); lcd_load_byte(0x84); // mittl Pixel lcd_send_char(); lcd_load_byte(0x00); // freie Linie lcd_send_char(); lcd_load_byte(0x00); // freie Linie lcd_send_char(); lcd_load_byte(0x00); // freie Linie lcd_send_char(); // Abschliessen lcd_load_byte(0x80); lcd_send_cmd(); }
void lcd_CGRAMInit_A(void) { uint8_t i=0; lcd_load_byte(0x48); lcd_send_cmd(); for (i=0;i<6;i++) // Kolonne 1 ganz links char 1 { lcd_load_byte(0x10); lcd_send_char(); // lcd_putc(0x10); //lcd_send_char(); } lcd_load_byte(0x1B);//OFF-Linie lcd_send_char(); lcd_load_byte(0x00);//freie Linie lcd_send_char(); for (i=0;i<6;i++) // Kolonne 1+2 char 2 { lcd_load_byte(0x18); lcd_send_char(); } lcd_load_byte(0x1B);//OFF-Linie lcd_send_char(); lcd_load_byte(0x00);//freie Linie lcd_send_char(); for (i=0;i<6;i++) // Kolonne 1,2,3 char 3 { lcd_load_byte(0x1A); lcd_send_char(); } lcd_load_byte(0x1B);//OFF-Linie lcd_send_char(); lcd_load_byte(0x00);//freie Linie lcd_send_char(); for (i=0;i<6;i++) // Kolonne 1,2,3,4 char 4 { lcd_load_byte(0x1B); lcd_send_char(); } lcd_load_byte(0x1B);//OFF-Linie lcd_send_char(); lcd_load_byte(0x00);//freie Linie lcd_send_char(); for (i=0;i<6;i++) // Kolonne 2,3,4 char 5 { lcd_load_byte(0x0B); lcd_send_char(); } lcd_load_byte(0x1B);//OFF-Linie lcd_send_char(); lcd_load_byte(0x00);//freie Linie lcd_send_char(); for (i=0;i<6;i++) // Kolonne 3,4 char 6 { lcd_load_byte(0x03); lcd_send_char(); } lcd_load_byte(0x1B);//OFF-Linie lcd_send_char(); lcd_load_byte(0x00);//freie Linie lcd_send_char(); for (i=0;i<6;i++) // Kolonne 4 char 7 { lcd_load_byte(0x01); lcd_send_char(); } lcd_load_byte(0x1B);//OFF-Linie lcd_send_char(); lcd_load_byte(0x00);//freie Linie lcd_send_char(); for (i=0;i<6;i++) // OFF char 8 { lcd_load_byte(0x00); lcd_send_char(); } lcd_load_byte(0x1B);//OFF-Linie lcd_send_char(); lcd_load_byte(0x00);//freie Linie lcd_send_char(); lcd_load_byte(0x80); lcd_send_cmd(); }
int main (void) { unsigned char menu = MENU_SHOW_USER_TIME; static unsigned char button_state = 0, counter_button = 0; unsigned cpsr_temp; double voltage_temp, current_temp, wattage_hour_temp, wattage_temp; unsigned short int nr_adc_reads_temp; /* Initialize variables */ voltage = 0; current = 0; wattage = 0; wattage_hour_user = 0; wattage_hour_system = 0; tick_update_lcd = 0; nr_adc_reads = 0; user_time_wattage = 0; /* Initialize the system */ system_init (); /* Initialize the LCD */ lcd_init (); /* Initialize the ADC */ adc_init (); /* Initialize the buttons */ buttons_init (); /* Initialize the Timer0 */ timer1_init (); enableIRQ (); for (;;) { switch (menu) { case MENU_SHOW_USER_TIME: if (button_is_set(BUTTON_01) && !button_state) { menu = MENU_SHOW_USER_POWER; button_state = 1; counter_button = 0; } if (!button_is_set(BUTTON_01)) button_state = 0; if (tick_update_lcd >= 50) /* Execute on every 50 * 5ms */ { /* Disable the IRQ for avoid change on global variables used on * Timer1 IRQ handler code */ cpsr_temp = disableIRQ (); wattage = 0; voltage = 0; current = 0; nr_adc_reads = 0; wattage_temp = user_time_wattage; tick_update_lcd = 0; /* Restore the IRQ */ restoreIRQ (cpsr_temp); lcd_send_command (DD_RAM_ADDR); /* LCD set first row */ lcd_send_char (' '); lcd_send_char ('A'); lcd_send_char ('v'); lcd_send_char ('a'); lcd_send_char ('i'); lcd_send_char ('l'); lcd_send_char ('a'); lcd_send_char ('b'); lcd_send_char ('l'); lcd_send_char ('e'); lcd_send_char (' '); lcd_send_char ('t'); lcd_send_char ('i'); lcd_send_char ('m'); lcd_send_char ('e'); lcd_send_char (' '); lcd_send_command (DD_RAM_ADDR2); /* LCD set 2nd row */ /* (watts per hour * 60) ==> watts per minute. * Load uses 30 watts so: ((watts per hour * 60) / 30) <=> * (watts per hour * 2). */ double temp1, temp2; temp1 = ((long) (wattage_temp * 2)); temp2 = ((double) (((double) (wattage_temp * 2)) - (double) temp1)); lcd_send_char (' '); lcd_send_char (' '); lcd_send_char (' '); lcd_send_char (' '); lcd_send_int (temp1, 3); lcd_send_char ('m'); lcd_send_char (' '); lcd_send_int (((long) (temp2 * 60)), 2); lcd_send_char ('s'); lcd_send_char (' '); lcd_send_char (' '); lcd_send_char (' '); lcd_send_char (' '); /* Verify if we need to reset the "usage time available" */ if (button_is_set(BUTTON_02)) { if (++counter_button >= 4) { while (button_is_set(BUTTON_02)) { lcd_send_command (DD_RAM_ADDR); lcd_send_char (' '); lcd_send_char ('A'); lcd_send_char ('v'); lcd_send_char ('a'); lcd_send_char ('i'); lcd_send_char ('l'); lcd_send_char ('a'); lcd_send_char ('b'); lcd_send_char ('l'); lcd_send_char ('e'); lcd_send_char (' '); lcd_send_char ('t'); lcd_send_char ('i'); lcd_send_char ('m'); lcd_send_char ('e'); lcd_send_char (' '); lcd_send_command (DD_RAM_ADDR2); lcd_send_char (' '); lcd_send_char (' '); lcd_send_char (' '); lcd_send_char (' '); lcd_send_char (' '); lcd_send_char ('r'); lcd_send_char ('e'); lcd_send_char ('s'); lcd_send_char ('e'); lcd_send_char ('t'); lcd_send_char (' '); lcd_send_char (' '); lcd_send_char (' '); lcd_send_char (' '); lcd_send_char (' '); lcd_send_char (' '); } /* Disable the IRQ for avoid change on global variables used on * Timer1 IRQ handler code */ cpsr_temp = disableIRQ (); user_time_wattage = 0; tick_update_lcd = 0; /* Restore the IRQ */ restoreIRQ (cpsr_temp); counter_button = 0; } } } break; case MENU_SHOW_USER_POWER: if (button_is_set(BUTTON_01) && !button_state) { menu = MENU_SHOW_SYSTEM_POWER; button_state = 1; counter_button = 0; } if (!button_is_set(BUTTON_01)) button_state = 0; if (tick_update_lcd >= 50) /* Execute on every 50 * 5ms */ { /* Disable the IRQ for avoid change on global variables used on * Timer1 IRQ handler code */ cpsr_temp = disableIRQ (); wattage_temp = wattage; wattage = 0; wattage_hour_temp = wattage_hour_user; voltage = 0; current = 0; nr_adc_reads_temp = nr_adc_reads; nr_adc_reads = 0; tick_update_lcd = 0; /* Restore the IRQ */ restoreIRQ (cpsr_temp); lcd_send_command (DD_RAM_ADDR); /* LCD set first row */ lcd_send_char (' '); lcd_send_float ((wattage_temp/nr_adc_reads_temp), 3, 1); lcd_send_char (' '); lcd_send_char ('W'); lcd_send_char ('a'); lcd_send_char ('t'); lcd_send_char ('t'); lcd_send_char ('s'); lcd_send_char (' '); lcd_send_char (' '); lcd_send_char (' '); lcd_send_char (' '); lcd_send_command (DD_RAM_ADDR2); /* LCD set 2nd row */ lcd_send_char (' '); lcd_send_float (wattage_hour_temp, 3, 3); lcd_send_char (' '); lcd_send_char ('W'); lcd_send_char ('/'); lcd_send_char ('h'); lcd_send_char ('o'); lcd_send_char ('u'); lcd_send_char ('r'); lcd_send_char (' '); /* Verify if we need to reset the wattage_hour_user */ if (button_is_set(BUTTON_02)) { if (++counter_button >= 8) { while (button_is_set(BUTTON_02)) { lcd_send_command (DD_RAM_ADDR); lcd_send_char (' '); lcd_send_char (' '); lcd_send_char (' '); lcd_send_char ('W'); lcd_send_char ('a'); lcd_send_char ('t'); lcd_send_char ('t'); lcd_send_char ('s'); lcd_send_char (' '); lcd_send_char ('h'); lcd_send_char ('o'); lcd_send_char ('u'); lcd_send_char ('r'); lcd_send_char (' '); lcd_send_char (' '); lcd_send_char (' '); lcd_send_command (DD_RAM_ADDR2); lcd_send_char (' '); lcd_send_char (' '); lcd_send_char (' '); lcd_send_char (' '); lcd_send_char (' '); lcd_send_char ('r'); lcd_send_char ('e'); lcd_send_char ('s'); lcd_send_char ('e'); lcd_send_char ('t'); lcd_send_char (' '); lcd_send_char (' '); lcd_send_char (' '); lcd_send_char (' '); lcd_send_char (' '); lcd_send_char (' '); } /* Disable the IRQ for avoid change on global variables used on * Timer1 IRQ handler code */ cpsr_temp = disableIRQ (); wattage_hour_user = 0; tick_update_lcd = 0; /* Restore the IRQ */ restoreIRQ (cpsr_temp); counter_button = 0; } } } break; case MENU_SHOW_SYSTEM_POWER: if (button_is_set(BUTTON_01) && !button_state) { menu = MENU_SHOW_USER_TIME; button_state = 1; counter_button = 0; } if (!button_is_set(BUTTON_01)) button_state = 0; if (tick_update_lcd >= 50) /* Execute on every 50 * 5ms */ { /* Disable the IRQ for avoid change on global variables used on * Timer1 IRQ handler code */ cpsr_temp = disableIRQ (); wattage_temp = wattage; wattage = 0; wattage_hour_temp = wattage_hour_system; voltage = 0; current = 0; nr_adc_reads_temp = nr_adc_reads; nr_adc_reads = 0; tick_update_lcd = 0; /* Restore the IRQ */ restoreIRQ (cpsr_temp); lcd_send_command (DD_RAM_ADDR); /* LCD set first row */ lcd_send_char (' '); lcd_send_char (' '); lcd_send_char ('T'); lcd_send_char ('o'); lcd_send_char ('t'); lcd_send_char ('a'); lcd_send_char ('l'); lcd_send_char (' '); lcd_send_char ('p'); lcd_send_char ('o'); lcd_send_char ('w'); lcd_send_char ('e'); lcd_send_char ('r'); lcd_send_char (' '); lcd_send_char (' '); lcd_send_char (' '); lcd_send_command (DD_RAM_ADDR2); /* LCD set 2nd row */ lcd_send_char (' '); lcd_send_float (wattage_hour_temp, 4, 3); lcd_send_char (' '); lcd_send_char ('W'); lcd_send_char ('/'); lcd_send_char ('h'); lcd_send_char ('o'); lcd_send_char ('u'); lcd_send_char ('r'); /* Verify if we need to go on the advanced menus */ if (button_is_set(BUTTON_02)) { if (++counter_button >= 20) { while (button_is_set(BUTTON_02)) { lcd_send_command (DD_RAM_ADDR); lcd_send_char (' '); lcd_send_char (' '); lcd_send_char (' '); lcd_send_char (' '); lcd_send_char ('G'); lcd_send_char ('o'); lcd_send_char ('i'); lcd_send_char ('n'); lcd_send_char ('g'); lcd_send_char (' '); lcd_send_char ('t'); lcd_send_char ('o'); lcd_send_char (' '); lcd_send_char (' '); lcd_send_char (' '); lcd_send_char (' '); lcd_send_command (DD_RAM_ADDR2); /* LCD set 2nd row */ lcd_send_char (' '); lcd_send_char ('a'); lcd_send_char ('d'); lcd_send_char ('v'); lcd_send_char ('a'); lcd_send_char ('n'); lcd_send_char ('c'); lcd_send_char ('e'); lcd_send_char ('d'); lcd_send_char (' '); lcd_send_char ('m'); lcd_send_char ('e'); lcd_send_char ('n'); lcd_send_char ('u'); lcd_send_char ('s'); lcd_send_char (' '); } menu = MENU_SHOW_VOLTAGE_CURRENT; counter_button = 0; } } } break; case MENU_SHOW_VOLTAGE_CURRENT: if (button_is_set(BUTTON_01) && !button_state) { menu = MENU_SHOW_ADC_READINGS; button_state = 1; counter_button = 0; } if (!button_is_set(BUTTON_01)) button_state = 0; if (tick_update_lcd >= 50) /* Execute on every 50 * 5ms */ { /* Disable the IRQ for avoid change on global variables used on * Timer1 IRQ handler code */ cpsr_temp = disableIRQ (); voltage_temp = voltage; voltage = 0; current_temp = current; current = 0; nr_adc_reads_temp = nr_adc_reads; nr_adc_reads = 0; tick_update_lcd = 0; /* Restore the IRQ */ restoreIRQ (cpsr_temp); lcd_send_command (DD_RAM_ADDR); /* LCD set first row */ lcd_send_char (' '); lcd_send_char (' '); lcd_send_char (' '); lcd_send_float ((((voltage_temp/nr_adc_reads_temp) * \ K_VOLTAGE) + M_VOLTAGE), 2,1); lcd_send_char (' '); lcd_send_char ('V'); lcd_send_char ('o'); lcd_send_char ('l'); lcd_send_char ('t'); lcd_send_char ('s'); lcd_send_char (' '); lcd_send_char (' '); lcd_send_char (' '); lcd_send_command (DD_RAM_ADDR2); /* LCD set 2nd row */ lcd_send_char (' '); lcd_send_char (' '); lcd_send_char (' '); /* First 3 values from ADC_current should not be used since they are * very non linear. */ current_temp = (current_temp/nr_adc_reads_temp); if (current_temp < 3) { lcd_send_float (0, 2, 1); } if (current_temp >= 3 && current_temp < 60) { current_temp = \ ((-0.000004 * current_temp * current_temp * current_temp) + \ (0.0005 * current_temp * current_temp) - \ (0.0028 * current_temp) + 0.356); lcd_send_float (current_temp, 2, 1); } if (current_temp >= 60) { lcd_send_float (((current_temp * K_CURRENT) + \ M_CURRENT),2,1); } lcd_send_char (' '); lcd_send_char ('A'); lcd_send_char ('m'); lcd_send_char ('p'); lcd_send_char ('s'); lcd_send_char (' '); lcd_send_char (' '); lcd_send_char (' '); lcd_send_char (' '); /* Verify if we need to go on the normal menus */ if (button_is_set(BUTTON_02)) { if (++counter_button >= 20) { while (button_is_set(BUTTON_02)) { lcd_send_command (DD_RAM_ADDR); lcd_send_char (' '); lcd_send_char (' '); lcd_send_char (' '); lcd_send_char (' '); lcd_send_char ('L'); lcd_send_char ('e'); lcd_send_char ('a'); lcd_send_char ('v'); lcd_send_char ('i'); lcd_send_char ('n'); lcd_send_char ('g'); lcd_send_char (' '); lcd_send_char (' '); lcd_send_char (' '); lcd_send_char (' '); lcd_send_char (' '); lcd_send_command (DD_RAM_ADDR2); lcd_send_char (' '); lcd_send_char ('a'); lcd_send_char ('d'); lcd_send_char ('v'); lcd_send_char ('a'); lcd_send_char ('n'); lcd_send_char ('c'); lcd_send_char ('e'); lcd_send_char ('d'); lcd_send_char (' '); lcd_send_char ('m'); lcd_send_char ('e'); lcd_send_char ('n'); lcd_send_char ('u'); lcd_send_char ('s'); lcd_send_char (' '); } menu = MENU_SHOW_USER_TIME; counter_button = 0; } } } break; case MENU_SHOW_ADC_READINGS: disableIRQ (); lcd_send_command (CLR_DISP); while (1) { lcd_send_command (DD_RAM_ADDR); /* LCD set first row */ lcd_send_char ('A'); lcd_send_char ('D'); lcd_send_char ('C'); lcd_send_char (' '); lcd_send_char ('v'); lcd_send_char ('o'); lcd_send_char ('l'); lcd_send_char ('t'); lcd_send_char ('a'); lcd_send_char ('g'); lcd_send_char ('e'); lcd_send_char (':'); int i; for (i = 0; i < 5000; i++) voltage += adc_read (6); lcd_send_int (voltage/5000, 4); voltage = 0; lcd_send_command (DD_RAM_ADDR2); /* LCD set 2nd row */ lcd_send_char ('A'); lcd_send_char ('D'); lcd_send_char ('C'); lcd_send_char (' '); lcd_send_char ('c'); lcd_send_char ('u'); lcd_send_char ('r'); lcd_send_char ('r'); lcd_send_char ('e'); lcd_send_char ('n'); lcd_send_char ('t'); lcd_send_char (':'); for (i = 0; i < 5000; i++) current += adc_read (7); lcd_send_int (current/5000, 4); current = 0; if (button_is_set(BUTTON_01) && !button_state) { menu = MENU_SHOW_VOLTAGE_CURRENT; button_state = 1; counter_button = 0; voltage = 0; current = 0; restoreIRQ (cpsr_temp); break; break; } if (!button_is_set(BUTTON_01)) button_state = 0; } break; default: break; } /* Go to idle mode to save power. System leaves idle mode on interrupt, so, * at each 5ms interrupt from Timer 1. */ /* UNCOMENT IN THE END - NOT POSSIBLE TO DEBUG WITH IDLE MODE */ system_go_idle (); } }