Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //--------------------------------------------------------------
- // File : stm32_ub_lcd_ssd1289.c
- // Datum : 09.04.2013
- // Version : 1.0
- // Autor : UB
- // EMail : mc-4u(@)t-online.de
- // Web : www.mikrocontroller-4u.de
- // CPU : STM32F4
- // IDE : CooCox CoIDE 1.7.0
- // Module : GPIO,FSMC
- // Funktion : Grafik-LCD Funktionen (Chip=SSD1289)
- // Der Zugriff erfolgt ueber den FSMC-Controller
- // Im 16bit 8080-Mode (5R6G5B = RGB565)
- // Hinweis : Das Display benutzt die CPU-Pins :
- // PB0 -> LCD_Backlight PE3 -> LCD_RS
- // PD0 -> LCD_DB2 PE7 -> LCD_DB4
- // PD1 -> LCD_DB3 PE8 -> LCD_DB5
- // PD4 -> LCD_RD PE9 -> LCD_DB6
- // PD5 -> LCD_WR PE10 -> LCD_DB7
- // PD7 -> LCD_CS PE11 -> LCD_DB10
- // PD8 -> LCD_DB15 PE12 -> LCD_DB11
- // PD9 -> LCD_DB16 PE13 -> LCD_DB12
- // PD10 -> LCD_DB17 PE14 -> LCD_DB13
- // PD14 -> LCD_DB0 PE15 -> LCD_DB14
- // PD15 -> LCD_DB1
- //--------------------------------------------------------------
- //--------------------------------------------------------------
- // Includes
- //--------------------------------------------------------------
- #include "stm32_ub_lcd_ssd1289.h"
- #define delay_ms P_LCD1289_Delay
- #define LCD_WriteReg P_LCD1289_WriteReg
- //--------------------------------------------------------------
- // interne Funktionen
- //--------------------------------------------------------------
- void P_LCD1289_InitIO(void);
- void P_LCD1289_InitFSMC(void);
- void P_LCD1289_InitChip(uint16_t mode);
- uint16_t P_LCD1289_ReadReg(uint8_t reg_adr);
- void P_LCD1289_WriteReg(uint8_t reg_adr, uint16_t reg_value);
- void P_LCD1289_Delay(volatile uint32_t nCount);
- //--------------------------------------------------------------
- // Init vom LCD-Display
- // Return_wert :
- // -> ERROR , wenn Display nicht gefunden wurde
- // -> SUCCESS , wenn Display OK (ID=1289 oder ID=8989)
- //--------------------------------------------------------------
- ErrorStatus UB_LCD_Init(void)
- {
- ErrorStatus ret_wert=ERROR;
- uint16_t lcdid = 0;
- // IO-Lines initialisieren
- P_LCD1289_InitIO();
- // kleine Pause
- P_LCD1289_Delay(LCD_SSD1289_PAUSE);
- // FSMC initialisieren
- P_LCD1289_InitFSMC();
- // kleine Pause
- P_LCD1289_Delay(LCD_SSD1289_PAUSE);
- // LCD-ID auslesen
- lcdid = P_LCD1289_ReadReg(LCD_SSD1289_REG_00);
- if((lcdid==LCD_SSD1289_ID1) || (lcdid==LCD_SSD1289_ID2)) {
- // Display gefunden
- ret_wert=SUCCESS;
- // LCD-Controller initialisieren (Mode=Portrait)
- P_LCD1289_InitChip(LCD_SSD1289_PORTRAIT);
- LCD_DISPLAY_MODE=PORTRAIT;
- // Backlight einschalten
- UB_LCD_Backlight_On();
- }
- LCD_WINDOW.xstart=0;
- LCD_WINDOW.ystart=0;
- LCD_WINDOW.xend=LCD_MAXX-1;
- LCD_WINDOW.yend=LCD_MAXY-1;
- LCD_WINDOW.pixel=LCD_PIXEL;
- return(ret_wert);
- }
- //--------------------------------------------------------------
- // setzt den Cursor auf x,y Position
- // und bereitet das schreiben ins Display-RAM vor
- //--------------------------------------------------------------
- void UB_LCD_SetCursor2Draw(uint16_t xpos, uint16_t ypos)
- {
- // Cursor setzen
- P_LCD1289_WriteReg(LCD_SSD1289_REG_4E, xpos);
- P_LCD1289_WriteReg(LCD_SSD1289_REG_4F, ypos);
- // adresse anlegen
- LCD_REG=LCD_SSD1289_REG_22;
- }
- //--------------------------------------------------------------
- // Füllt den Screen mit einer Farbe
- //--------------------------------------------------------------
- void UB_LCD_FillScreen(uint16_t color)
- {
- uint32_t n = 0;
- // Cursor auf 0 setzen
- UB_LCD_SetCursor2Draw(LCD_WINDOW.xstart,LCD_WINDOW.ystart);
- // Komplettes Display beschreiben
- for(n=0;n<LCD_WINDOW.pixel;n++) {
- LCD_RAM = color;
- }
- }
- //--------------------------------------------------------------
- // Backlight einschalten
- //--------------------------------------------------------------
- void UB_LCD_Backlight_On(void)
- {
- GPIOB->BSRRH = GPIO_Pin_0;
- }
- //--------------------------------------------------------------
- // Backlight ausschalten
- //--------------------------------------------------------------
- void UB_LCD_Backlight_Off(void)
- {
- GPIOB->BSRRL = GPIO_Pin_0;
- }
- //--------------------------------------------------------------
- // Screen-Mode einstellen
- // muss direkt nach dem Init gemacht werden
- //
- // Mode : [PORTRAIT=default, LANDSCAPE]
- //--------------------------------------------------------------
- void UB_LCD_SetMode(LCD_MODE_t mode)
- {
- if(mode==PORTRAIT) {
- P_LCD1289_InitChip(LCD_SSD1289_PORTRAIT);
- LCD_DISPLAY_MODE=PORTRAIT;
- }
- else {
- P_LCD1289_InitChip(LCD_SSD1289_LANDSCAPE);
- LCD_DISPLAY_MODE=LANDSCAPE;
- }
- }
- //--------------------------------------------------------------
- // stellt ein Display-Fenster zum zeichnen ein
- // von xtart,ystart zu xend,yend
- //--------------------------------------------------------------
- void UB_LCD_SetWindow(uint16_t xstart, uint16_t ystart, uint16_t xend, uint16_t yend)
- {
- uint16_t start,end;
- uint16_t xstart_end;
- start=(xstart&0x00FF);
- end=((xend&0x00FF)<<8);
- xstart_end=(start | end);
- P_LCD1289_WriteReg(LCD_SSD1289_REG_44, xstart_end);
- P_LCD1289_WriteReg(LCD_SSD1289_REG_45, ystart);
- P_LCD1289_WriteReg(LCD_SSD1289_REG_46, yend);
- LCD_WINDOW.xstart=xstart;
- LCD_WINDOW.ystart=ystart;
- LCD_WINDOW.xend=xend;
- LCD_WINDOW.yend=yend;
- LCD_WINDOW.pixel=(xend-xstart+1)*(yend-ystart+1);
- }
- //--------------------------------------------------------------
- // interne Funktion
- // Init aller IO-Pins fuer das Display
- //--------------------------------------------------------------
- void P_LCD1289_InitIO(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- /* Enable GPIOs clock */
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE , ENABLE);
- /* Enable FSMC clock */
- RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC, ENABLE);
- /*-- GPIOs Configuration ------------------------------------------------------*/
- /*
- +-------------------+--------------------+------------------+------------------+
- + SRAM pins assignment +
- +-------------------+--------------------+
- */
- /* GPIOD configuration */
- /* Set PD.00(D2), PD.01(D3), PD.04(NOE), PD.05(NWE), PD.08(D13), PD.09(D14),
- PD.10(D15), PD.11(A16), PD.14(D0), PD.15(D1) as alternate function push pull */
- GPIO_PinAFConfig(GPIOD, GPIO_PinSource0, GPIO_AF_FSMC);
- GPIO_PinAFConfig(GPIOD, GPIO_PinSource1, GPIO_AF_FSMC);
- GPIO_PinAFConfig(GPIOD, GPIO_PinSource4, GPIO_AF_FSMC);
- GPIO_PinAFConfig(GPIOD, GPIO_PinSource5, GPIO_AF_FSMC);
- GPIO_PinAFConfig(GPIOD, GPIO_PinSource8, GPIO_AF_FSMC);
- GPIO_PinAFConfig(GPIOD, GPIO_PinSource9, GPIO_AF_FSMC);
- GPIO_PinAFConfig(GPIOD, GPIO_PinSource10, GPIO_AF_FSMC);
- GPIO_PinAFConfig(GPIOD, GPIO_PinSource11, GPIO_AF_FSMC);
- GPIO_PinAFConfig(GPIOD, GPIO_PinSource14, GPIO_AF_FSMC);
- GPIO_PinAFConfig(GPIOD, GPIO_PinSource15, GPIO_AF_FSMC);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 |
- GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 |
- GPIO_Pin_14 | GPIO_Pin_15;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
- GPIO_Init(GPIOD, &GPIO_InitStructure);
- /* Set PE.07(D4), PE.08(D5), PE.09(D6), PE.10(D7), PE.11(D8), PE.12(D9), PE.13(D10),
- PE.14(D11), PE.15(D12) as alternate function push pull */
- /* GPIOE configuration */
- GPIO_PinAFConfig(GPIOE, GPIO_PinSource2 , GPIO_AF_FSMC);
- GPIO_PinAFConfig(GPIOE, GPIO_PinSource7 , GPIO_AF_FSMC);
- GPIO_PinAFConfig(GPIOE, GPIO_PinSource8 , GPIO_AF_FSMC);
- GPIO_PinAFConfig(GPIOE, GPIO_PinSource9 , GPIO_AF_FSMC);
- GPIO_PinAFConfig(GPIOE, GPIO_PinSource10 , GPIO_AF_FSMC);
- GPIO_PinAFConfig(GPIOE, GPIO_PinSource11 , GPIO_AF_FSMC);
- GPIO_PinAFConfig(GPIOE, GPIO_PinSource12 , GPIO_AF_FSMC);
- GPIO_PinAFConfig(GPIOE, GPIO_PinSource13 , GPIO_AF_FSMC);
- GPIO_PinAFConfig(GPIOE, GPIO_PinSource14 , GPIO_AF_FSMC);
- GPIO_PinAFConfig(GPIOE, GPIO_PinSource15 , GPIO_AF_FSMC);
- GPIO_InitStructure.GPIO_Pin =GPIO_Pin_2 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 |
- GPIO_Pin_11| GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
- GPIO_Init(GPIOE, &GPIO_InitStructure);
- }
- //--------------------------------------------------------------
- // interne Funktion
- // Init vom FSMC fuer das Display
- // CS an PD7=FSMC_NE1 = Bank-1 / PSRAM-1
- //--------------------------------------------------------------
- void P_LCD1289_InitFSMC(void)
- {
- FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure;
- FSMC_NORSRAMTimingInitTypeDef FSMC_NORSRAMTimingInitStructure;
- //-----------------------------------------
- // Clock Enable von FSMC
- //-----------------------------------------
- RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC, ENABLE);
- //-----------------------------------------
- // Structure fuer das Timing
- //-----------------------------------------
- FSMC_NORSRAMTimingInitStructure.FSMC_AddressSetupTime = LCD_SSD1289_FSMC_AST;
- FSMC_NORSRAMTimingInitStructure.FSMC_AddressHoldTime = 1;
- FSMC_NORSRAMTimingInitStructure.FSMC_DataSetupTime = LCD_SSD1289_FSMC_DST;
- FSMC_NORSRAMTimingInitStructure.FSMC_BusTurnAroundDuration = 0;
- FSMC_NORSRAMTimingInitStructure.FSMC_CLKDivision = 0;
- FSMC_NORSRAMTimingInitStructure.FSMC_DataLatency = 0;
- FSMC_NORSRAMTimingInitStructure.FSMC_AccessMode = FSMC_AccessMode_A;
- //-----------------------------------------
- // Structure fuer Bank-1 / PSRAM-1
- //-----------------------------------------
- FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1;
- FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
- FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;
- FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
- FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
- FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable;
- FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
- FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;
- FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
- FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
- FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
- FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;
- FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
- FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &FSMC_NORSRAMTimingInitStructure;
- FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &FSMC_NORSRAMTimingInitStructure;
- // Config vom FSMC
- FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);
- // Enable Bank-1 / PSRAM-1
- FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);
- }
- //--------------------------------------------------------------
- // interne Funktion
- // initialisiert den SSD1289-Controller im Display
- // mode : 0x6830=Portrait, 0x6838=Landscape
- //--------------------------------------------------------------
- void P_LCD1289_InitChip(uint16_t mode)
- {
- LCD_WriteReg(0x0000,0x0001); delay_ms(50); /* Enable LCD Oscillator */
- LCD_WriteReg(0x0003,0xA8A4); delay_ms(50);
- LCD_WriteReg(0x000C,0x0000); delay_ms(50);
- LCD_WriteReg(0x000D,0x080C); delay_ms(50);
- LCD_WriteReg(0x000E,0x2B00); delay_ms(50);
- LCD_WriteReg(0x001E,0x00B0); delay_ms(50);
- LCD_WriteReg(0x0001,0x2B3F); delay_ms(50); /* 320*240 0x2B3F */
- LCD_WriteReg(0x0002,0x0600); delay_ms(50);
- LCD_WriteReg(0x0010,0x0000); delay_ms(50);
- LCD_WriteReg(0x0011,0x6070); delay_ms(50);
- LCD_WriteReg(0x0005,0x0000); delay_ms(50);
- LCD_WriteReg(0x0006,0x0000); delay_ms(50);
- LCD_WriteReg(0x0016,0xEF1C); delay_ms(50);
- LCD_WriteReg(0x0017,0x0003); delay_ms(50);
- LCD_WriteReg(0x0007,0x0133); delay_ms(50);
- LCD_WriteReg(0x000B,0x0000); delay_ms(50);
- LCD_WriteReg(0x000F,0x0000); delay_ms(50);
- LCD_WriteReg(0x0041,0x0000); delay_ms(50);
- LCD_WriteReg(0x0042,0x0000); delay_ms(50);
- LCD_WriteReg(0x0048,0x0000); delay_ms(50);
- LCD_WriteReg(0x0049,0x013F); delay_ms(50);
- LCD_WriteReg(0x004A,0x0000); delay_ms(50);
- LCD_WriteReg(0x004B,0x0000); delay_ms(50);
- LCD_WriteReg(0x0044,0xEF00); delay_ms(50);
- LCD_WriteReg(0x0045,0x0000); delay_ms(50);
- LCD_WriteReg(0x0046,0x013F); delay_ms(50);
- LCD_WriteReg(0x0030,0x0707); delay_ms(50);
- LCD_WriteReg(0x0031,0x0204); delay_ms(50);
- LCD_WriteReg(0x0032,0x0204); delay_ms(50);
- LCD_WriteReg(0x0033,0x0502); delay_ms(50);
- LCD_WriteReg(0x0034,0x0507); delay_ms(50);
- LCD_WriteReg(0x0035,0x0204); delay_ms(50);
- LCD_WriteReg(0x0036,0x0204); delay_ms(50);
- LCD_WriteReg(0x0037,0x0502); delay_ms(50);
- LCD_WriteReg(0x003A,0x0302); delay_ms(50);
- LCD_WriteReg(0x003B,0x0302); delay_ms(50);
- LCD_WriteReg(0x0023,0x0000); delay_ms(50);
- LCD_WriteReg(0x0024,0x0000); delay_ms(50);
- LCD_WriteReg(0x0025,0x8000); delay_ms(50);
- LCD_WriteReg(0x004f,0);
- LCD_WriteReg(0x004e,0);
- LCD_WriteReg(0x0011,0x6068);
- }
- //--------------------------------------------------------------
- // interne Funktion
- // einen Wert aus einem Register auslesen
- //--------------------------------------------------------------
- uint16_t P_LCD1289_ReadReg(uint8_t reg_adr)
- {
- // adresse anlegen
- LCD_REG = reg_adr;
- // wert auslesen
- return LCD_RAM;
- }
- //--------------------------------------------------------------
- // interne Funktion
- // einen Wert in eine Register schreiben
- //--------------------------------------------------------------
- void P_LCD1289_WriteReg(uint8_t reg_adr, uint16_t reg_value)
- {
- // adresse anlegen
- LCD_REG = reg_adr;
- // wert schreiben
- LCD_RAM = reg_value;
- }
- //--------------------------------------------------------------
- // kleine Pause (ohne Timer)
- //--------------------------------------------------------------
- void P_LCD1289_Delay(volatile uint32_t nCount)
- {
- while(nCount--)
- {
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement