Hallo miteinander
Ich verwende einen MSP430FR4131, um eine kleine LCD-Segmentanzeige
anzusteuern. Leider habe ich Probleme mit der Lesbarkeit bzw. mit dem
Kontrast. Die Segmente, die hell sein sollten, sind etwas dunkler als
der Hintergrund (siehe Bild).
Nun hoffe ich das irgendwie in Software beheben zu können, da sonst eine
neue PCB-Revision nötig wäre. Ich habe auch noch nicht so viel Erfahrung
mit MSP430ern, weshalb ich besser nochmals nachfrage.
Ich habe ein Launchpad mit dem gleichen uC und einem anderen LCD, wo
dieses Ghosting nicht auftritt. Ich befürchte also, dass es an meiner
Hardware bzw. dem verwendeten LCD liegt.
An LCDCAP0/1 sind 100n angeschlossen. R13, R23, R33 sind unbelegt.
Ich habe auch mit unterschiedlichen Prescalern herumgespielt (LCD- und
Ladungspumpen-Frequenz), das hat aber keine grosse Wirkung bezüglich
Kontrast gezeigt.
Was könnte ich sonst noch machen?
Code:
1 | #include <msp430.h>
|
2 | #include <stdbool.h>
|
3 | #include <stdint.h>
|
4 |
|
5 | #define pm5_unlock() (PM5CTL0 &= ~LOCKLPM5)
|
6 | #define lcd_mem_clr() (LCDMEMCTL |= LCDCLRM)
|
7 |
|
8 | const uint8_t lcd_segment_map[] = {
|
9 | 0xd7,
|
10 | 0x06,
|
11 | 0xe3,
|
12 | 0xa7,
|
13 | 0x36,
|
14 | 0xb5,
|
15 | 0xfd,
|
16 | 0x07,
|
17 | 0xf7,
|
18 | 0xb7
|
19 | };
|
20 |
|
21 | void lcd_init ()
|
22 | {
|
23 | LCDCTL0 = 0x0000; // LCD_E module off
|
24 |
|
25 | /* LCD clock is VLOCLK,
|
26 | * mux rate is 4-mux,
|
27 | * prescaler 1 */
|
28 | LCDCTL0 = (LCDSSEL1 | LCDMX0 | LCDMX1 | LCDSON);
|
29 |
|
30 | /* enable charge pump,
|
31 | * R33 is supplied from Vcc internally */
|
32 | LCDVCTL |= (LCDCPEN | LCDSELVDD);
|
33 |
|
34 | lcd_mem_clr();
|
35 |
|
36 | /* Pin definitions */
|
37 | LCDPCTL0 = 0x0f00;
|
38 | LCDPCTL1 = 0xff0f;
|
39 | LCDPCTL2 = 0x0000;
|
40 |
|
41 | LCDCSSEL0 = 0x0f00;
|
42 | LCDCSSEL1 = 0x0000;
|
43 | LCDCSSEL2 = 0x0000;
|
44 |
|
45 | LCDM4 = 0x21; // common pins
|
46 | LCDM5 = 0x84;
|
47 |
|
48 | LCDCTL0 |= LCDON; //LCD_E module on
|
49 | }
|
50 |
|
51 | void lcd_put_temp (uint16_t n)
|
52 | {
|
53 | uint8_t digits [4];
|
54 |
|
55 | /* separate number into digits */
|
56 | for (uint8_t i = 3; i > 0; i--){
|
57 | digits[i] = n % 10;
|
58 | n /= 10;
|
59 | }
|
60 | digits[0] = n % 10;
|
61 |
|
62 |
|
63 | lcd_mem_clr();
|
64 |
|
65 | LCDM4 = 0x21; // common pins
|
66 | LCDM5 = 0x84;
|
67 |
|
68 | LCDM8 = 0x80; // degree symbol
|
69 |
|
70 | /* least significant digit */
|
71 | LCDM9 = lcd_segment_map[digits[3]]&0x07;
|
72 | LCDM13 = (lcd_segment_map[digits[3]]&0xf0) >> 4;
|
73 |
|
74 | LCDM14 = lcd_segment_map[digits[2]]|0x08;
|
75 |
|
76 | LCDM15 = lcd_segment_map[digits[1]]&0xf7;
|
77 |
|
78 | /* most significant digit */
|
79 | LCDM12 = lcd_segment_map[digits[0]]&0xf0;
|
80 | LCDM13 |= (lcd_segment_map[digits[0]]&0x07) << 4;
|
81 | }
|
82 |
|
83 | void main (void)
|
84 | {
|
85 | /* use VLO as MCLK and SMCLK source,
|
86 | * use REFO as ACLK */
|
87 | CSCTL4 = (SELA | SELMS0 | SELMS1);
|
88 |
|
89 | /* FLL reference is REFOCLK */
|
90 | CSCTL3 = (SELREF0);
|
91 |
|
92 | lcd_init();
|
93 | pm5_unlock();
|
94 | while (1){
|
95 | lcd_put_temp(1234);
|
96 | for (uint16_t i = 0; i < 0xfff; i++);
|
97 | }
|
98 | }
|