Mahlzeit,
und wieder habe ich mir selbst geholfen![]()
Hier mein Test-Programm für die Kombination:
RN-Control v 1.4 16 MHz //oder andere Boards
und
RN-KEY-LCD
Kommunikation über ein 3-Poliges Kabel RS232.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! RN-Control TX an RN-KEY-LCD RX!
! RN-Control RX an RN-KEY-LCD TX!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Q:Was macht das Programm?
Aas Programm liest von der 3x4 Matrix-Tastatur und gibt das Zeichen
sofort auf das LCD-Display aus.
Verbesserungsvorschläge oder Ergänzungen sind wilkommen.Code:/* main.c 04.04.2005 Test-Programm für die Kombination: RN-Control v 1.4 16 MHz //oder andere Boards und RN-KEY-LCD Kommunikation über ein 3-Poliges Kabel RS232. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! RN-Control TX an RN-KEY-LCD RX! ! RN-Control RX an RN-KEY-LCD TX! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Q:Was macht das Programm? A:Das Programm liest von der 3x4 Matrix-Tastatur und gibt das Zeichen sofort auf das LCD-Display aus. */ #include <avr/io.h> #include <avr/interrupt.h> #include <avr/signal.h> #include <stdlib.h> #include <string.h> #include <inttypes.h> #define SIZE 16 unsigned char c; /*******************************************************************/ /******************** Funktionen *****************************/ /*******************************************************************/ /*USART initialisieren*/ void init_USART() { /* setting up the USART */ /* 16Mhz 9600 Baud No Flow Control 8 data 1 stop bit */ UBRRL=103; UCSRB=_BV(TXEN); /* Zusaetzlich zur Baudrateneinstellung und der weiteren Initialisierung: */ UCSRB |= ( 1 << RXEN ); return; } /* Zeichen empfangen */ uint8_t Usart_Rx(void) { unsigned char Zeichen =' '; while (!(UCSRA & (1<<RXC))); // warten bis Zeichen verfuegbar Zeichen = UDR; return Zeichen; // Zeichen aus UDR an Aufrufer zurueckgeben } /* Zeichen senden */ uint8_t Usart_Tx(unsigned char c) { while ( !(UCSRA & _BV(UDRE)) ); /* warten bis Senden moeglich */ UDR = c; /* Schreibt das Zeichen x auf die Schnittstelle */ } int usartprint(char *buf,int len) { int i; for (i=0;i<len;i++) { /* if the UDRE bit is set this means that the UDR buffer is * empty. New data can be transmitted */ while ( !(UCSRA & _BV(UDRE)) ) ; UDR = buf[i]; } return i; } int usartprintnl(void) /* print new line */ { while (! (UCSRA & _BV(UDRE)) ) ; UDR = 10; /* LF */ while (! (UCSRA & _BV(UDRE)) ) ; UDR = 13; /* CR */ return 2; } /* Funktionen für RN-KEYLCD*/ /* Display löschen*/ void clearlcd(void) { while (! (UCSRA & _BV(UDRE)) ) ; UDR = 12; return; } /* Cursor nach links auf Spalte 1 setzen*/ void Carriage_Return(void) { while (! (UCSRA & _BV(UDRE)) ) ; UDR = 13; return; } /*Cursor eine Zeile tiefer*/ void Linefeed(void) { while (! (UCSRA & _BV(UDRE)) ) ; UDR = 13; return; } /*Cursor im LCD positionieren*/ void Cursor_xy(int x, int y) { while (! (UCSRA & _BV(UDRE)) ) ; UDR = 27; while (! (UCSRA & _BV(UDRE)) ) ; UDR = 79; while (! (UCSRA & _BV(UDRE)) ) ; UDR = x; /* x-Position: Zeile 1 bis 20*/ while (! (UCSRA & _BV(UDRE)) ) ; UDR = y; /* y-Position: Spalte 1 bis 4*/ return; } /* Funktionen für RN-KEYLCD ENDE.*/ /*Tastaturabfrage*/ int Tastaturabfrage(void) { c=Usart_Rx(); /*liest Zeichen von der Tastatur*/ switch(c) /*Vergleiche empfangenes Zeichen*/ { case '1': return 1; case '2': return 2; case '3': return 3; case '4': return 4; case '5': return 5; case '6': return 6; case '7': return 7; case '8': return 8; case '9': return 9; case '0': return 0; case '*': return 42; /*# etspricht 42DEZ, bzw. 2AHEX*/ case '#': return 35; /*# etspricht 35DEZ, bzw. 23HEX*/ } } /*Tastaturabfrage ENDE.*/ /*******************************************************************/ /******************** Funktionen ***************************/ /********************** ENDE ******************************/ /*******************************************************************/ /********************** HAUPTPROGRAMM ******************************/ /*******************************************************************/ int main(void) { init_USART(); /* USART initialisieren */ clearlcd(); /*löscht LCD*/ //Cursor_xy( 5, 3); //usartprint("Hello World",11); while(1) /*Beton-Schleife*/ { c=Usart_Rx();// Zeichen von der Tastatur lesen und ... Usart_Tx(c); // erkanntes Zeichen wieder an das LCD über RS232 senden // //if((Tastaturabfrage())==35) //usartprint("Hello World #",11); //if((Tastaturabfrage())==42) //clearlcd(); /*löscht LCD*/ //if((Tastaturabfrage())==0) //usartprint("Taste 0 erkannt",15); //... und so weiter .... } }
Ich denke das Testprogramm ist eine gute möglichkeit um die
Hardware (mit C) zu Testen.
mfg
mit freundlichen Grüßen






Zitieren

Lesezeichen