====== Suhtluskanal ====== Järgnevalt on toodud UART jadaliidese kasutamise näide. Programm võimaldab edastada tekstisõnumeid AVR ja teise AVR-i või arvuti vahel. Kasutatud on viikude, LCD ja USART teeke. #include #include #include #include "pin.h" #include "lcd.h" #include "usart.h" // Pin configuration #define BUTTON_CHAR PORTPIN(C, 0) #define BUTTON_NEXT PORTPIN(C, 1) #define BUTTON_ENTER PORTPIN(C, 2) // Characters list #define NUM_CHARS 26 const char chars[NUM_CHARS] = " ABCDEFGHIJKLMOPQRSTUVWXYZ"; // General configuration #define MAX_MESSAGE 16 // // My message variables // char my_message[MAX_MESSAGE + 3]; unsigned char my_char_index = 0; unsigned char my_char_position = 0; // // Incoming message variables char rx_message[MAX_MESSAGE + 3]; unsigned char rx_char_position = 0; // // Resetting my message // void reset_my_message() { // Fill the message with nulls for (my_char_position = 0; my_char_position < MAX_MESSAGE + 3; my_char_position++) { my_message[my_char_position] = 0; } // Reset indexes my_char_position = 0; my_char_index = 0; } // // Displaying my current message // void display_my_message() { lcd_gotoxy(0, 0); lcd_puts(" "); lcd_gotoxy(0, 0); lcd_puts(my_message); lcd_gotoxy(my_char_position, 0); } // // Resetting received message // void reset_rx_message() { // Fill the message with nulls for (rx_char_position = 0; rx_char_position < MAX_MESSAGE + 3; rx_char_position++) { rx_message[rx_char_position] = 0; } // Reset position rx_char_position = 0; } // // Displaying received message // void display_rx_message() { lcd_gotoxy(0, 1); lcd_puts(" "); lcd_gotoxy(0, 1); lcd_puts(rx_message); } // // Main function // int main(void) { // Button state variables unsigned char button_char_new, button_char_old = 1; unsigned char button_next_new, button_next_old = 1; unsigned char button_enter_new, button_enter_old = 1; // LCD configuring lcd_init(LCD_DISP_ON_BLINK); lcd_clrscr(); // UART configuring usart0_init_async(USART_DATABITS_8, USART_STOPBITS_1, USART_PARITY_NONE, 9600); // Buttons configuring pin_setup_input(BUTTON_CHAR); pin_setup_input(BUTTON_NEXT); pin_setup_input(BUTTON_ENTER); // Reset reset_my_message(); reset_rx_message(); // Endless cycle while (1) { // Get new button values pin_get_value(BUTTON_CHAR, button_char_new); pin_get_value(BUTTON_NEXT, button_next_new); pin_get_value(BUTTON_ENTER, button_enter_new); // Char selection button pressed ? if (!button_char_new && button_char_old) { // Change char my_char_index++; // Wrap if (my_char_index >= NUM_CHARS) { my_char_index = 0; } // Update message my_message[my_char_position] = chars[my_char_index]; // Display message text display_my_message(); // Pause //_delay_ms(100); } // Next char button pressed ? if (!button_next_new && button_next_old) { // Increase current position my_char_position++; // If message is full, restart if (my_char_position >= MAX_MESSAGE) { reset_my_message(); } else { // Fill new places with space my_char_index = 0; my_message[my_char_position] = chars[my_char_index]; } // Display message text display_my_message(); // Pause //_delay_ms(100); } // Enter button pressed ? if (!button_enter_new && button_enter_old) { // Send message if it's not empty if ((my_char_position > 0) || (my_message[0] != 0)) { // Inser line feed and carriage return before terminator my_message[my_char_position + 1] = '\r'; my_message[my_char_position + 2] = '\n'; my_message[my_char_position + 3] = 0; // Send message usart0_send_text(my_message); // Restart reset_my_message(); display_my_message(); } } // Remember old button values button_char_old = button_char_new; button_next_old = button_next_new; button_enter_old = button_enter_new; // Got data ? if (usart0_has_data()) { // Read char rx_message[rx_char_position++] = usart0_read_char(); // Show message if it's too long or the delimiter has arrived if ((rx_char_position >= MAX_MESSAGE + 3) || ((rx_message[rx_char_position - 2] == '\r') && (rx_message[rx_char_position - 1] == '\n'))) { // Replace line chars with null terminator rx_message[rx_char_position - 2] = 0; rx_message[rx_char_position - 1] = 0; // Display message display_rx_message(); reset_rx_message(); } } } }