Forum: Mikrocontroller und Digitale Elektronik Displaytech 162 an STM32DiscoveryF3 (Cortex M3)


von kremsy (Gast)


Lesenswert?

Hallo Leute,

Ich versuche ein LCD-Display im 8-Bit Modus am STM32 zum laufen zum 
Bringen.

Initialisierungsroutine:
1
#include "stm32f10x.h"
2
#include <stdio.h>
3
4
extern int32_t SysTickCnt;
5
6
volatile unsigned long TimeTick;
7
8
/*------------------------------------------------------------------------------
9
  Delay function
10
  delays number of tick Systicks (happens every 10 ms)
11
*------------------------------------------------------------------------------*/
12
static void Delay (unsigned long tick)
13
{
14
    unsigned long timetick;
15
16
    timetick = TimeTick;
17
    while ((TimeTick - timetick) < tick);
18
}
19
20
static void LCD_RS(uint8_t val)           // RS ... register select
21
{
22
  if(val)   GPIO_SetBits  (GPIOB, GPIO_Pin_0);
23
  else     GPIO_ResetBits(GPIOB, GPIO_Pin_0);
24
}
25
26
27
static void LCD_RW(uint8_t val)           // RW ... read/write
28
{
29
  if(val)   GPIO_SetBits  (GPIOC, GPIO_Pin_5);
30
  else     GPIO_ResetBits(GPIOC, GPIO_Pin_5);
31
}
32
33
34
static void LCD_E(uint8_t val)             // E ... enable
35
{
36
  if(val)   GPIO_SetBits  (GPIOC, GPIO_Pin_4);
37
  else     GPIO_ResetBits(GPIOC, GPIO_Pin_4);
38
}
39
40
static void LCD_Data(uint8_t val)             // E ... enable
41
{
42
     GPIOA->BSRR=0xFFFFFF;
43
  if(val)   GPIOA->BSRR=val;
44
45
}
46
47
void LCD_Init(void)
48
{
49
  GPIO_InitTypeDef  GPIO_InitStruct;
50
  int32_t SysTickCntHold;
51
52
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
53
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);
54
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE);
55
56
    GPIO_InitStruct.GPIO_Pin    =  GPIO_Pin_0;      // Konfig. LED an PC8
57
  GPIO_InitStruct.GPIO_Speed  =  GPIO_Speed_10MHz;
58
  GPIO_InitStruct.GPIO_Mode    =  GPIO_Mode_Out_OD;
59
  GPIO_Init(GPIOB, &GPIO_InitStruct);
60
61
    GPIO_InitStruct.GPIO_Pin    =  GPIO_Pin_4|GPIO_Pin_5;      // Konfig. LED an PC8
62
  GPIO_InitStruct.GPIO_Speed  =  GPIO_Speed_10MHz;
63
  GPIO_InitStruct.GPIO_Mode    =  GPIO_Mode_Out_OD;
64
  GPIO_Init(GPIOC, &GPIO_InitStruct);
65
66
    GPIO_InitStruct.GPIO_Pin    = GPIO_Pin_All;      // Datenports Display
67
  GPIO_InitStruct.GPIO_Speed  =  GPIO_Speed_10MHz;
68
  GPIO_InitStruct.GPIO_Mode    =  GPIO_Mode_Out_OD;
69
  GPIO_Init(GPIOA, &GPIO_InitStruct);
70
71
  GPIO_ResetBits(GPIOB, GPIO_Pin_0);
72
  GPIO_ResetBits(GPIOC, GPIO_Pin_4 | GPIO_Pin_5);
73
  GPIO_ResetBits(GPIOA, GPIO_Pin_All);
74
75
  LCD_RW(0);
76
77
  SysTickCntHold = SysTickCnt;  
78
  while((SysTickCnt - SysTickCntHold ) < 16 );   // wait ca. 15ms
79
80
  GPIO_SetBits (GPIOA, GPIO_Pin_4|GPIO_Pin_5);
81
  //Delay(1);
82
83
  LCD_E(1);
84
  Delay(1);  //SET_TO 8-Bit (1/3)
85
  LCD_E(0);
86
87
  SysTickCntHold = SysTickCnt;  
88
  while((SysTickCnt - SysTickCntHold ) < 5 );   // wait ca. 4.2ms
89
90
   LCD_E(1);
