Hallo,
ich versuche gerade die einzelnen Segmente meines Butterflys
anzusprechen. Dabei orientiere ich mich am Beispielcode von Atmel. Um
alle Segmente zu (de)aktivieren, wird folgender Code verwendet:
1 | // Set/clear all bits in all LCD registers
|
2 | for (i=0; i < LCD_REGISTER_COUNT; i++)
|
3 | *(LCD_Data + i) = show;
|
LCD_Data ist ein unsigned char Pointer, der auf das erste Display
Memory-Register LCDDR0 zeigt. Auf diesen Pointer wird einfach der Offset
i addiert, der eines der folgenden Register angibt. Beispiel: *(LCD_Data
+ 2) dereferenziert auf den Inhalt des Registers LCDDR2.
Problem: LCDDR4, LCDDR9, LCDDR14 und LCDDR19 existieren laut Datenblatt
gar nicht. Dies äußert sich z.B. bei den Registerdefinitionen für den
Compiler darin, dass sich eine Lücke bei diesen Registern auftut:
1 | SFR_B_EXT(LCDDR0, 0xEC) /* LCD Data Register 0 */
|
2 | SFR_B_EXT(LCDDR1, 0xED) /* LCD Data Register 1 */
|
3 | SFR_B_EXT(LCDDR2, 0xEE) /* LCD Data Register 2 */
|
4 | SFR_B_EXT(LCDDR3, 0xEF) /* LCD Data Register 3 */
|
5 | SFR_B_EXT(LCDDR5, 0xF1) /* LCD Data Register 5 */
|
6 | // [...] usw.
|
Adresse 0xF0 ist somit nicht vergeben, aber in dem Beispielcode wird
einfach an diese Adresse der Wert show geschrieben. Wieso ist das
erlaubt? Kann das nicht undefiniertes Verhalten bewirken?