Hallo Leute, ich brauche eure Hilfe bei Grafik-Display mit ST7567-Controller. Ich versuche seit Wochen Grafik-Display ein Pixel zu setzten. Grüße, Patrick Dreger C-Code: #include "mcc_generated_files/mcc.h" #include "mcc_generated_files/spi1.h" #define x_max 132 #define x_min 0 #define y_max 32 #define y_min 0 #define row_max 8 #define row_min 0 #define buffer_size 1024 #define ON 1 #define OFF 0 #define round 1 #define square 0 #define Set_Column_Address_Low 0x00 #define Set_Column_Address_High 0x10 #define Select_Internal_Resistor_Ratio 0x22 #define Select_Internal_Power_Supply_Mode 0x28 #define Set_LCD_Start_Line 0x40 #define Set_Electronic_Volume_Mode 0x81 #define ADC_Select_Normal 0xA0 #define ADC_Select_Reverse 0xA1 #define Set_LCD_Bias_Low 0xA2 #define Set_LCD_Bias_High 0xA3 #define Display_All_Points_Off 0xA4 #define Display_All_Points_On 0xA5 #define Display_Normal 0xA6 #define Display_Reverse 0xA7 #define Display_Off 0xAE #define Display_On 0xAF #define Set_Page_Address 0xB0 #define Set_Common_Output_Normal 0xC0 #define Set_Common_Output_Reverse 0xC8 #define Internal_Reset 0xE2 #define NOP_cmd 0xE3 #define End_cmd 0xEE #define Set_Boost_Ratio_Low 0xF8 #define Set_Boost_Ratio_Medium 0xF9 #define Set_Boost_Ratio_High 0xFB #define Test_Display 0xFF #define CMD 0 #define DAT 1 uint8_t buffer[buffer_size]; uint8_t _lcd_init_data[15] = { 0xE2 , 0x40 , 0xA1 , 0xC0 , 0xA6 , 0xA2 , 0x2F , 0xF8 , 0x00 , 0x23 , 0x81 , 0x1F , 0xAC , 0x00 , 0xAF}; //uint8_t init_DOGM132[13] = {0xA2,0xA0,0xC0,0x22,0x81,0x1F,0xF8,0x00,0x2C,0x2E,0x2F,0xAF,0x00}; uint8_t x = 0x00; uint8_t lowbyte , highbyte = 0x00; void command(uint8_t dat,uint8_t type); void glcd_init(void); void glcd_clear(void); void GLCD_set_pixel(uint8_t x_pos, uint8_t y_pos, uint8_t colour); void main(void) { // Initialize the device SYSTEM_Initialize(); EUSART1_Initialize(); SPI1_Initialize(); SPI1_Open(SPI1_DEFAULT); glcd_init(); GLCD_set_pixel(5,5,1); while (1) { } SPI1_Close(); } void command(uint8_t dat,uint8_t type) { if(type == 0) { A0_SetLow(); } else { A0_SetHigh(); } __delay_us(10); CS1_SetLow(); EUSART1_Write(dat); SPI1_WriteByte(dat); __delay_us(10); CS1_SetHigh(); return; } void glcd_init(void) { uint8_t i = 0 ; RST_SetLow(); __delay_us(100); CS1_SetLow(); RST_SetHigh(); for (i= 0; i<15;i++) { SPI1_WriteByte(_lcd_init_data[i]); } return; } void glcd_clear(void) { uint8_t i = 0x00; uint8_t j = 0x00; for(i = row_min; i < row_max; i++) { command(i + 0xB0, CMD); command(0x10, CMD); command(0x04, CMD); for(j = x_min; j < x_max; j++) { command(0x00, DAT); } } return; } void GLCD_set_pixel(uint8_t x_pos, uint8_t y_pos, uint8_t colour) { uint8_t value = 0x00; if(y_pos > y_max) { y_pos = y_max; } if(x_pos > x_max) { x_pos = x_max; } command(Set_Page_Address + y_pos , DAT); x = x_pos << 4; x = x >> 4; //HighNibble command(Set_Column_Address_High + x , DAT); x = x_pos >> 4; //LowNibble command(Set_Column_Address_Low + x , DAT); if(colour >= 1) { value = 1; } else { value = 0; } command(value, DAT); return; }
Servus äh, ja, und was geht nicht? Wenn nix geht, hast du schon mal gemessen, ob deine serielle Schnittstelle funktioniert? Und was für einen PIC18 hast du? Stimmt die Baudrate? Also was weisst du an grundlegendem? Gerhard
Also. Ich sende die Initialisierungsdaten per SPI und mit Oszilloskop gemessen. Die Daten werden gesendet. Um sicher zu sein habe die Daten per Serial Port ausgegeben. Wenn ich nur ein Pixel anzeigen will macht es nichts. Wenn ich die Initialisierungsdaten ändere, zum Beispiel den Kontrast ändert sich auch der Kontrast, aber wenn ich Kontrast nach dem Initialisierung ändere, ändert sich nichts. Es fehlt mir ein Befehl oder Routine, aber ich weis nicht was.
Patrick D. schrieb: > Wenn ich die Initialisierungsdaten ändere, zum Beispiel den Kontrast > ändert sich auch der Kontrast, aber wenn ich Kontrast nach dem > Initialisierung ändere, ändert sich nichts. Na dann stimmt halt was mit deiner init. nicht! Interface falsch konfiguriert?!
Ich habe die Initialisierungsdaten aus fertigen anderen Code. Nur das ich die Befehle angepasst habe. PORT-Ausgänge, SPI-Schreibe-Befehl und Warte-Schleife. Ich hatte den Display mit BASCOM-AVR zum laufen gebracht und Initialisierungsdaten kopiert und der Ergebnis ist das selbe. _lcd_init_data = BASCOM-AVR Bibliothek "glcdEADOGM132x32.lib". Da ich mit Assembler auf Kriegsfuß stehe, hilft mir mir sehr wenig und kann nur zusammen reimen.
:
Bearbeitet durch User
Also so aus dem Bauch heraus: Müssten beim Pixelschreiben die command(..)-Aufrufe zur Adressierung der Seiten und der Spaltenadresse nicht mit type = CMD stattfinden anstatt DAT, damit die A0 auf 0 gesetzt wird?
McMix schrieb: > Also so aus dem Bauch heraus: > Müssten beim Pixelschreiben die command(..)-Aufrufe zur Adressierung der > Seiten und der Spaltenadresse nicht mit type = CMD stattfinden anstatt > DAT, damit die A0 auf 0 gesetzt wird? Da hast Du Recht, aber das ist nicht sein einziges Problem. Um ein Pixel zu schreiben, löscht er gleich sieben andere. So wird das nix. Entweder er liest vorher den Displayspeicher aus und macht entsprechende Verknüpfungen (langsam), oder er nutzt gleich einen Framebuffer. Mit
1 | uint8_t buffer[buffer_size]; |
ist das ja offensichtlich schon vorgesehen, wird nur nicht genutzt. Er scheint sich den Code zusammenkopiert zu haben, ohne zu versuchen, den zu verstehen. Dabei ist der Controller trivial wie ein SSD1306. Unschön ist auch, dass er dieselbe Frage nicht nur hier postet und das nichtmal erwähnt.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.