91
  Delay(1);  //SET_TO 8-Bit (2/3)
92
  LCD_E(0);
93
94
  SysTickCntHold = SysTickCnt;  
95
  while((SysTickCnt - SysTickCntHold ) < 2 );   // wait ca. 110us
96
97
   LCD_E(1);
98
  Delay(1);  //SET_TO 8-Bit (3/3)
99
  LCD_E(0);
100
101
  Delay(1);
102
103
   LCD_E(1);
104
  Delay(1);   //SET_TO 8-Bit (4/3)
105
  LCD_E(0);
106
107
   Delay(1);
108
109
   GPIO_ResetBits (GPIOA, GPIO_Pin_All);
110
   GPIO_SetBits (GPIOA, GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5);  //2-Line Display
111
     LCD_E(1);
112
  Delay(1);
113
  LCD_E(0);
114
115
   Delay(1);
116
117
   GPIO_ResetBits (GPIOA, GPIO_Pin_All);
118
   GPIO_SetBits (GPIOA, GPIO_Pin_3);  //Display off
119
     LCD_E(1);
120
  Delay(1);
121
  LCD_E(0);
122
123
   Delay(1);
124
125
   GPIO_ResetBits (GPIOA, GPIO_Pin_All);
126
   GPIO_SetBits (GPIOA, GPIO_Pin_0);  //Delete Display
127
     LCD_E(1);
128
  Delay(1);
129
  LCD_E(0);
130
131
   Delay(1);
132
133
   GPIO_ResetBits (GPIOA, GPIO_Pin_All);
134
   GPIO_SetBits (GPIOA, GPIO_Pin_1|GPIO_Pin_2);  //Cursor Right
135
     LCD_E(1);
136
  Delay(1);
137
  LCD_E(0);
138
139
   Delay(1);
140
141
   GPIO_ResetBits (GPIOA, GPIO_Pin_All);
142
   GPIO_SetBits (GPIOA, GPIO_Pin_2|GPIO_Pin_3);  //Display On
143
     LCD_E(1);
144
  Delay(1);
145
  LCD_E(0);
146
147
//beginn
148
   Delay(1);
149
150
   GPIO_ResetBits (GPIOA, GPIO_Pin_All);
151
   GPIO_SetBits (GPIOA, GPIO_Pin_0);  //Delete Display
152
     LCD_E(1);
153
  Delay(1);
154
  LCD_E(0);
155
156
157
   Delay(1);
158
159
   GPIO_ResetBits (GPIOA, GPIO_Pin_All);
160
   GPIO_SetBits (GPIOA, GPIO_Pin_0|GPIO_Pin_3);  //Blink Cursor
161
     LCD_E(1);
162
  Delay(1);
163
  LCD_E(0);
164
165
166
}

Delay(1) ist ein Delay von ca 10ms, nur zum Testen.

Display D0 = PortA0 - D7=PortA7


Leider macht das Display garnichts, außer dass der Hintergrund ist und 
die Rechtecke in einer Zeile angezeigt werden (Industriestandart).

Vielleicht habt ihr eine Idee.

von kremsy (Gast)


Lesenswert?

Das Problem wurde nun etwas eingeschränkt, anscheinend funtkioniert der 
Systick Timer nicht richtig.
1
#include "stm32f10x.h"
2
#include <stdio.h>
3
#include "lcd.h"
4
5
6
volatile int32_t SysTickCnt=0;
7
int32_t SysTickCntHold;  
8
9
void SysTick_Handler(void)
10
{
11
  SysTickCnt++;
12
}
13
14
int main(void)
15
{
16
  RCC_ClocksTypeDef   Clocks;
17
  GPIO_InitTypeDef   GPIO_InitStruct;
18
  RCC_GetClocksFreq(&Clocks);
19
  SysTick_Config( Clocks.HCLK_Frequency/1000 - 1 );  // 1000 Hz ( T=1ms)
20
21
22
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE);
23
24
25
26
    GPIO_InitStruct.GPIO_Pin    =  GPIO_Pin_8|GPIO_Pin_9;      // Konfig. LED an PC8
27
  GPIO_InitStruct.GPIO_Speed  =  GPIO_Speed_10MHz;
28
  GPIO_InitStruct.GPIO_Mode    =  GPIO_Mode_Out_PP;
29
  GPIO_Init(GPIOC, &GPIO_InitStruct);
