Forum: Compiler & IDEs Hilfe, Wie programmiere ich Taster um Namen auf LCD anzeigen zu lassen ?


von Marko S. (mikrochamb)


Lesenswert?

Hey liebes mikro Team :)

habe ein großes Problem und weiss gerade selber nicht weiter was ich 
falsch mache...

Ich habe ein Mikrocontroller von MyAVR MK2.0 auf dem ich 2 Taster bzw. 
Schalter habe.

Meine Aufgabe ist es für jeden Schaltzustand einen Namen auf einem LCD - 
Display anzuzeigen. Bis jetzt kann ich gerade mal 2. Schaltzustände 
abfragen und das noch nicht mal ganz korrekt.

Meine Bibliotheken bestehen aus den grunlegenden und eine selbst 
definierte
lcd.h,lcd.c Datei. Diese Dateien liegen im Anhang.


// ========================================
=> Wie programmiere ich die 2 Schalter, dass
ich z.B bei 0 ; 0 = Welcome,
            0 ; 1 = Name1,
            1 ; 0 = Name2,
            1 ; 1 = Name3 mir auf einem LCD-Display angezeigt bekomme ??
// ===================================================================

im Anhang = lcd.h ,lcd.c

schon mal vorab danke für die Hilfe :)

lg mikro :)


// ================================================================ //
// Anhang
// ================================================================ //

