summaryrefslogtreecommitdiffstats
path: root/Master/Projekt Systementwicklung/OBD2_uart.c
diff options
context:
space:
mode:
authorSven Eisenhauer <sven@sven-eisenhauer.net>2023-11-10 15:11:48 +0100
committerSven Eisenhauer <sven@sven-eisenhauer.net>2023-11-10 15:11:48 +0100
commit33613a85afc4b1481367fbe92a17ee59c240250b (patch)
tree670b842326116b376b505ec2263878912fca97e2 /Master/Projekt Systementwicklung/OBD2_uart.c
downloadStudium-33613a85afc4b1481367fbe92a17ee59c240250b.tar.gz
Studium-33613a85afc4b1481367fbe92a17ee59c240250b.tar.bz2
add new repoHEADmaster
Diffstat (limited to 'Master/Projekt Systementwicklung/OBD2_uart.c')
-rw-r--r--Master/Projekt Systementwicklung/OBD2_uart.c1486
1 files changed, 1486 insertions, 0 deletions
diff --git a/Master/Projekt Systementwicklung/OBD2_uart.c b/Master/Projekt Systementwicklung/OBD2_uart.c
new file mode 100644
index 0000000..455748b
--- /dev/null
+++ b/Master/Projekt Systementwicklung/OBD2_uart.c
@@ -0,0 +1,1486 @@
+/**
+ * OBD2 Reader
+ * Avraham Aisenberg, Mike Andromalos
+ * Spring 2009- ECE 4760
+ * Assistance from Bruce Land and Ruibing Wang
+ */
+/******************************************************************************************/
+/* Includes */
+#include <avr/io.h>
+#include <avr/interrupt.h>
+#include <util/delay.h>
+#include <string.h>
+#include <stdio.h>
+#include "lcd_lib.h"
+#include <math.h>
+
+/* Global/System Constants */
+#define TRUE 1
+#define FALSE 0
+
+#define sbi(data,bit) (data |= (1<<bit)) // Set Bit
+#define cbi(data,bit) (data &= ~(1<<bit)) // Clear Bit
+#define gbi(data,bit) (data & (1<<bit)) // Get Bit
+#define tbi(data,bit) (data ^= (1<<bit)) // Toggle Bit
+
+//State Machine States
+#define St_Initial 1
+#define St_Trans_EchoOff 2
+#define St_Rec_EchoOff 3
+#define St_Trans_Reset 4
+#define St_Rec_Reset 5
+#define St_Print_Menu 6
+#define St_Print_Gauges_Eng 7
+#define St_Trans_Speed 8
+#define St_Rec_Speed 9
+#define St_Trans_Rpm 10
+#define St_Rec_Rpm 11
+#define St_Trans_Volt 12
+#define St_Rec_Volt 13
+#define St_Trans_Mpg 14
+#define St_Rec_Mpg 15
+#define St_Print_Units 16
+#define St_Print_Time_Trials 17
+#define St_Print_Gauges_Metric 18
+#define St_Print_Engine_Codes 19
+#define St_Print_Disclaimer 20
+#define St_Print_Timer60 21
+#define St_Print_Timer_Mile 22
+#define St_Print_About 23
+#define St_Trans_Vin 24
+#define St_Rec_Vin 25
+#define St_Trans_SN 26
+#define St_Rec_SN 27
+#define St_Trans_Clear 28
+#define St_Rec_Clear 29
+#define St_Trans_Engine_Temp 30
+#define St_Rec_Engine_Temp 31
+#define St_Codes_Cleared 32
+#define St_Codes_Not_Cleared 33
+#define St_Trans_Check_Engine 34
+#define St_Rec_Check_Engine 35
+#define St_Print_Check_Engine 36
+
+//State machine state names for debounce
+#define Release 1
+#define DebouncePress 2
+#define StillPressed 3
+#define DebounceRelease 4
+
+//Conversion Macros
+//Data conversion macros
+#define rpm_convert(a,b) floor(((256*(a))+(b))/4);
+#define airflowrate_convert(a,b) ((256*(a))+(b))/100;
+#define mpg_convert(a,b) (710.733*(a))/(b);
+#define speed_convert(a) floor((a)*(0.621371192));
+#define temp_convert(a) floor(((a)*(1.8))+32);
+
+
+//Buttons
+//Button
+#define Up 14 //Green- Up
+#define Down 13 //Yellow- Down
+#define Left 11 //Orange- Left
+#define Right 7 //Brown- Right
+
+
+/* Global Variables */
+uint8_t mcu_state;
+uint8_t rx_buffer[128];
+uint8_t rx_buffer_index;
+uint8_t lcd_buffer[17]; // LCD display buffer
+enum {MCU_STATE_IDLE, MCU_STATE_TX};
+uint8_t error_buffer[40];
+
+//Meassages
+uint8_t Reset[4] = "ATZ\r";
+uint8_t EchoOff[5] = "ATE0\r";
+uint8_t Speed[6] = "010D1\r";
+uint8_t Rpm[6] = "010C1\r";
+uint8_t Volt[5] = "ATRV\r";
+uint8_t Maf[6] = "01101\r";
+uint8_t Info[4] = "ATI\r";
+uint8_t Serial[5] = "AT@2\r";
+uint8_t Vin[6] = "09025\r";
+uint8_t Clear[3] = "04\r";
+uint8_t EngineTemp[6] = "01051\r";
+uint8_t Check[3] = "03\r";
+
+/* Prototype Functions */
+void init_mcu(void);
+void init_uart0_rxtx(void);
+void uart0_send_byte_array(uint8_t *data, uint8_t length);
+void uart0_send_byte(uint8_t data);
+void uart0_parse_rx(uint8_t rx_data);
+void init_lcd(void);
+void initialize(void);
+void state_machine(void);
+void debounce_machine(void);
+
+//State Machine Marker
+int state;
+
+//Car data
+int mph, rpm, mpg;
+int kph, kpl;
+int temp_rpm1, temp_rpm2;
+int maf, temp_maf1, temp_maf2;
+int mile_speed, mile_time;
+int time60;
+int temperature;
+int error1, error2, error3, error4, error5, error6, error7;
+
+//Debounce State Machine Variables
+unsigned char maybe, PushState;
+unsigned char button_pressed, button_mask;
+
+//Menu Surfing Flags
+unsigned char menu_cursor;
+unsigned char menu;
+unsigned char metric_flag; //0 - English, 1 - Metric SI
+
+unsigned char sn;
+unsigned char serial_buffer[14];
+unsigned char about_flag;
+
+//Time Keeping
+volatile unsigned int milliseconds; // 0-60 timer
+volatile unsigned int seconds;
+unsigned int milli_temp;
+unsigned char trial_flag;
+unsigned char timeOn;
+volatile char button_timer;
+
+/******************************************************************************************/
+//timer 0 overflow ISR
+ISR (TIMER0_COMPA_vect){
+ if(timeOn == 1){
+ milliseconds++;
+ if(milliseconds%1000 == 0){
+ seconds = seconds + 1;
+ milliseconds = 0;
+ }
+ }
+ if (button_timer != 0)
+ button_timer--;
+}
+
+/******************************************************************************************/
+/**
+ * UART transmission function for byte arrays
+ *
+ * Can be used to transmitt strings
+ * Length terminated (versus null terminated)
+ */
+void uart0_send_byte_array(uint8_t *data, uint8_t length) {
+ for (uint8_t i=0; i<length; i++) {
+ while ( !( UCSR0A & (1<<UDRE0)) ); // Wait for empty buffer
+ UDR0 = *data++; // Put data into buffer, sends the data
+ }
+}
+
+//Parsing function based on current state
+void uart0_parse_rx(uint8_t rx_data) {
+
+ if (state == St_Rec_EchoOff){
+ if (rx_data == 0x3E) {
+ rx_buffer_index = 0;
+ state = St_Trans_Reset;
+ }
+ else if (rx_data >= 0x20 && rx_data <= 0x5F) {
+ rx_buffer[rx_buffer_index++] = rx_data;
+ }
+ }
+ else if (state == St_Rec_Speed){
+ if(button_pressed == Left){
+ state = St_Print_Menu;
+ LCDclr();
+ menu = 1;
+ menu_cursor = 1;
+ trial_flag = 0;
+ timeOn = 0;
+ milliseconds = 0;
+ seconds = 0;
+
+ LCDGotoXY(0,0);
+ LCDsendChar(7);
+
+ kph = 0;
+ mph = 0;
+ rpm = 0;
+ mpg = 0;
+ }
+ if (rx_data == 0x3E) {
+ sscanf(rx_buffer,"%*s %*s %X",&kph);
+ LCDGotoXY(6,0);
+ if (menu == 8) {
+ mph = speed_convert(kph);
+ if ((mph > 0) && (trial_flag == 0)){
+ LCDGotoXY(0,2);
+ sprintf(lcd_buffer, "TO BEGIN: SLOW TO 0");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+ state = St_Trans_Speed;
+ }
+ else if ((mph == 0) && (trial_flag == 0)){
+ LCDGotoXY(0,1);
+ if(mph <10)
+ sprintf(lcd_buffer, "MPH: %d", mph);
+ else if ((mph >= 10) && (mph < 100))
+ sprintf(lcd_buffer, "MPH: %d", mph);
+ else
+ sprintf(lcd_buffer, "MPH: %d", mph);
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+
+ LCDGotoXY(0,2);
+ sprintf(lcd_buffer,"PROCEED WHEN READY");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+ trial_flag = 1;
+ }
+ else if ((mph > 0) && (trial_flag == 1) && (timeOn == 0)) {
+ timeOn = 1;
+ }
+ else if ((mph >= 0) && (timeOn == 1)){
+ if(mph < 60 && seconds <60){
+ LCDGotoXY(0,1);
+ if(mph <10)
+ sprintf(lcd_buffer, "MPH: %d", mph);
+ else if ((mph >= 10) && (mph < 100))
+ sprintf(lcd_buffer, "MPH: %d", mph);
+ else
+ sprintf(lcd_buffer, "MPH: %d", mph);
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+ LCDGotoXY(0,2);
+ if(seconds < 10){
+ if(milliseconds<10){
+ sprintf(lcd_buffer, "Time: %u.00%u seconds",seconds,milliseconds);}
+ else if(milliseconds<100){
+ sprintf(lcd_buffer, "Time: %u.0%u seconds",seconds,milliseconds);}
+ else{
+ sprintf(lcd_buffer, "Time: %u.%u seconds",seconds,milliseconds);}
+ }
+ else {
+ if(milliseconds<10){
+ sprintf(lcd_buffer, "Time: %u.00%u seconds",seconds,milliseconds);}
+ else if(milliseconds<100){
+ sprintf(lcd_buffer, "Time: %u.0%u seconds",seconds,milliseconds);}
+ else{
+ sprintf(lcd_buffer, "Time: %u.%u seconds",seconds,milliseconds);}
+ }
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+ }
+ else if ((mph >= 60) || (seconds >= 60)){
+ timeOn = 0;
+ LCDGotoXY(0,2);
+ if(seconds < 10){
+ if(milliseconds<10){
+ sprintf(lcd_buffer, "Time: %u.00%u seconds",seconds,milliseconds);}
+ else if(milliseconds<100){
+ sprintf(lcd_buffer, "Time: %u.0%u seconds",seconds,milliseconds);}
+ else{
+ sprintf(lcd_buffer, "Time: %u.%u seconds",seconds,milliseconds);}
+ }
+ else {
+ if(milliseconds<10){
+ sprintf(lcd_buffer, "Time: %u.00%u seconds",seconds,milliseconds);}
+ else if(milliseconds<100){
+ sprintf(lcd_buffer, "Time: %u.0%u seconds",seconds,milliseconds);}
+ else{
+ sprintf(lcd_buffer, "Time: %u.%u seconds",seconds,milliseconds);}
+ }
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+ LCDGotoXY(0,1);
+ if(mph <10)
+ sprintf(lcd_buffer, "MPH: %d", mph);
+ else if ((mph >= 10) && (mph < 100))
+ sprintf(lcd_buffer, "MPH: %d", mph);
+ else
+ sprintf(lcd_buffer, "MPH: %d", mph);
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+ trial_flag = 3;
+ }
+ }
+ rx_buffer_index = 0;
+ state = St_Print_Timer60;
+ }
+ else if(metric_flag == 0){
+ mph = speed_convert(kph);
+ if(mph <10)
+ sprintf(lcd_buffer, " %d", mph);
+ else if ((mph >= 10) && (mph < 100))
+ sprintf(lcd_buffer, " %d", mph);
+ else
+ sprintf(lcd_buffer, " %d", mph);
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+ state = St_Trans_Rpm;
+ if(button_pressed == Left){
+ state = St_Print_Menu;
+ LCDclr();
+ menu = 1;
+ menu_cursor = 1;
+ LCDGotoXY(0,0);
+ LCDsendChar(7);
+ mph = 0;
+ rpm = 0;
+ mpg = 0;
+ }
+ }
+ else if(metric_flag == 1){
+ if(kph <10)
+ sprintf(lcd_buffer, " %d", kph);
+ else if ((kph >= 10) && (kph < 100))
+ sprintf(lcd_buffer, " %d", kph);
+ else
+ sprintf(lcd_buffer, " %d", kph);
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+ state = St_Trans_Rpm;
+ if(button_pressed == Left){
+ state = St_Print_Menu;
+ LCDclr();
+ menu = 1;
+ menu_cursor = 1;
+
+ LCDGotoXY(0,0);
+ LCDsendChar(7);
+
+ mph = 0;
+ rpm = 0;
+ mpg = 0;
+ }
+ }
+ rx_buffer_index = 0;
+ }
+ else if (rx_data >= 0x20 && rx_data <= 0x5F) {
+ rx_buffer[rx_buffer_index++] = rx_data;
+ }
+ }
+ else if (state == St_Rec_Rpm){
+ if (rx_data == 0x3E) {
+ sscanf(rx_buffer,"%*s %*s %X %X",&temp_rpm1,&temp_rpm2);
+ rpm = rpm_convert(temp_rpm1,temp_rpm2);
+ LCDGotoXY(16,0);
+ if(rpm<1000)
+ sprintf(lcd_buffer, " %d", rpm);
+ else
+ sprintf(lcd_buffer, "%d", rpm);
+
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+ rx_buffer_index = 0;
+ state = St_Trans_Volt;
+ if(button_pressed == Left){
+ state = St_Print_Menu;
+ LCDclr();
+ menu = 1;
+ menu_cursor = 1;
+ LCDGotoXY(0,0);
+ LCDsendChar(7);
+ mph = 0;
+ rpm = 0;
+ mpg = 0;
+ }
+ }
+ else if (rx_data >= 0x20 && rx_data <= 0x5F) {
+ rx_buffer[rx_buffer_index++] = rx_data;
+ }
+ }
+ else if (state == St_Rec_Mpg){
+ if (rx_data == 0x3E) {
+ sscanf(rx_buffer,"%*s %*s %X %X",&temp_maf1,&temp_maf2);
+ maf = airflowrate_convert(temp_maf1,temp_maf2);
+ mpg = mpg_convert(mph,maf);
+ LCDGotoXY(16,1);
+ sprintf(lcd_buffer, "%2.1f", mpg);
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+ rx_buffer_index = 0;
+ state = St_Trans_Speed;
+ }
+ else if (rx_data >= 0x20 && rx_data <= 0x5F) {
+ rx_buffer[rx_buffer_index++] = rx_data;
+ }
+ }
+ else if (state == St_Rec_Volt){
+ if (rx_data == 0x3E){
+ rx_buffer_index = 0;
+ state = St_Trans_Engine_Temp;
+ if(button_pressed == Left){
+ state = St_Print_Menu;
+ LCDclr();
+ menu = 1;
+ menu_cursor = 1;
+ LCDGotoXY(0,0);
+ LCDsendChar(7);
+ mph = 0;
+ rpm = 0;
+ mpg = 0;
+ }
+ }
+ if (rx_data >= 0x20 && rx_data <= 0x5F) {
+ rx_buffer[rx_buffer_index++] = rx_data;
+ }
+ if (rx_data == 0x56) {
+ LCDGotoXY(5,1);
+ sprintf(lcd_buffer, "%c%c%c%c", rx_buffer[0],rx_buffer[1],rx_buffer[2],rx_buffer[3]);
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+ }
+ }
+ else if (state == St_Rec_Reset){
+ if (rx_data == 0x3E) {
+ LCDGotoXY(5,3);
+ sprintf(lcd_buffer, "%s", rx_buffer);
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+ rx_buffer_index = 0;
+ PORTB = 0xFF;
+ state = St_Print_Menu;
+ _delay_ms(1000);
+ LCDclr();
+ LCDGotoXY(0,0);
+ LCDsendChar(7);
+ }
+ else if (rx_data >= 0x20 && rx_data <= 0x5F) {
+ rx_buffer[rx_buffer_index++] = rx_data;
+ }
+ }
+ else if (state == St_Rec_SN){
+ if (about_flag == 1){
+ LCDGotoXY(5,2);
+ LCDstring(serial_buffer, strlen(serial_buffer));
+ state = St_Print_About;
+ }
+ else if(about_flag == 0){
+ if (rx_data == 0x3E) {
+ menu_cursor = 2;
+ LCDGotoXY(5,2);
+ sprintf(serial_buffer, "%c%c%c%c%c%c%c%c%c%c%c%c", rx_buffer[0],rx_buffer[1],rx_buffer[2],rx_buffer[3],rx_buffer[4],rx_buffer[5],rx_buffer[6],rx_buffer[7],rx_buffer[8],rx_buffer[9],rx_buffer[10],rx_buffer[11]);
+ LCDstring(serial_buffer, strlen(serial_buffer));
+ rx_buffer_index = 0;
+ about_flag = 1;
+ state = St_Print_About;
+ }
+ else if (rx_data >= 0x20 && rx_data <= 0x5F) {
+ rx_buffer[rx_buffer_index++] = rx_data;
+ }
+ }
+ }
+ else if (state == St_Rec_Clear){
+ if (rx_data == 0x3E) {
+ if (rx_buffer[0] == 0x34)
+ state = St_Codes_Cleared;
+ else
+ state = St_Codes_Not_Cleared;
+ LCDclr();
+ rx_buffer_index = 0;
+ }
+ else if (rx_data >= 0x20 && rx_data <= 0x5F) {
+ rx_buffer[rx_buffer_index++] = rx_data;
+ }
+ }
+ else if(state == St_Rec_Engine_Temp){
+ if (rx_data == 0x3E) {
+ sscanf(rx_buffer,"%*s %*s %X",&temperature);
+ rx_buffer_index = 0;
+ if(metric_flag == 0){
+ temperature = temp_convert(temperature - 40);
+ }
+ else
+ temperature = temperature - 40;
+ LCDGotoXY(15 ,1);
+ if (temperature <= 10)
+ sprintf(lcd_buffer,"%d",temperature);
+ else if (temperature<0 && temperature>10)
+ sprintf(lcd_buffer," %d", temperature);
+ else if((temperature >= 0) && (temperature <10))
+ sprintf(lcd_buffer, " %d", (temperature));
+ else if ((temperature >= 10) && (temperature < 100))
+ sprintf(lcd_buffer, " %d", temperature);
+ else
+ sprintf(lcd_buffer, "%d", temperature);
+
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+ state = St_Trans_Speed;
+ }
+ else if (rx_data >= 0x20 && rx_data <= 0x5F) {
+ rx_buffer[rx_buffer_index++] = rx_data;
+ }
+ }
+ else if(state == St_Rec_Check_Engine){
+ if (rx_data == 0x3E){
+ sscanf(rx_buffer,"%X %X %X %X %X %X %X",&error1, &error2, &error3, &error4, &error5, &error6, &error7);
+ if (error1 = 0x43){
+ state = St_Print_Check_Engine;
+ }
+ else {
+ LCDGotoXY(0,0);
+ sprintf(lcd_buffer,"********************");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+
+ LCDGotoXY(0,0);
+ sprintf(lcd_buffer,"* NO CODES *");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+
+ LCDGotoXY(0,0);
+ sprintf(lcd_buffer,"* DETECTED *");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+
+ LCDGotoXY(0,3);
+ sprintf(lcd_buffer,"********************");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+
+ _delay_ms(1000);
+ state = St_Print_Menu;
+ LCDclr();
+ menu = 1;
+ menu_cursor = 1;
+ LCDGotoXY(0,0);
+ LCDsendChar(7);
+ }
+ rx_buffer_index = 0;
+ }
+ else if (rx_data >= 0x20 && rx_data <= 0x5F) {
+ rx_buffer[rx_buffer_index++] = rx_data;
+ }
+ }
+}
+
+/******************************************************************************************/
+/**
+ * Main program
+ */
+int main(void) {
+ initialize();
+ // Main program loop
+ while(1) {
+ if ((button_timer == 0) && (PINA != 15)){
+ button_pressed = PINA;
+ button_timer = 0;
+ }
+ else
+ button_pressed = 15;
+ state_machine();
+ }
+}
+/******************************************************************************************/
+void initialize(void){
+ rx_buffer_index = 0;
+ DDRD = 0xFF;
+ PORTD = 0xFF;
+
+ //init pushbuttonsf
+ DDRA = 0xF0;
+ PushState = Release;
+
+ init_uart0_rxtx(); // Initialize UART TX
+ init_lcd();
+
+ state = St_Initial;
+ mph = 0;
+ rpm = 0;
+ mpg = 0;
+ kph = 0;
+ kpl = 0;
+ temp_rpm1 = 0;
+ temp_rpm2 = 0;
+ maf = 0;
+ temperature = 0;
+ milli_temp = 0;
+ seconds = 0;
+ about_flag = 0;
+
+ menu = 1;
+ menu_cursor = 1;
+ button_pressed = 0;
+ metric_flag = 0;
+ trial_flag = 0;
+ timeOn = 0;
+ button_timer = 0;
+
+ // set up timer 0
+ OCR0A = 249; // clear after 250 counts
+ TIMSK0 = (1<<OCIE0A) ; //turn on timer 0 cmp-match ISR
+
+ // turn on timer 0 clear on match
+ TCCR0A = (1<<WGM01) ;
+ // timer 0 prescalar to 64
+ TCCR0B = 3 ;
+
+ sei();
+}
+/******************************************************************************************/
+void state_machine(void){
+
+ switch(state){
+ case St_Initial:
+ LCDGotoXY(6,0);
+ sprintf(lcd_buffer,"OBD2 LCD");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+
+ LCDGotoXY(4,1);
+ sprintf(lcd_buffer,"AMA64, MAA66");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+
+ LCDGotoXY(3,2);
+ sprintf(lcd_buffer,"Copyright 2009");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+
+ _delay_ms(2000);
+ state = St_Trans_EchoOff;
+
+ break;
+
+ case St_Trans_EchoOff:
+ uart0_send_byte_array(EchoOff,5);
+ _delay_ms(500);
+ state = St_Rec_EchoOff;
+
+ break;
+
+ case St_Rec_EchoOff:
+ if(UCSR0A & (1<<RXC0)) {
+ uart0_parse_rx(UDR0);
+ }
+
+ break;
+
+ case St_Trans_Reset:
+ uart0_send_byte_array(Info,4);
+ state = St_Rec_Reset;
+
+ break;
+
+ case St_Rec_Reset:
+ if(UCSR0A & (1<<RXC0)) {
+ uart0_parse_rx(UDR0);
+ }
+
+ break;
+
+ case St_Print_Menu:
+ rx_buffer_index = 0;
+ kph = 0;
+ mph = 0;
+ trial_flag = 0;
+ timeOn = 0;
+ milliseconds = 0;
+ seconds = 0;
+
+ if(button_pressed == Up){
+ if(menu_cursor == 1){
+ LCDGotoXY(19,1);
+ LCDsendChar(6);
+ menu_cursor = 5;
+ LCDGotoXY(0,0);
+ sprintf(lcd_buffer," ");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+ }
+ else if(menu_cursor == 2){
+ LCDGotoXY(0,0);
+ LCDsendChar(7);
+ menu_cursor = 1;
+ LCDGotoXY(0,1);
+ sprintf(lcd_buffer," ");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+ }
+ else if(menu_cursor == 3){
+ LCDGotoXY(0,1);
+ LCDsendChar(7);
+ menu_cursor = 2;
+ LCDGotoXY(0,2);
+ sprintf(lcd_buffer," ");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+ }
+ else if(menu_cursor == 4){
+ LCDGotoXY(0,2);
+ LCDsendChar(7);
+ menu_cursor = 3;
+ LCDGotoXY(19,0);
+ sprintf(lcd_buffer," ");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+ }
+ else if(menu_cursor == 5){
+ LCDGotoXY(19,0);
+ LCDsendChar(6);
+ menu_cursor = 4;
+ LCDGotoXY(19,1);
+ sprintf(lcd_buffer," ");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+ }
+ }
+ else if(button_pressed == Down){
+ if(menu_cursor == 1){
+ LCDGotoXY(0,1);
+ LCDsendChar(7);
+ menu_cursor = 2;
+ LCDGotoXY(0,0);
+ sprintf(lcd_buffer," ");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+ }
+ else if(menu_cursor == 2){
+ LCDGotoXY(0,2);
+ LCDsendChar(7);
+ menu_cursor = 3;
+ LCDGotoXY(0,1);
+ sprintf(lcd_buffer," ");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+ }
+ else if(menu_cursor == 3){
+ LCDGotoXY(19,0);
+ LCDsendChar(6);
+ menu_cursor = 4;
+ LCDGotoXY(0,2);
+ sprintf(lcd_buffer," ");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+ }
+ else if(menu_cursor == 4){
+ LCDGotoXY(19,1);
+ LCDsendChar(6);
+ menu_cursor = 5;
+ LCDGotoXY(19,0);
+ sprintf(lcd_buffer," ");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+ }
+ else if(menu_cursor == 5){
+ LCDGotoXY(0,0);
+ LCDsendChar(7);
+ menu_cursor = 1;
+ LCDGotoXY(19,1);
+ sprintf(lcd_buffer," ");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+ }
+ }
+ LCDGotoXY(1,0);
+ sprintf(lcd_buffer,"GAUGES TRIALS");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+
+ LCDGotoXY(1,1);
+ sprintf(lcd_buffer,"DIAGNOSTICS UNITS");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+
+ LCDGotoXY(1,2);
+ sprintf(lcd_buffer,"ABOUT");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+
+ LCDGotoXY(15,3);
+ sprintf(lcd_buffer,"ENTER");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+
+ if(button_pressed == Right){
+ if(menu_cursor == 1){
+ if(metric_flag == 0){
+ state = St_Print_Gauges_Eng;
+ menu = 2;
+ }
+ else if (metric_flag == 1){
+ state = St_Print_Gauges_Metric;
+ menu = 7;
+ }
+ menu_cursor = 1;
+ LCDclr();
+ }
+ else if(menu_cursor == 2){
+ state = St_Print_Engine_Codes;
+ menu = 3;
+ menu_cursor = 1;
+ LCDclr();
+ LCDGotoXY(0,1);
+ LCDsendChar(7);
+ }
+ else if(menu_cursor == 3){
+ state = St_Print_About;
+ menu = 4;
+ menu_cursor = 1;
+ LCDclr();
+ }
+ else if(menu_cursor == 4){
+ state = St_Print_Time_Trials;
+ menu = 5;
+ menu_cursor = 1;
+ LCDclr();
+ LCDGotoXY(0,1);
+ LCDsendChar(7);
+ }
+ else if(menu_cursor == 5){
+ LCDclr();
+ state = St_Print_Units;
+ menu = 6;
+ menu_cursor = 1;
+ LCDGotoXY(0,1);
+ LCDsendChar(7);
+ }
+ }
+ break;
+
+ case St_Print_Gauges_Eng:
+
+ LCDGotoXY(0,0);
+ sprintf(lcd_buffer,"MPH RPM");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+
+ LCDGotoXY(0,1);
+ sprintf(lcd_buffer,"VOLT TEMP");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+
+ LCDGotoXY(18,1);
+ sprintf(lcd_buffer,"ßF");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+
+ LCDGotoXY(0,3);
+ sprintf(lcd_buffer,"MENU");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+
+ state = St_Trans_Speed;
+ break;
+
+ case St_Trans_Speed:
+ uart0_send_byte_array(Speed,6);
+ state = St_Rec_Speed;
+ break;
+
+ case St_Rec_Speed:
+ if(UCSR0A & (1<<RXC0)) {
+ uart0_parse_rx(UDR0);
+ }
+ break;
+
+ case St_Trans_Rpm:
+ if(button_pressed == Left){
+ state = St_Print_Menu;
+ LCDclr();
+ menu = 1;
+ menu_cursor = 1;
+
+ LCDGotoXY(0,0);
+ LCDsendChar(7);
+
+ mph = 0;
+ rpm = 0;
+ mpg = 0;
+ }
+
+ uart0_send_byte_array(Rpm,6);
+ state = St_Rec_Rpm;
+
+ break;
+
+ case St_Rec_Rpm:
+ if(UCSR0A & (1<<RXC0)) {
+ uart0_parse_rx(UDR0);
+ }
+ break;
+
+ case St_Trans_Volt:
+ if(button_pressed == Left){
+ state = St_Print_Menu;
+ LCDclr();
+ menu = 1;
+ menu_cursor = 1;
+
+ LCDGotoXY(0,0);
+ LCDsendChar(7);
+
+ mph = 0;
+ rpm = 0;
+ mpg = 0;
+ }
+
+ uart0_send_byte_array(Volt,5);
+ state = St_Rec_Volt;
+ break;
+
+ case St_Rec_Volt:
+ if(UCSR0A & (1<<RXC0)) {
+ uart0_parse_rx(UDR0);
+ }
+ break;
+
+ case St_Trans_Mpg:
+ uart0_send_byte_array(Volt,5);
+ state = St_Rec_Mpg;
+ break;
+
+ case St_Rec_Mpg:
+ if(UCSR0A & (1<<RXC0)) {
+ uart0_parse_rx(UDR0);
+ }
+ break;
+
+ case St_Print_Units:
+
+ LCDGotoXY(3,0);
+ sprintf(lcd_buffer,"UNIT SELECTION");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+
+ LCDGotoXY(1,1);
+ sprintf(lcd_buffer,"ENGLISH METRIC");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+
+ if(metric_flag == 0){
+ LCDGotoXY(0,2);
+ sprintf(lcd_buffer,"Current: English");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+ }
+ else if(metric_flag == 1){
+ LCDGotoXY(0,2);
+ sprintf(lcd_buffer,"Current: Metric");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+ }
+ LCDGotoXY(0,3);
+ sprintf(lcd_buffer,"MENU SELECT");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+
+ if(button_pressed == Up){
+ if(menu_cursor == 1){
+ LCDGotoXY(19,1);
+ LCDsendChar(6);
+ menu_cursor = 2;
+ LCDGotoXY(0,1);
+ sprintf(lcd_buffer," ");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+ }
+ else if(menu_cursor == 2){
+ LCDGotoXY(0,1);
+ LCDsendChar(7);
+ menu_cursor = 1;
+ LCDGotoXY(19,1);
+ sprintf(lcd_buffer," ");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+ }
+ }
+ else if(button_pressed == Down){
+ if(menu_cursor == 1){
+ LCDGotoXY(19,1);
+ LCDsendChar(6);
+ menu_cursor = 2;
+ LCDGotoXY(0,1);
+ sprintf(lcd_buffer," ");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+ }
+ else if(menu_cursor == 2){
+ LCDGotoXY(0,1);
+ LCDsendChar(7);
+ menu_cursor = 1;
+ LCDGotoXY(19,1);
+ sprintf(lcd_buffer," ");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+ }
+ }
+ else if(button_pressed == Left){
+ state = St_Print_Menu;
+ LCDclr();
+ LCDGotoXY(0,0);
+ LCDsendChar(7);
+ menu = 1;
+ menu_cursor = 1;
+ }
+
+ else if(button_pressed == Right){
+ if(menu_cursor == 1)
+ metric_flag = 0;
+ else if (menu_cursor == 2)
+ metric_flag = 1;
+ }
+ break;
+
+ case St_Print_Time_Trials:
+
+ if(button_pressed == Up){
+ if(menu_cursor == 1){
+ LCDGotoXY(19,1);
+ LCDsendChar(6);
+ menu_cursor = 2;
+ LCDGotoXY(0,1);
+ sprintf(lcd_buffer," ");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+ }
+ else if(menu_cursor == 2){
+ LCDGotoXY(0,1);
+ LCDsendChar(7);
+ menu_cursor = 1;
+ LCDGotoXY(19,1);
+ sprintf(lcd_buffer," ");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+ }
+ }
+ else if(button_pressed == Down){
+ if(menu_cursor == 1){
+ LCDGotoXY(19,1);
+ LCDsendChar(6);
+ menu_cursor = 2;
+ LCDGotoXY(0,1);
+ sprintf(lcd_buffer," ");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+ }
+ else if(menu_cursor == 2){
+ LCDGotoXY(0,1);
+ LCDsendChar(7);
+ menu_cursor = 1;
+ LCDGotoXY(19,1);
+ sprintf(lcd_buffer," ");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+ }
+ }
+ LCDGotoXY(4,0);
+ sprintf(lcd_buffer,"Timed Trials");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+
+ LCDGotoXY(1,1);
+ sprintf(lcd_buffer,"0-60 mph ");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+
+ LCDGotoXY(0,3);
+ sprintf(lcd_buffer,"MENU BEGIN");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+
+ if(button_pressed == Left){
+ state = St_Print_Menu;
+ LCDclr();
+ menu = 1;
+ menu_cursor = 1;
+
+ LCDGotoXY(0,0);
+ LCDsendChar(7);
+ }
+ else if(button_pressed == Right){
+ if(menu_cursor == 1){
+ state = St_Print_Timer60;
+ menu = 8;
+ LCDclr();
+ }
+ else if(menu_cursor == 2){
+ state = St_Print_Timer_Mile;
+ LCDclr();
+ }
+ }
+ break;
+
+ case St_Print_Gauges_Metric:
+
+ LCDGotoXY(0,0);
+ sprintf(lcd_buffer,"KPH RPM");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+
+ LCDGotoXY(0,1);
+ sprintf(lcd_buffer,"VOLT TEMP");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+
+ LCDGotoXY(18,1);
+ sprintf(lcd_buffer,"ßC");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+
+ LCDGotoXY(0,3);
+ sprintf(lcd_buffer,"MENU");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+
+ if(button_pressed == Left){
+ state = St_Print_Menu;
+ LCDclr();
+ menu = 1;
+ menu_cursor = 1;
+ LCDGotoXY(0,0);
+ LCDsendChar(7);
+ kph = 0;
+ rpm = 0;
+ }
+ state = St_Trans_Speed;
+ break;
+
+ case St_Print_Engine_Codes:
+
+ if(button_pressed == Up){
+ if(menu_cursor == 1){
+ LCDGotoXY(19,1);
+ LCDsendChar(6);
+ menu_cursor = 2;
+ LCDGotoXY(0,1);
+ sprintf(lcd_buffer," ");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+ }
+
+ else if(menu_cursor == 2){
+ LCDGotoXY(0,1);
+ LCDsendChar(7);
+ menu_cursor = 1;
+ LCDGotoXY(19,1);
+ sprintf(lcd_buffer," ");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+ }
+ }
+
+ else if(button_pressed == Down){
+ if(menu_cursor == 1){
+ LCDGotoXY(19,1);
+ LCDsendChar(6);
+ menu_cursor = 2;
+ LCDGotoXY(0,1);
+ sprintf(lcd_buffer," ");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+ }
+
+ else if(menu_cursor == 2){
+ LCDGotoXY(0,1);
+ LCDsendChar(7);
+ menu_cursor = 1;
+ LCDGotoXY(19,1);
+ sprintf(lcd_buffer," ");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+ }
+ }
+ LCDGotoXY(0,0);
+ sprintf(lcd_buffer," ENGINE CODES");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+
+ LCDGotoXY(1,1);
+ sprintf(lcd_buffer,"CHECK CLEAR");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+
+ LCDGotoXY(0,3);
+ sprintf(lcd_buffer,"MENU ENTER");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+
+ if(button_pressed == Left){
+ state = St_Print_Menu;
+ LCDclr();
+ LCDGotoXY(0,0);
+ LCDsendChar(7);
+ menu = 1;
+ menu_cursor = 1;
+ }
+
+ else if(button_pressed == Right){
+ if(menu_cursor == 1){
+ state = St_Trans_Check_Engine;
+ LCDclr();
+ }
+ else if (menu_cursor == 2){
+ state = St_Print_Disclaimer;
+ LCDclr();
+ }
+ }
+ break;
+
+ case St_Print_Disclaimer:
+
+ LCDGotoXY(0,0);
+ sprintf(lcd_buffer,"-----DISCLAIMER-----");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+
+ LCDGotoXY(3,1);
+ sprintf(lcd_buffer,"HAS THE ENGINE");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+
+ LCDGotoXY(3,2);
+ sprintf(lcd_buffer,"BEEN REPAIRED?");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+
+ LCDGotoXY(0,3);
+ sprintf(lcd_buffer,"YES NO");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+
+ if(button_pressed == Left){
+ state = St_Trans_Clear;
+ }
+ else if (button_pressed == Right){
+ state = St_Print_Engine_Codes;
+ LCDclr();
+ LCDGotoXY(0,1);
+ LCDsendChar(7);
+ menu = 1;
+ menu_cursor = 1;
+ }
+ break;
+
+ case St_Print_Timer60:
+
+ if(trial_flag == 3){
+ state = St_Print_Timer60;
+ LCDGotoXY(0,0);
+ sprintf(lcd_buffer,"-TEST RUN COMPLETED-");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+
+ LCDGotoXY(0,3);
+ sprintf(lcd_buffer,"MENU ");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+ }
+ else{
+ state = St_Trans_Speed;
+ LCDGotoXY(0,0);
+ sprintf(lcd_buffer,"--0 to 60 MPH TIME--");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+
+ LCDGotoXY(0,3);
+ sprintf(lcd_buffer,"MENU ");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+ }
+ if(button_pressed == Left){
+ state = St_Print_Menu;
+ LCDclr();
+ menu = 1;
+ menu_cursor = 1;
+ trial_flag = 0;
+ timeOn = 0;
+ milliseconds = 0;
+ seconds = 0;
+
+ LCDGotoXY(0,0);
+ LCDsendChar(7);
+
+ mph = 0;
+ kph = 0;
+ }
+ break;
+
+ case St_Print_Timer_Mile:
+
+ LCDGotoXY(3,0);
+ sprintf(lcd_buffer,"1/4 MILE TRIAL");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+
+ LCDGotoXY(2,1);
+ sprintf(lcd_buffer,"%i seconds",mile_time);
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+
+ LCDGotoXY(3,2);
+ sprintf(lcd_buffer,"%i MPH", mile_speed);
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+
+ LCDGotoXY(0,3);
+ sprintf(lcd_buffer,"MENU STOP");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+
+ break;
+
+ case St_Print_About:
+ rx_buffer_index = 0;
+ if(menu_cursor == 1){
+ LCDGotoXY(5,0);
+ sprintf(lcd_buffer,"ID NUMBERS");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+
+ LCDGotoXY(0,2);
+ sprintf(lcd_buffer,"S/N: ");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+
+ LCDGotoXY(0,3);
+ sprintf(lcd_buffer,"MENU ");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+ state = St_Trans_SN;
+ }
+
+ else if (menu_cursor == 2)
+ St_Print_About;
+ if(button_pressed == Left){
+ state = St_Print_Menu;
+ menu = 1;
+ menu_cursor = 1;
+ LCDclr();
+ LCDGotoXY(0,0);
+ LCDsendChar(7);
+ }
+ break;
+
+ case St_Trans_SN:
+ rx_buffer_index = 0;
+ uart0_send_byte_array(Serial,5);
+ state = St_Rec_SN;
+
+ break;
+
+ case St_Rec_SN:
+ if(UCSR0A & (1<<RXC0)) {
+ uart0_parse_rx(UDR0);
+ }
+ break;
+
+ case St_Trans_Clear:
+ uart0_send_byte_array(Clear,3);
+ state = St_Rec_Clear;
+ break;
+
+ case St_Rec_Clear:
+ if(UCSR0A & (1<<RXC0)) {
+ uart0_parse_rx(UDR0);
+ }
+ break;
+
+ case St_Trans_Engine_Temp:
+ if(button_pressed == Left){
+ state = St_Print_Menu;
+ LCDclr();
+ menu = 1;
+ menu_cursor = 1;
+
+ LCDGotoXY(0,0);
+ LCDsendChar(7);
+
+ mph = 0;
+ rpm = 0;
+ mpg = 0;
+ }
+
+ uart0_send_byte_array(EngineTemp,6);
+ state = St_Rec_Engine_Temp;
+
+ break;
+
+ case St_Rec_Engine_Temp:
+
+ if(UCSR0A & (1<<RXC0)) {
+ uart0_parse_rx(UDR0);
+ }
+
+ break;
+
+ case St_Codes_Cleared:
+
+ LCDGotoXY(0,0);
+ sprintf(lcd_buffer,"********************");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+
+ LCDGotoXY(0,1);
+ sprintf(lcd_buffer,"* CODE CLEAR *");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+
+ LCDGotoXY(0,2);
+ sprintf(lcd_buffer,"* SUCCESSFUL *");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+
+ LCDGotoXY(0,3);
+ sprintf(lcd_buffer,"********************");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+
+ _delay_ms(500);
+
+ state = St_Print_Menu;
+ LCDclr();
+ LCDGotoXY(0,0);
+ LCDsendChar(7);
+ menu = 1;
+ menu_cursor = 1;
+
+ break;
+
+ case St_Codes_Not_Cleared:
+
+ LCDGotoXY(0,0);
+ sprintf(lcd_buffer,"********************");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+
+ LCDGotoXY(0,1);
+ sprintf(lcd_buffer,"* CODE CLEAR *");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+
+ LCDGotoXY(0,2);
+ sprintf(lcd_buffer,"%X", rx_buffer);
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+
+ LCDGotoXY(0,3);
+ sprintf(lcd_buffer,"********************");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+
+ _delay_ms(500);
+
+ state = St_Print_Menu;
+ LCDclr();
+ LCDGotoXY(0,0);
+ LCDsendChar(7);
+ menu = 1;
+ menu_cursor = 1;
+
+ break;
+
+ case St_Trans_Check_Engine:
+
+ uart0_send_byte_array(Check,3);
+ state = St_Rec_Check_Engine;
+
+ break;
+
+ case St_Rec_Check_Engine:
+
+ if(UCSR0A & (1<<RXC0)) {
+ uart0_parse_rx(UDR0);
+ }
+
+ break;
+
+ case St_Print_Check_Engine:
+
+ LCDGotoXY(0,0);
+ sprintf(lcd_buffer," Engine Codes ");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+
+ LCDGotoXY(0,1);
+ sprintf(lcd_buffer," %X%X %X%X %X%X ",error1,error2,error3,error4,error5,error6,error7);
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+
+ LCDGotoXY(0,3);
+ sprintf(lcd_buffer,"MENU");
+ LCDstring(lcd_buffer, strlen(lcd_buffer));
+
+ if(button_pressed == Left){
+ state = St_Print_Menu;
+ LCDclr();
+ menu = 1;
+ menu_cursor = 1;
+
+ LCDGotoXY(0,0);
+ LCDsendChar(7);
+ }
+ break;
+ }
+}
+
+void init_lcd(void) {
+ LCDinit(); //initialize the display
+ LCDcursorOFF();
+ LCDclr(); //clear the display
+}
+
+/******************************************************************************************/
+/**
+ * Initialize UART RX
+ */
+void init_uart0_rxtx(void){
+ UBRR0L = 25; // 38400 Baud Rate for 16 MHz Clock
+
+ UCSR0A = 0b00000000;// 7 - UART RX complete flag
+ // 6 - UART TX complete flag
+ // 5 - UART DRE flag
+ // 4 - Frame error flag
+ // 3 - Data overrun flag
+ // 2 - Parity error flag
+ // 1 - Double UART speed mode
+ // 0 - Multi processor communication mode
+
+ UCSR0B = 0b00011000; // 7 - RX Complete Interrupt Enable
+ // 6 - TX Complete Interrupt Enable
+ // 5 - UART DRE Interrupt Enable
+ // 4 - Enable receiver
+ // 3 - Enable transmitter
+ // 2 - Character size
+ // 1:0 - Ninth data bit
+
+ UCSR0C = 0b00000110;// 7:6 - UART Mode Select
+ // 00 - Asynchronous UART
+ // 01 - Synchronous UART
+ // 10 - Reserved
+ // 11 - Master SPI
+ // 5:4 - Parity mode
+ // 00 - Disabled
+ // 01 - Reserved
+ // 10 - Enabled, Even
+ // 11 - Enabled, Odd
+ // 3 - Select stop bit length
+ // 0 - 1-bit
+ // 1 - 2-bit
+ // 2:1 - Character size, with UCSRB.2
+ // 000 - 5 bit
+ // 001 - 6 bit
+ // 010 - 7 bit
+ // 011 - 8 bit
+ // 100 - Reserved
+ // 101 - Reserved
+ // 110 - Reserved
+ // 111 - 9 bit
+ // 0 - Select clock polarity
+ // 0 - Rising XCK edge
+ // 1 - Falling XCK edge
+}
+