30
31
32
  GPIO_SetBits(GPIOC, GPIO_Pin_8);
33
34
35
  SysTickCntHold = SysTickCnt;  
36
  while((SysTickCnt - SysTickCntHold ) < 16 );   // wait ca. 15ms
37
   GPIO_ResetBits(GPIOC, GPIO_Pin_8);
38
  LCD_Init();
39
40
  while(1)
41
  {
42
  }
43
}

Hier im Main Funktioniert der Systick-Timer ohne Probleme.


In der Datei lcd.c (code oben)

extern int32_t SysTickCnt;



void LCD_Init(void)
{
  GPIO_InitTypeDef  GPIO_InitStruct;
  int32_t SysTickCntHold;

  GPIO_ResetBits(GPIOC, GPIO_Pin_8);
  SysTickCntHold = SysTickCnt;
  while((SysTickCnt - SysTickCntHold ) < 16 );   // wait ca. 15ms

   GPIO_SetBits(GPIOC, GPIO_Pin_9);
...


Hängt sich der Prozessor anscheiend bei der While Schleife auf.

von kremsy (Gast)


Lesenswert?

Wenn ich die Funktionen alle in die Mainpacke, funktioniert das mit dem 
Systik aufjedenfall, alles wird bis zum ende durchgelaufen, nur am 
Display tut sich gar nichts.

von kremsy (Gast)


Angehängte Dateien:

Lesenswert?

Hier die Beschaltung des Displays.

von kremsy (Gast)


Lesenswert?

Hier nun der aktuelle Code in der main.c
1
#include "stm32f10x.h"
2
#include <stdio.h>
3
//#include "lcd.h"
4
5
void Delay (unsigned long tick);
6
void LCD_Init(void);
7
void LCD_SetPrintPosition(unsigned int ln, unsigned int col);       // line 0...1  column 0...15
8
volatile int32_t SysTickCnt=0;
9
int32_t SysTickCntHold;  
10
11
void SysTick_Handler(void)
12
{
13
  SysTickCnt++;
14
}
15
16
17
int main(void)
18
{
19
  RCC_ClocksTypeDef   Clocks;
20
  GPIO_InitTypeDef   GPIO_InitStruct;
21
  RCC_GetClocksFreq(&Clocks);
22
  SysTick_Config( Clocks.HCLK_Frequency/1000 - 1 );  // 1000 Hz ( T=1ms)
23
24
25
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE);
26
27
28
29
    GPIO_InitStruct.GPIO_Pin    =  GPIO_Pin_8|GPIO_Pin_9;      // TESTLEDS
30
  GPIO_InitStruct.GPIO_Speed  =  GPIO_Speed_10MHz;
31
  GPIO_InitStruct.GPIO_Mode    =  GPIO_Mode_Out_PP;
32
  GPIO_Init(GPIOC, &GPIO_InitStruct);
33
34
35
  GPIO_SetBits(GPIOC, GPIO_Pin_8);
36
37
38
  Delay(10);
39
   GPIO_ResetBits(GPIOC, GPIO_Pin_8);
40
  LCD_Init();
41
42
  while(1)
43
  {
44
  }
45
}
46
47
48
49
void Delay (unsigned long tick)
50
{  
51
   // unsigned long timetick;
52
53
   // timetick = TimeTick;
54
   // while ((TimeTick - timetick) < tick);
55
  int32_t SysTickCntHold;
56
     SysTickCntHold = SysTickCnt;  
57
  while((SysTickCnt - SysTickCntHold ) < tick );   // wait ca. 110us
58
}
59
60
static void LCD_RS(uint8_t val)           // RS ... register select
61
{
62
  if(val)   GPIO_SetBits  (GPIOB, GPIO_Pin_0);
63
  else     GPIO_ResetBits(GPIOB, GPIO_Pin_0);
64
}
65
66
67
static void LCD_RW(uint8_t val)           // RW ... read/write
68
{
69
  if(val)   GPIO_SetBits  (GPIOC, GPIO_Pin_5);
70
  else     GPIO_ResetBits(GPIOC, GPIO_Pin_5);
71
}
72
73
74
static void LCD_E(uint8_t val)             // E ... enable
75
{
76
  if(val)   GPIO_SetBits  (GPIOC, GPIO_Pin_4);
77
  else     GPIO_ResetBits(GPIOC, GPIO_Pin_4);
78
}
79
80
static void LCD_Data(uint8_t val)             // E ... enable
81
{
82
     GPIOA->BSRR=0xFFFFFF;
83
  if(val)   GPIOA->BSRR=val;
84
85
}
86
87
void LCD_Init(void)
88
{
89
  GPIO_InitTypeDef  GPIO_InitStruct;
90
  int32_t SysTickCntHold;
91
92
  GPIO_SetBits(GPIOC, GPIO_Pin_9);
93
Delay(15);
94
95
   GPIO_ResetBits(GPIOC, GPIO_Pin_9);
96
97
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
98
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);
99
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE);
100
101
    GPIO_InitStruct.GPIO_Pin    =  GPIO_Pin_0;      // RS
