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.
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 ....
}
}
Verbesserungsvorschläge oder Ergänzungen sind wilkommen.
Ich denke das Testprogramm ist eine gute möglichkeit um die
Hardware (mit C) zu Testen.
mfg
mit freundlichen Grüßen
Lesezeichen