PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RN-Control 1.4 Mega32 & RN-KeyLCD Tastaturabfrage RS232



brundle
04.04.2005, 10:22
Hallo zusammen :-))

Ich habe das RN-Control 1.4 Mega32 Board
mit dem RN-KeyLCD Tastaturabfrage über RS232 verbunden.

Ich will die Tastatur des RN-KeyLCD abfragen.

Zeichen auf das LCD kann ich bereits senden.

Hat jemand ein paar C Codes für die Abfrage der Tastatur
für das RN-KeyLCD über RS-232.

Bin für jeden Codeschnipsel ;-) Dankbar

mfg
mit freundlichen Grüßen

brundle
05.04.2005, 13:59
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?
A:Das Programm liest von der 3x4 Matrix-Tastatur und gibt das Zeichen
sofort auf das LCD-Display aus.




/* 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

14.09.2005, 13:27
Hallo ich hebe eine Frage
ich benutze ein LCD von Electronic assembly und ich brauche eine Funktion die die Cursor bewegt ? kann jemand mir helfen
danke