102
  GPIO_InitStruct.GPIO_Speed  =  GPIO_Speed_10MHz;
103
  GPIO_InitStruct.GPIO_Mode    =  GPIO_Mode_Out_OD;
104
  GPIO_Init(GPIOB, &GPIO_InitStruct);
105
106
    GPIO_InitStruct.GPIO_Pin    =  GPIO_Pin_4|GPIO_Pin_5;    //En and R/W
107
  GPIO_InitStruct.GPIO_Speed  =  GPIO_Speed_10MHz;
108
  GPIO_InitStruct.GPIO_Mode    =  GPIO_Mode_Out_OD;
109
  GPIO_Init(GPIOC, &GPIO_InitStruct);
110
111
    GPIO_InitStruct.GPIO_Pin    = GPIO_Pin_All;      // Datenports Display
112
  GPIO_InitStruct.GPIO_Speed  =  GPIO_Speed_10MHz;
113
  GPIO_InitStruct.GPIO_Mode    =  GPIO_Mode_Out_OD;
114
  GPIO_Init(GPIOA, &GPIO_InitStruct);
115
116
  GPIO_ResetBits(GPIOB, GPIO_Pin_0);
117
  GPIO_ResetBits(GPIOC, GPIO_Pin_4 | GPIO_Pin_5);
118
  GPIO_ResetBits(GPIOA, GPIO_Pin_All);
119
     
120
   
121
122
  LCD_RW(0);
123
    GPIO_SetBits(GPIOC, GPIO_Pin_9);
124
  SysTickCntHold = SysTickCnt;  
125
  while((SysTickCnt - SysTickCntHold ) < 16 );   // wait ca. 15ms
126
GPIO_ResetBits(GPIOC, GPIO_Pin_8);
127
128
  GPIO_SetBits (GPIOA, GPIO_Pin_4|GPIO_Pin_5);
129
  //Delay(1);
130
131
  LCD_E(1);
132
  Delay(1);  //SET_TO 8-Bit (1/3)
133
  LCD_E(0);
134
135
  SysTickCntHold = SysTickCnt;  
136
  while((SysTickCnt - SysTickCntHold ) < 5 );   // wait ca. 4.2ms
137
138
   LCD_E(1);
139
  Delay(1);  //SET_TO 8-Bit (2/3)
140
  LCD_E(0);
141
142
  SysTickCntHold = SysTickCnt;  
143
  while((SysTickCnt - SysTickCntHold ) < 2 );   // wait ca. 110us
144
145
   LCD_E(1);
146
  Delay(1);  //SET_TO 8-Bit (3/3)
147
  LCD_E(0);
148
149
  Delay(1);
150
151
   LCD_E(1);
152
  Delay(1);   //SET_TO 8-Bit (4/3)
153
  LCD_E(0);
154
155
   Delay(1);
156
157
   GPIO_ResetBits (GPIOA, GPIO_Pin_All);
158
   GPIO_SetBits (GPIOA, GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5);  //2-Line Display
159
     LCD_E(1);
160
  Delay(1);
161
  LCD_E(0);
162
163
   Delay(1);
164
165
   GPIO_ResetBits (GPIOA, GPIO_Pin_All);
166
   GPIO_SetBits (GPIOA, GPIO_Pin_3);  //Display off
167
     LCD_E(1);
168
  Delay(1);
169
  LCD_E(0);
170
171
   Delay(1);
172
173
   GPIO_ResetBits (GPIOA, GPIO_Pin_All);
174
   GPIO_SetBits (GPIOA, GPIO_Pin_0);  //Delete Display