=> 1) Hauptdatei + lcd.c unter Funktionen
1
#define F_CPU   3686400UL
2
#include <avr/io.h>
3
#include <stdio.h>
4
#include <avr/delay.h>
5
#include "lcd.h"
6
7
8
// ====================================================== //
9
// Hauptprogramm
10
// ====================================================== //
11
int main(void)
12
{
13
14
//lcd_init();
15
PIND |= (1<<PD3) | (1<<PD4);
16
17
while(1)
18
{
19
20
// # Leerlauf ========================================== //
21
if( (PIND &(1<<PD3 |1<<PD4)))
22
{
23
lcd_init();
24
25
lcd_clear();
26
lcd_write_s("Welcome,Switch ?");
27
}
28
// ====================================================== //
29
30
// # Taster 1 =========================================== //                              
31
if(!(PIND &(1<<PD3)))                    
32
{
33
lcd_init();
34
35
lcd_clear();                        
36
lcd_write_s("Name1");                 
37
PORTD |= (1<<PD3);
38
}                              
39
// ====================================================== //
40
41
42
// # Taster 2 =========================================== //
43
if(! (PIND &(1<<PD4)))
44
{
45
lcd_init();  
46
  
47
lcd_clear();
48
lcd_write_s("Name2");
49
PORTD |= (1<<PD4);
50
PORTD |= (1<<PD3);
51
  
52
}
53
// ====================================================== //
54
55
// # Taster 1 + # Taster 2 ============================== //
56
57
if(! (PIND &(1<<PD3) | (1<<PD4)))
58
{
59
lcd_init();
60
61
lcd_clear();
62
lcd_write_s("Root User");
63
}
64
// ====================================================== //
65
66
67
68
69
  
70
} // Ende Endlosschleife
71
72
} // Ende Hauptprogramm
73
74
75
// ====================================================== //
76
// Funktionen Deklaration
77
// ====================================================== // 
78
79
80
void lcd_init(void)
81
{
82
    // Port D = Ausgang
83
    DDRD=0xff; // alle gesetzten Bits werden auf Ausgang gesetzt
84
    PORTD= (1<<PD3) | (1<<PD4);
85
    // warten bist LCD-Controller gebootet
86
    wait_ms(200);        
87
    // 4-BitModus einschalten
88
    PORTD=0x20;            
89
    // Schreibsignal
90
    PORTD |= (1<<3);            //sbi(PORTD,3);
91
  PORTD &= ~(1<<3);            //cbi(PORTD,3);
92
  
93
  PORTD |= (1<<4);            //sbi(PORTD,3);
94
  PORTD &= ~(1<<4);  
95
  
96
    wait_ms(5);            // Zeit zum Umschalten lassen
97
    // ab hier im 4-Bit-Modus
98
    lcd_cmd(0x28);        // Funktions-Set: 2 Zeilen, 5x7 Matrix, 4 Bit
99
    //lcd_off();
100
    lcd_cmd(0x06);        // Entry Mode => Verschiebung des Cursors
101
    lcd_on();
102
    lcd_clear();
103
}
104
105
void lcd_send(char data)
106
{
107
    // aktuelles RS ermitteln
108
    char rs=PORTD;
109
    rs&=4;
110
    // High-Teil senden
111
    char tmp=data;
112
    tmp&=0xf0;
113
    tmp|=rs;
114
    PORTD=tmp;
115
    // Schreibsignal
116
  PORTD |= (1<<3);            //sbi(PORTD,3);
117
  PORTD &= ~(1<<3);            //cbi(PORTD,3);
118
    // Low-Teil senden
119
    tmp=data;
120
    tmp&=0x0f;
121
    tmp*=16;
122
    tmp|=rs;
123
    PORTD=tmp;
124
    // Schreibsignal
125
    PORTD |= (1<<3);            //sbi(PORTD,3);
126
  PORTD &= ~(1<<3);            //cbi(PORTD,3);
127
    // verarbeiten lassen
128
    wait_ms(1);
129
}
130
131
//---------------------------------------------------------------------------
132
//    lcd_write(..) - sendet ein Zeichen (Daten) an LCD
133
//---------------------------------------------------------------------------
134
void lcd_write(char text)
135
{
136
    PORTD |= (1<<2);    //sbi(PORTD,2);        // RS setzen = Daten
137
    lcd_send(text);        // senden
138
}
139
//---------------------------------------------------------------------------
140
//    lcd_write(..) - sendet eine Zeichenkette an LCD
141
//    Die Zeichenkette muss mit 0x00 abgeschlossen sein
142
//---------------------------------------------------------------------------
143
void lcd_write_s(char* pText)
144
{
145
    while(pText[0]!=0)
146
    {
147
        lcd_write(pText[0]);
148
        pText++;
149
    }
150
}
151
152
//---------------------------------------------------------------------------
153
//    lcd_clear(..) - löscht die Anzeige im LCD
154
//---------------------------------------------------------------------------
155
void lcd_clear(void)
156
{
157
    lcd_cmd(0x01);
158
    wait_ms(2);            // warten
159
}
160
//---------------------------------------------------------------------------
161
//    lcd_on(..) - schaltet das LCD an
162
//---------------------------------------------------------------------------
163
void lcd_on(void)
164
{
165
    lcd_cmd(0x0E);
166
}
167
//---------------------------------------------------------------------------
168
//    lcd_off(..) - schaltet das LCD aus
169
//---------------------------------------------------------------------------
170
void lcd_off(void)
171
{
172
    lcd_cmd(0x08);
173
}
174
//---------------------------------------------------------------------------
175
//    lcd_goto(..) - setzt die Cursorposition
176
//---------------------------------------------------------------------------
177
void lcd_goto(int row, int col)
178
{
179
    row--;                // Null-basierend
180
    row&=0x01;            // sicherheitshalber
181
    row*=0x40;            // Zeile nach Bit 6 bringen
182
    col--;                // Null-basierend
183
    col&=0x0f;            // sicherheitshalber
184
    char tmp=row|col;
185
    tmp|=0x80;            // Cursor setzen
186
    lcd_cmd(tmp);        // senden
187
}
188
//---------------------------------------------------------------------------
189
//    lcd_init(..) - Schaltet die Ports und Initialisiert das LCD
190
//---------------------------------------------------------------------------
191
192
//---------------------------------------------------------------------------
193
//    lcd_charDef(..) - initialisiert benutzerdefinierte Zeichen für das LCD
194
//---------------------------------------------------------------------------
195
void lcd_charDef(void)
196
{
197
    // 1. Kommando CGRAM + Adresse setzen
198
    // 2. Punktmatrix-Daten laden
199
    unsigned char charSet[64]={    
200
                                0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,
201
                                0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,
202
                                0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,
203
                                0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,
204
                                0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,
205
                                0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
206
                                0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
207
                                0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
208
                              };
209
    int i=0;
210
    for (i=0;i<64;i++)
211
    {
212
        lcd_cmd(0x40+i);              // cmd 0x40 + Adr
213
        lcd_write(charSet[i]);        // Pixel
214
    }
215
}
216
//---------------------------------------------------------------------------
217
218
//---------------------------------------------------------------------------
219
void wait_ms(int miliSec)
220
{
221
    _delay_loop_2( 1*(F_CPU/(1000/4)) * miliSec);    // 4 Zyklen warteschleife
222
}
223
//////////////////////////////////////////////////////////////////////////////
224
//    lcd_send(..) - sendet ein Byte an LCD im 4-Bit-Modus
225
//    nicht direkt aufrufen sondern lcd_cmd oder lcd_write nutzen
226
//---------------------------------------------------------------------------
227
228
//---------------------------------------------------------------------------
229
//    lcd_cmd(..) - sendet ein Kommando an LCD
230
//---------------------------------------------------------------------------
231
void lcd_cmd(char cmd)
232
{
233
    PORTD &= ~(1<<2);    //cbi(PORTD,2);        // RS löschen = Kommando
234
    lcd_send(cmd);        // senden
235
}
236
//---------------------------------------------------------------------------
237
//    lcd_home(..) - Cursor auf Position 1,1
238
//---------------------------------------------------------------------------
239
void lcd_home(void)
240
{
241
    lcd_cmd(0x02);
242
    wait_ms(2);            // warten

// ===================================================================== 
//
// => 2) lcd.h
1
#define     F_CPU   3686400UL
2
#include    <avr/io.h>
3
#include    <stdio.h>
4
#include    <avr/delay.h>
5
6
7
8
/* sample: lcd_cmd(LCD_DISP_OFF); */
9
#define LCD_DISP_OFF             0x08   /* display off                            */
10
#define LCD_DISP_ON              0x0C   /* display on, cursor off                 */
11
#define LCD_DISP_ON_BLINK        0x0D   /* display on, cursor off, blink char     */
12
#define LCD_DISP_ON_CURSOR       0x0E   /* display on, cursor on                  */
13
#define LCD_DISP_ON_CURSOR_BLINK 0x0F   /* display on, cursor on, blink char      */
14
/* move cursor/shift display */
15
#define LCD_MOVE_CURSOR_LEFT     0x10   /* move cursor left  (decrement)          */
16
#define LCD_MOVE_CURSOR_RIGHT    0x14   /* move cursor right (increment)          */
17
#define LCD_MOVE_DISP_LEFT       0x18   /* shift display left                     */
18
#define LCD_MOVE_DISP_RIGHT      0x1C   /* shift display right                    */
19
20
21
22
23
extern void wait_ms(int miliSec);
24
extern void lcd_send(char data);
25
extern void lcd_cmd(char cmd);
26
extern void lcd_write(char text);
27
extern void lcd_write_s(char* pText);
28
extern void lcd_home(void);
29
extern void lcd_clear(void);
30
extern void lcd_on(void);
31
extern void lcd_off(void);
32
extern void lcd_off(void);
33
extern void lcd_goto(int row, int col);
34
extern void lcd_init(void);
35
extern void lcd_charDef(void);

Schalte

--

Dieser Kraut&Rüben-Salat ist mit dem vom Forum zur Verfügung gestellten 
C-Syntax-Highlighting sicher besser lesbar.

Anhang ist was anderes als hinten an das Posting dranzuklatschen.
-rufus

: Bearbeitet durch User
von "Mod" (Gast)


Lesenswert?

Marko Stel schrieb:
> und weiss gerade selber nicht weiter was ich
> falsch mache...

>Wichtige Regeln - erst lesen, dann posten!

>    Groß- und Kleinschreibung verwenden
>    Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Vor allem das Dritte.

Oder wenigsten Syntax Highlighting verwenden...

von Karl H. (kbuchegg)


Lesenswert?

Marko Stel schrieb:

> Meine Aufgabe ist es für jeden Schaltzustand einen Namen auf einem LCD -
> Display anzuzeigen. Bis jetzt kann ich gerade mal 2. Schaltzustände
> abfragen und das noch nicht mal ganz korrekt.

Nicht nur das.
Dir scheint auch sonst noch so einiges nicht wirklich klar zu sein. Und 
das fängt bei grundlegenden Elementen der Programmiersprache schon an.

>
> Meine Bibliotheken bestehen aus den grunlegenden und eine selbst
> definierte
> lcd.h,lcd.c Datei.

Ach komm. Erzähl nicht so einen Unsinn. Die hast du niemals selbst 
geschrieben. Mit dem, was du in main an Können zeigst, kannst du die lcd 
Routinen nicht selbst geschrieben haben. Das ist so, wie wenn mir ein 
4-jähriger, der gerade mal mit Stützrädern 'radfahren kann' mir erzählt, 
er hätte eine Tour de France Etappe gewonnen.

Leg das LCD erst mal zur Seite, nimm 2 LED als Ausgabeinstrument und 
beschäftige dich (mit deinen Unterlagen) damit, wie man Eingänge 
definiert, ob und wann man Pullup Widerstände braucht und sieh erst mal 
zu, dass du eine LED einschalten kannst, wenn ein Taster/Schalter 
betätigt wird. Das sind in Summe so um die 10 Zeilen Code und noch 
übersichtlich genug, damit du dort die Technik dahinter lernen kannst. 
Und dann wendest du das dort gelernte auf deine Aufgabenstellung an. 
Aber erst mal muss man gehen lernen, ehe man dann mit laufen anfängt. Du 
bist jetzt gerade an der Schwelle zum krabbeln.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.