Hallo ich habe ein dsPICDEM 2 Board mit einem dsPIC30F4011 drauf. Damit möchte ich ein externes LCD-display ansteuern. Dies bereitet mir jedoch einige Probleme. Den Code habe ich von https://www.pantechsolutions.net/microcontroller-boards/lcd-interfacing-with-dspic-primer und auf meine pins angepasst. In der Funktion configure_pin() werden die Pins auf digital und ausgang gesetzt. Da ich als Datenleitung RE0-RE3 benutze, habe ich bei der DATA-generierung hinten noch >>4 drangehängt.
1 | #include <p30fxxxx.h> |
2 | #include "system.h" |
3 | #include <stdio.h> |
4 | |
5 | _FOSC(CSW_FSCM_OFF & XT_PLL8); //Run this project using an external crystal routed via the PLL in 8x multiplier mode |
6 | _FWDT(WDT_OFF); //Turn off the Watch-Dog Timer. |
7 | _FBORPOR(MCLR_EN & PWRT_OFF); //Enable MCLR reset pin and turn off the power-up timers. |
8 | _FGS(CODE_PROT_OFF); //Disable Code Protection |
9 | |
10 | #define RS LATBbits.LATB2 |
11 | #define EN LATBbits.LATB4 |
12 | #define DATA LATE |
13 | |
14 | void lcd_init(void); |
15 | void lcd_command(unsigned char); |
16 | void lcd_data(unsigned char); |
17 | |
18 | void Delay5ms(unsigned int a); |
19 | void Delay5us(unsigned int a); |
20 | |
21 | unsigned char text[8] = "Johannes"; |
22 | unsigned int i; |
23 | |
24 | |
25 | int main (void) |
26 | { |
27 | configure_pin(); |
28 | lcd_init(); |
29 | while (1) { |
30 | lcd_command(0x01); |
31 | Delay5ms(200); |
32 | lcd_command(0x80); |
33 | for( i=0; text[i]!='\0'; i++) |
34 | { |
35 | lcd_data(text[i]); |
36 | Delay5ms(500); |
37 | } |
38 | |
39 | } |
40 | return 0; |
41 | } |
42 | |
43 | void lcd_init() |
44 | { |
45 | lcd_command(0x33); |
46 | lcd_command(0x32); |
47 | lcd_command(0x28); |
48 | lcd_command(0x0C); |
49 | lcd_command(0x06); |
50 | lcd_command(0x01); |
51 | } |
52 | |
53 | void lcd_command(unsigned char cmd) |
54 | { |
55 | RS = 0; |
56 | |
57 | DATA = (cmd & 0xF0)>>4; |
58 | EN = 1; |
59 | EN = 0; |
60 | |
61 | DATA = ((cmd << 4) & 0xF0)>>4; |
62 | EN = 1; |
63 | EN = 0; |
64 | |
65 | Delay5ms(4); |
66 | } |
67 | |
68 | void lcd_data(unsigned char data) |
69 | { |
70 | RS = 1; |
71 | |
72 | DATA = (data & 0xF0)>>4; |
73 | EN = 1; |
74 | EN = 0; |
75 | |
76 | DATA = ((data << 4) & 0xF0)>>4; |
77 | EN = 1; |
78 | EN = 0; |
79 | |
80 | Delay5ms(4); |
81 | } |
82 | |
83 | void Delay5ms(unsigned int a)//when a= 1, delay ca. 5ms |
84 | { |
85 | unsigned int i; |
86 | unsigned int j; |
87 | for (j = 0; j < 20; j++) |
88 | for (i = 0; i < 500 * a; i++); |
89 | } |
90 | |
91 | void Delay5us(unsigned int a)//when a= 1, delay ca. 5us |
92 | { |
93 | unsigned int i; |
94 | unsigned int j; |
95 | for (j = 0; j < 2; j++) |
96 | for (i = 0; i < 5 * a; i++); |
97 | } |
Auf meinem Display ist allerdings nur die erste Zeile mit schwarzen Kästchen gefüllt. ist da noch ein Fehler im Code? oder liegt es an der Verbindung? Display (pin) -> Board GND(1) -> GND Vdd(2) -> Vdd Vo (3) -> GND RS (4) -> RB2 R/W(5) -> GND E (6) -> RB4 DB0-DB3 (7-10) -> GND DB4-DB7 (11-14) -> RE0-RE3 LED+/LED- nicht verbunden Johannes