175
     LCD_E(1);
176
  Delay(1);
177
  LCD_E(0);
178
179
   Delay(1);
180
181
   GPIO_ResetBits (GPIOA, GPIO_Pin_All);
182
   GPIO_SetBits (GPIOA, GPIO_Pin_1|GPIO_Pin_2);  //Cursor Right
183
     LCD_E(1);
184
  Delay(1);
185
  LCD_E(0);
186
187
   Delay(1);
188
189
   GPIO_ResetBits (GPIOA, GPIO_Pin_All);
190
   GPIO_SetBits (GPIOA, GPIO_Pin_2|GPIO_Pin_3);  //Display On
191
     LCD_E(1);
192
  Delay(1);
193
  LCD_E(0);
194
195
//beginn
196
   Delay(1);
197
198
   GPIO_ResetBits (GPIOA, GPIO_Pin_All);
199
   GPIO_SetBits (GPIOA, GPIO_Pin_0);  //Delete Display
200
     LCD_E(1);
201
  Delay(1);
202
  LCD_E(0);
203
204
205
   Delay(1);
206
207
   GPIO_ResetBits (GPIOA, GPIO_Pin_All);
208
   GPIO_SetBits (GPIOA, GPIO_Pin_0|GPIO_Pin_3);  //Blink Cursor
209
     LCD_E(1);
210
  Delay(1);
211
  LCD_E(0);
212
      
213
    GPIO_ResetBits(GPIOC, GPIO_Pin_9);        
214
}

Und das Display macht wie gesagt gar nichts, außer der Hintergrund und 
die erste Zeile bei der alle Punkte leuchten.

von kremsy (Gast)


Lesenswert?

niemand eine Idee?

von kremsy (Gast)


Lesenswert?

Hab die Ausgänge jetzt auf Push-Pull gestellt, das Display initialisiert 
wohl nun erfolgreich, aber angezeigt bekomm ich noch nichts.
1
//beginn
2
   Delay(1); 
3
    GPIO_ResetBits (GPIOA, GPIO_Pin_All);
4
   GPIO_SetBits (GPIOA, GPIO_Pin_7);  //DD-Ram
5
     LCD_E(1);
6
  Delay(1);
7
  LCD_E(0);
8
   
9
   Delay(1);
10
11
   GPIO_ResetBits (GPIOA, GPIO_Pin_All);
12
   GPIO_SetBits (GPIOA, GPIO_Pin_0);  //Delete Display
13
     LCD_E(1);
14
  Delay(1);
15
  LCD_E(0);
16
17
18
   Delay(1);
19
20
   GPIO_ResetBits (GPIOA, GPIO_Pin_All);
21
   GPIO_SetBits (GPIOA, GPIO_Pin_0|GPIO_Pin_3);  //Blink Cursor
22
     LCD_E(1);
23
  Delay(1);
24
  LCD_E(0);
25
26
   Delay(1);
27
   GPIO_ResetBits (GPIOA, GPIO_Pin_All);
28
   GPIO_SetBits (GPIOA, GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_3);  //Blink Cursor
29
     LCD_E(1);
30
  Delay(1);
31
  LCD_E(0);
32
33
   Delay(1);        
34
      
35
36
   GPIO_ResetBits (GPIOA, GPIO_Pin_All);
37
   GPIO_SetBits (GPIOA, GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);  //W
38
   GPIO_SetBits (GPIOA, GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);   
39
   LCD_RS(1);
40
      LCD_E(1);
41
  Delay(1);
42
  LCD_E(0);

Will nur einen Buchstaben anzeigen lassen.

von kremsy (Gast)


Lesenswert?

Habs geschafft ;).

von kremsy (Gast)


Lesenswert?

Falls es jemand interessiert, hier ist der Funktionierende Code:
1
#include "stm32f10x.h"
2
#include <stdio.h>
3
//#include "lcd.h"
4
5
void Delay (unsigned long tick);
6
void LCD_Init(void);
7
static void LCD_Data(uint8_t val);
8
static void lcd_string( const char *data );
9
void lcd_setcursor( uint8_t x, uint8_t y );
10
//void LCD_SetPrintPosition(unsigned int ln, unsigned int col);       // line 0...1  column 0...15
11
volatile int32_t SysTickCnt=0;
12
int32_t SysTickCntHold;  
13
14
void SysTick_Handler(void)
15
{
16
  SysTickCnt++;
17
}
18
19
20
int main(void)
21
{
22
  RCC_ClocksTypeDef   Clocks;
23
  GPIO_InitTypeDef   GPIO_InitStruct;
24
  RCC_GetClocksFreq(&Clocks);
25
  SysTick_Config( Clocks.HCLK_Frequency/1000 - 1 );  // 1000 Hz ( T=1ms)
26
27
28
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE);
29
30
31
32
    GPIO_InitStruct.GPIO_Pin    =  GPIO_Pin_8|GPIO_Pin_9;      // TESTLEDS
33
  GPIO_InitStruct.GPIO_Speed  =  GPIO_Speed_10MHz;
34
  GPIO_InitStruct.GPIO_Mode    =  GPIO_Mode_Out_PP;
35
  GPIO_Init(GPIOC, &GPIO_InitStruct);
36
37
  LCD_Init();
38
39
   LCD_Data('H');
40
  LCD_Data('A');
41
   LCD_Data('L');
42
  LCD_Data('L');
43
  LCD_Data('O');
44
  lcd_string(" POOL 38°C");  
45
46
  lcd_setcursor(5,2);
47
  lcd_string(" TEST");  
48
49
  while(1)
50
  {
51
  }
52
}
53
54
/*******************************************************************************
55
* Function Name  : EXTI9_5_IRQHandler
56
* Description    : This function handles External lines 9 to 5 interrupt request.
57
* Input          : None
58
* Output         : None
59
* Return         : None
60
*******************************************************************************/
61
62
void EXTI0_IRQHandler(void)
63
{
64
  if(EXTI_GetITStatus(EXTI_Line0) != RESET) //EXTI_Line 0 hat ausgeloest?
65
  {
66
67
    EXTI_ClearITPendingBit(EXTI_Line0);
68
  }
69
}
70
71
void TIM3_IRQHandler (void)
72
{  
73
  TIM_ClearFlag(TIM3, TIM_FLAG_Update);  
74
}
75
76
77
void Delay (unsigned long tick)
78
{  
79
  int32_t SysTickCntHold;
80
     SysTickCntHold = SysTickCnt;  
81
  while((SysTickCnt - SysTickCntHold ) <= tick );   // wait ca. 110us
82
}
83
84
static void LCD_RS(uint8_t val)           // RS ... register select
85
{
86
  if(val)   GPIO_SetBits  (GPIOB, GPIO_Pin_0);
87
  else     GPIO_ResetBits(GPIOB, GPIO_Pin_0);
88
}
89
90
91
static void LCD_RW(uint8_t val)           // RW ... read/write
92
{
93
  if(val)   GPIO_SetBits  (GPIOC, GPIO_Pin_5);
94
  else     GPIO_ResetBits(GPIOC, GPIO_Pin_5);
95
}
96
97
98
static void LCD_E(uint8_t val)             // E ... enable
99
{
100
  if(val){
101
    GPIO_SetBits  (GPIOC, GPIO_Pin_4);
102
    Delay(1);  //SET_TO 8-Bit (1/3)
103
      GPIO_ResetBits(GPIOC, GPIO_Pin_4);
104
  }
105
  else GPIO_ResetBits(GPIOC, GPIO_Pin_4);
106
}
107
108
static void LCD_Data(uint8_t val)             // E ... enable
109
{
110
   GPIO_ResetBits (GPIOA, GPIO_Pin_All);
111
  if(val)   GPIOA->BSRR=val;
112
     LCD_E(1);
113
114
}
115
116
// Schreibt einen String auf das LCD
117
 
118
static void lcd_string( const char *data )
119
{
120
    while( *data != '\0' )
121
        LCD_Data( *data++ );
122
}
123
124
125
// Setzt den Cursor in Spalte x (0..15) Zeile y (1..2) 
126
 
127
void lcd_setcursor( uint8_t x, uint8_t y )
128
{
129
    uint8_t data;
130
 
131
    switch (y)
132
    {
133
        case 1:    // 1. Zeile
134
            data = 0x80 + 0x00 + x;
135
            break;
136
 
137
        case 2:    // 2. Zeile
138
            data = 0x80 + 0x40 + x;
139
            break;
140
        default:
141
            return;                                   // für den Fall einer falschen Zeile
142
    }
143
    LCD_RS(0);
144
    LCD_Data( data );
145
  LCD_RS(1);
146
}
147
148
void LCD_Init(void)
149
{
150
  GPIO_InitTypeDef  GPIO_InitStruct;
151
152
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
153
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);
154
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE);
155
156
    GPIO_InitStruct.GPIO_Pin    =  GPIO_Pin_0;      // RS
157
  GPIO_InitStruct.GPIO_Speed  =  GPIO_Speed_10MHz;
158
  GPIO_InitStruct.GPIO_Mode    =  GPIO_Mode_Out_PP;
159
  GPIO_Init(GPIOB, &GPIO_InitStruct);
160
161
    GPIO_InitStruct.GPIO_Pin    =  GPIO_Pin_4|GPIO_Pin_5;    //En and R/W
162
  GPIO_InitStruct.GPIO_Speed  =  GPIO_Speed_10MHz;
163
  GPIO_InitStruct.GPIO_Mode    =  GPIO_Mode_Out_PP;
164
  GPIO_Init(GPIOC, &GPIO_InitStruct);
165
166
    GPIO_InitStruct.GPIO_Pin    = GPIO_Pin_All;      // Datenports Display
167
  GPIO_InitStruct.GPIO_Speed  =  GPIO_Speed_10MHz;
168
  GPIO_InitStruct.GPIO_Mode    =  GPIO_Mode_Out_PP;
169
  GPIO_Init(GPIOA, &GPIO_InitStruct);
170
171
  GPIO_ResetBits(GPIOB, GPIO_Pin_0);
172
  GPIO_ResetBits(GPIOC, GPIO_Pin_4 | GPIO_Pin_5);
173
  GPIO_ResetBits(GPIOA, GPIO_Pin_All);
174
     
175
  /* DISPLAY INITIALISATION */
176
  LCD_RW(0);
177
178
  Delay(15);  //wait ca 15ms
179
  LCD_Data(0x30);    //SET_TO 8-Bit (1/4)
180
  Delay(5);  //wait more than 4,2ms
181
  LCD_Data(0x30);    //SET_TO 8-Bit (2/4)
182
  Delay(1);  //wait more than 110us
183
  LCD_Data(0x30);    //SET_TO 8-Bit (3/4)
184
  LCD_Data(0x30);    //SET_TO 8-Bit (4/4)
185
   
186
  LCD_Data(0x38);    //2-Line Display
187
  LCD_Data(0x08);    //Display Off
188
189
  LCD_Data(0x01);    //Delete Display
190
191
  LCD_Data(0x03);    //Cursor Right
192
193
  LCD_Data(0x06);    //Display On
194
195
  lcd_setcursor(0,0);    //Cursor 0/0
196
   
197
   LCD_Data(0x0C);    //Display On
198
199
   LCD_RS(1);
200
     
201
}

von Ivan J. (ivan1987)


Lesenswert?

Hallo,
ich arbeite auch mit dem STM32 Board und dem 1602 LCD Modul.
Ich bekomm bei deinem Code allerdings den Fehler:

".\Debug\GPIOToggle.axf: Error: L6200E: Symbol SysTick_Handler multiply 
defined (by stm32f10x_it.o and main.o)."

Wenn ich die Funktion SysTick_Handler in der stm32f10x_it.c ausklammer 
(in der im Übrigen auch nichts gemacht wird), gibts kein Fehler, 
allerdings kommt beim Display nichts raus (nur der Standardbalken...)!?

Fehlt bei deinem geposteten Code noch was?

von Ivan J. (ivan1987)


Lesenswert?

Ich hab den Fehler gefunden:
wenn ich mein LCD Modul der Reihe nach anstecke ist DB0 PA7 zugeordnet. 
Das ist genau umgekehrt, wie bei dir...

ich hab alle "LCD_Data" Befehle beim Aufruf geswapt, dann gehts auch.

Kennt jmd einen Befehl bei stm32 mit dem man die nibbels eines bytes 
tauschen kann?

von kremsy (Gast)


Lesenswert?

Ivan, den code hier nicht nehmen, sondern den vom anderen Thread.

von Ivan J. (ivan1987)


Lesenswert?

kremsy schrieb:
> Ivan, den code hier nicht nehmen, sondern den vom anderen Thread.

danke, für alle: Beitrag "Delay Funktion für STM32 Board?"

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.