Advertisement
RODRIGO_RIBEIRO

stm32_ub_lcd_ssd1289.c CHANGED

Apr 26th, 2015
674
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.50 KB | None | 0 0
  1. //--------------------------------------------------------------
  2. // File : stm32_ub_lcd_ssd1289.c
  3. // Datum : 09.04.2013
  4. // Version : 1.0
  5. // Autor : UB
  6. // EMail : mc-4u(@)t-online.de
  7. // Web : www.mikrocontroller-4u.de
  8. // CPU : STM32F4
  9. // IDE : CooCox CoIDE 1.7.0
  10. // Module : GPIO,FSMC
  11. // Funktion : Grafik-LCD Funktionen (Chip=SSD1289)
  12. // Der Zugriff erfolgt ueber den FSMC-Controller
  13. // Im 16bit 8080-Mode (5R6G5B = RGB565)
  14. // Hinweis : Das Display benutzt die CPU-Pins :
  15. // PB0 -> LCD_Backlight PE3 -> LCD_RS
  16. // PD0 -> LCD_DB2 PE7 -> LCD_DB4
  17. // PD1 -> LCD_DB3 PE8 -> LCD_DB5
  18. // PD4 -> LCD_RD PE9 -> LCD_DB6
  19. // PD5 -> LCD_WR PE10 -> LCD_DB7
  20. // PD7 -> LCD_CS PE11 -> LCD_DB10
  21. // PD8 -> LCD_DB15 PE12 -> LCD_DB11
  22. // PD9 -> LCD_DB16 PE13 -> LCD_DB12
  23. // PD10 -> LCD_DB17 PE14 -> LCD_DB13
  24. // PD14 -> LCD_DB0 PE15 -> LCD_DB14
  25. // PD15 -> LCD_DB1
  26. //--------------------------------------------------------------
  27.  
  28. //--------------------------------------------------------------
  29. // Includes
  30. //--------------------------------------------------------------
  31. #include "stm32_ub_lcd_ssd1289.h"
  32. #define delay_ms P_LCD1289_Delay
  33. #define LCD_WriteReg P_LCD1289_WriteReg
  34. //--------------------------------------------------------------
  35. // interne Funktionen
  36. //--------------------------------------------------------------
  37. void P_LCD1289_InitIO(void);
  38. void P_LCD1289_InitFSMC(void);
  39. void P_LCD1289_InitChip(uint16_t mode);
  40. uint16_t P_LCD1289_ReadReg(uint8_t reg_adr);
  41. void P_LCD1289_WriteReg(uint8_t reg_adr, uint16_t reg_value);
  42. void P_LCD1289_Delay(volatile uint32_t nCount);
  43.  
  44.  
  45. //--------------------------------------------------------------
  46. // Init vom LCD-Display
  47. // Return_wert :
  48. // -> ERROR , wenn Display nicht gefunden wurde
  49. // -> SUCCESS , wenn Display OK (ID=1289 oder ID=8989)
  50. //--------------------------------------------------------------
  51. ErrorStatus UB_LCD_Init(void)
  52. {
  53. ErrorStatus ret_wert=ERROR;
  54. uint16_t lcdid = 0;
  55.  
  56. // IO-Lines initialisieren
  57. P_LCD1289_InitIO();
  58. // kleine Pause
  59. P_LCD1289_Delay(LCD_SSD1289_PAUSE);
  60. // FSMC initialisieren
  61. P_LCD1289_InitFSMC();
  62. // kleine Pause
  63. P_LCD1289_Delay(LCD_SSD1289_PAUSE);
  64.  
  65. // LCD-ID auslesen
  66. lcdid = P_LCD1289_ReadReg(LCD_SSD1289_REG_00);
  67. if((lcdid==LCD_SSD1289_ID1) || (lcdid==LCD_SSD1289_ID2)) {
  68. // Display gefunden
  69. ret_wert=SUCCESS;
  70. // LCD-Controller initialisieren (Mode=Portrait)
  71. P_LCD1289_InitChip(LCD_SSD1289_PORTRAIT);
  72. LCD_DISPLAY_MODE=PORTRAIT;
  73. // Backlight einschalten
  74. UB_LCD_Backlight_On();
  75. }
  76.  
  77. LCD_WINDOW.xstart=0;
  78. LCD_WINDOW.ystart=0;
  79. LCD_WINDOW.xend=LCD_MAXX-1;
  80. LCD_WINDOW.yend=LCD_MAXY-1;
  81. LCD_WINDOW.pixel=LCD_PIXEL;
  82.  
  83. return(ret_wert);
  84. }
  85.  
  86.  
  87. //--------------------------------------------------------------
  88. // setzt den Cursor auf x,y Position
  89. // und bereitet das schreiben ins Display-RAM vor
  90. //--------------------------------------------------------------
  91. void UB_LCD_SetCursor2Draw(uint16_t xpos, uint16_t ypos)
  92. {
  93. // Cursor setzen
  94. P_LCD1289_WriteReg(LCD_SSD1289_REG_4E, xpos);
  95. P_LCD1289_WriteReg(LCD_SSD1289_REG_4F, ypos);
  96.  
  97. // adresse anlegen
  98. LCD_REG=LCD_SSD1289_REG_22;
  99. }
  100.  
  101.  
  102. //--------------------------------------------------------------
  103. // Füllt den Screen mit einer Farbe
  104. //--------------------------------------------------------------
  105. void UB_LCD_FillScreen(uint16_t color)
  106. {
  107. uint32_t n = 0;
  108.  
  109. // Cursor auf 0 setzen
  110. UB_LCD_SetCursor2Draw(LCD_WINDOW.xstart,LCD_WINDOW.ystart);
  111. // Komplettes Display beschreiben
  112. for(n=0;n<LCD_WINDOW.pixel;n++) {
  113. LCD_RAM = color;
  114. }
  115. }
  116.  
  117.  
  118. //--------------------------------------------------------------
  119. // Backlight einschalten
  120. //--------------------------------------------------------------
  121. void UB_LCD_Backlight_On(void)
  122. {
  123. GPIOB->BSRRH = GPIO_Pin_0;
  124. }
  125.  
  126.  
  127. //--------------------------------------------------------------
  128. // Backlight ausschalten
  129. //--------------------------------------------------------------
  130. void UB_LCD_Backlight_Off(void)
  131. {
  132. GPIOB->BSRRL = GPIO_Pin_0;
  133. }
  134.  
  135. //--------------------------------------------------------------
  136. // Screen-Mode einstellen
  137. // muss direkt nach dem Init gemacht werden
  138. //
  139. // Mode : [PORTRAIT=default, LANDSCAPE]
  140. //--------------------------------------------------------------
  141. void UB_LCD_SetMode(LCD_MODE_t mode)
  142. {
  143. if(mode==PORTRAIT) {
  144. P_LCD1289_InitChip(LCD_SSD1289_PORTRAIT);
  145. LCD_DISPLAY_MODE=PORTRAIT;
  146. }
  147. else {
  148. P_LCD1289_InitChip(LCD_SSD1289_LANDSCAPE);
  149. LCD_DISPLAY_MODE=LANDSCAPE;
  150. }
  151. }
  152.  
  153.  
  154. //--------------------------------------------------------------
  155. // stellt ein Display-Fenster zum zeichnen ein
  156. // von xtart,ystart zu xend,yend
  157. //--------------------------------------------------------------
  158. void UB_LCD_SetWindow(uint16_t xstart, uint16_t ystart, uint16_t xend, uint16_t yend)
  159. {
  160. uint16_t start,end;
  161. uint16_t xstart_end;
  162.  
  163. start=(xstart&0x00FF);
  164. end=((xend&0x00FF)<<8);
  165. xstart_end=(start | end);
  166.  
  167. P_LCD1289_WriteReg(LCD_SSD1289_REG_44, xstart_end);
  168. P_LCD1289_WriteReg(LCD_SSD1289_REG_45, ystart);
  169. P_LCD1289_WriteReg(LCD_SSD1289_REG_46, yend);
  170.  
  171. LCD_WINDOW.xstart=xstart;
  172. LCD_WINDOW.ystart=ystart;
  173. LCD_WINDOW.xend=xend;
  174. LCD_WINDOW.yend=yend;
  175. LCD_WINDOW.pixel=(xend-xstart+1)*(yend-ystart+1);
  176. }
  177.  
  178.  
  179. //--------------------------------------------------------------
  180. // interne Funktion
  181. // Init aller IO-Pins fuer das Display
  182. //--------------------------------------------------------------
  183. void P_LCD1289_InitIO(void)
  184. {
  185. GPIO_InitTypeDef GPIO_InitStructure;
  186.  
  187. /* Enable GPIOs clock */
  188. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE , ENABLE);
  189.  
  190. /* Enable FSMC clock */
  191. RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC, ENABLE);
  192.  
  193. /*-- GPIOs Configuration ------------------------------------------------------*/
  194. /*
  195. +-------------------+--------------------+------------------+------------------+
  196. + SRAM pins assignment +
  197.  
  198. +-------------------+--------------------+
  199. */
  200. /* GPIOD configuration */
  201. /* Set PD.00(D2), PD.01(D3), PD.04(NOE), PD.05(NWE), PD.08(D13), PD.09(D14),
  202. PD.10(D15), PD.11(A16), PD.14(D0), PD.15(D1) as alternate function push pull */
  203. GPIO_PinAFConfig(GPIOD, GPIO_PinSource0, GPIO_AF_FSMC);
  204. GPIO_PinAFConfig(GPIOD, GPIO_PinSource1, GPIO_AF_FSMC);
  205. GPIO_PinAFConfig(GPIOD, GPIO_PinSource4, GPIO_AF_FSMC);
  206. GPIO_PinAFConfig(GPIOD, GPIO_PinSource5, GPIO_AF_FSMC);
  207. GPIO_PinAFConfig(GPIOD, GPIO_PinSource8, GPIO_AF_FSMC);
  208. GPIO_PinAFConfig(GPIOD, GPIO_PinSource9, GPIO_AF_FSMC);
  209. GPIO_PinAFConfig(GPIOD, GPIO_PinSource10, GPIO_AF_FSMC);
  210. GPIO_PinAFConfig(GPIOD, GPIO_PinSource11, GPIO_AF_FSMC);
  211. GPIO_PinAFConfig(GPIOD, GPIO_PinSource14, GPIO_AF_FSMC);
  212. GPIO_PinAFConfig(GPIOD, GPIO_PinSource15, GPIO_AF_FSMC);
  213.  
  214. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 |
  215. GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 |
  216. GPIO_Pin_14 | GPIO_Pin_15;
  217. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  218. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  219. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  220. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  221.  
  222. GPIO_Init(GPIOD, &GPIO_InitStructure);
  223.  
  224. /* Set PE.07(D4), PE.08(D5), PE.09(D6), PE.10(D7), PE.11(D8), PE.12(D9), PE.13(D10),
  225. PE.14(D11), PE.15(D12) as alternate function push pull */
  226. /* GPIOE configuration */
  227. GPIO_PinAFConfig(GPIOE, GPIO_PinSource2 , GPIO_AF_FSMC);
  228. GPIO_PinAFConfig(GPIOE, GPIO_PinSource7 , GPIO_AF_FSMC);
  229. GPIO_PinAFConfig(GPIOE, GPIO_PinSource8 , GPIO_AF_FSMC);
  230. GPIO_PinAFConfig(GPIOE, GPIO_PinSource9 , GPIO_AF_FSMC);
  231. GPIO_PinAFConfig(GPIOE, GPIO_PinSource10 , GPIO_AF_FSMC);
  232. GPIO_PinAFConfig(GPIOE, GPIO_PinSource11 , GPIO_AF_FSMC);
  233. GPIO_PinAFConfig(GPIOE, GPIO_PinSource12 , GPIO_AF_FSMC);
  234. GPIO_PinAFConfig(GPIOE, GPIO_PinSource13 , GPIO_AF_FSMC);
  235. GPIO_PinAFConfig(GPIOE, GPIO_PinSource14 , GPIO_AF_FSMC);
  236. GPIO_PinAFConfig(GPIOE, GPIO_PinSource15 , GPIO_AF_FSMC);
  237.  
  238. GPIO_InitStructure.GPIO_Pin =GPIO_Pin_2 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 |
  239. GPIO_Pin_11| GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
  240.  
  241. GPIO_Init(GPIOE, &GPIO_InitStructure);
  242.  
  243. }
  244.  
  245. //--------------------------------------------------------------
  246. // interne Funktion
  247. // Init vom FSMC fuer das Display
  248. // CS an PD7=FSMC_NE1 = Bank-1 / PSRAM-1
  249. //--------------------------------------------------------------
  250. void P_LCD1289_InitFSMC(void)
  251. {
  252. FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure;
  253. FSMC_NORSRAMTimingInitTypeDef FSMC_NORSRAMTimingInitStructure;
  254.  
  255. //-----------------------------------------
  256. // Clock Enable von FSMC
  257. //-----------------------------------------
  258. RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC, ENABLE);
  259.  
  260. //-----------------------------------------
  261. // Structure fuer das Timing
  262. //-----------------------------------------
  263. FSMC_NORSRAMTimingInitStructure.FSMC_AddressSetupTime = LCD_SSD1289_FSMC_AST;
  264. FSMC_NORSRAMTimingInitStructure.FSMC_AddressHoldTime = 1;
  265. FSMC_NORSRAMTimingInitStructure.FSMC_DataSetupTime = LCD_SSD1289_FSMC_DST;
  266. FSMC_NORSRAMTimingInitStructure.FSMC_BusTurnAroundDuration = 0;
  267. FSMC_NORSRAMTimingInitStructure.FSMC_CLKDivision = 0;
  268. FSMC_NORSRAMTimingInitStructure.FSMC_DataLatency = 0;
  269. FSMC_NORSRAMTimingInitStructure.FSMC_AccessMode = FSMC_AccessMode_A;
  270.  
  271. //-----------------------------------------
  272. // Structure fuer Bank-1 / PSRAM-1
  273. //-----------------------------------------
  274. FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1;
  275. FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
  276. FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;
  277. FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
  278. FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
  279. FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable;
  280. FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
  281. FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;
  282. FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
  283. FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
  284. FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
  285. FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;
  286. FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
  287. FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &FSMC_NORSRAMTimingInitStructure;
  288. FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &FSMC_NORSRAMTimingInitStructure;
  289.  
  290. // Config vom FSMC
  291. FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);
  292.  
  293. // Enable Bank-1 / PSRAM-1
  294. FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);
  295. }
  296.  
  297. //--------------------------------------------------------------
  298. // interne Funktion
  299. // initialisiert den SSD1289-Controller im Display
  300. // mode : 0x6830=Portrait, 0x6838=Landscape
  301. //--------------------------------------------------------------
  302. void P_LCD1289_InitChip(uint16_t mode)
  303. {
  304.  
  305. LCD_WriteReg(0x0000,0x0001); delay_ms(50); /* Enable LCD Oscillator */
  306. LCD_WriteReg(0x0003,0xA8A4); delay_ms(50);
  307. LCD_WriteReg(0x000C,0x0000); delay_ms(50);
  308. LCD_WriteReg(0x000D,0x080C); delay_ms(50);
  309. LCD_WriteReg(0x000E,0x2B00); delay_ms(50);
  310. LCD_WriteReg(0x001E,0x00B0); delay_ms(50);
  311. LCD_WriteReg(0x0001,0x2B3F); delay_ms(50); /* 320*240 0x2B3F */
  312. LCD_WriteReg(0x0002,0x0600); delay_ms(50);
  313. LCD_WriteReg(0x0010,0x0000); delay_ms(50);
  314. LCD_WriteReg(0x0011,0x6070); delay_ms(50);
  315. LCD_WriteReg(0x0005,0x0000); delay_ms(50);
  316. LCD_WriteReg(0x0006,0x0000); delay_ms(50);
  317. LCD_WriteReg(0x0016,0xEF1C); delay_ms(50);
  318. LCD_WriteReg(0x0017,0x0003); delay_ms(50);
  319. LCD_WriteReg(0x0007,0x0133); delay_ms(50);
  320. LCD_WriteReg(0x000B,0x0000); delay_ms(50);
  321. LCD_WriteReg(0x000F,0x0000); delay_ms(50);
  322. LCD_WriteReg(0x0041,0x0000); delay_ms(50);
  323. LCD_WriteReg(0x0042,0x0000); delay_ms(50);
  324. LCD_WriteReg(0x0048,0x0000); delay_ms(50);
  325. LCD_WriteReg(0x0049,0x013F); delay_ms(50);
  326. LCD_WriteReg(0x004A,0x0000); delay_ms(50);
  327. LCD_WriteReg(0x004B,0x0000); delay_ms(50);
  328. LCD_WriteReg(0x0044,0xEF00); delay_ms(50);
  329. LCD_WriteReg(0x0045,0x0000); delay_ms(50);
  330. LCD_WriteReg(0x0046,0x013F); delay_ms(50);
  331. LCD_WriteReg(0x0030,0x0707); delay_ms(50);
  332. LCD_WriteReg(0x0031,0x0204); delay_ms(50);
  333. LCD_WriteReg(0x0032,0x0204); delay_ms(50);
  334. LCD_WriteReg(0x0033,0x0502); delay_ms(50);
  335. LCD_WriteReg(0x0034,0x0507); delay_ms(50);
  336. LCD_WriteReg(0x0035,0x0204); delay_ms(50);
  337. LCD_WriteReg(0x0036,0x0204); delay_ms(50);
  338. LCD_WriteReg(0x0037,0x0502); delay_ms(50);
  339. LCD_WriteReg(0x003A,0x0302); delay_ms(50);
  340. LCD_WriteReg(0x003B,0x0302); delay_ms(50);
  341. LCD_WriteReg(0x0023,0x0000); delay_ms(50);
  342. LCD_WriteReg(0x0024,0x0000); delay_ms(50);
  343. LCD_WriteReg(0x0025,0x8000); delay_ms(50);
  344. LCD_WriteReg(0x004f,0);
  345. LCD_WriteReg(0x004e,0);
  346.  
  347. LCD_WriteReg(0x0011,0x6068);
  348. }
  349.  
  350. //--------------------------------------------------------------
  351. // interne Funktion
  352. // einen Wert aus einem Register auslesen
  353. //--------------------------------------------------------------
  354. uint16_t P_LCD1289_ReadReg(uint8_t reg_adr)
  355. {
  356. // adresse anlegen
  357. LCD_REG = reg_adr;
  358. // wert auslesen
  359. return LCD_RAM;
  360. }
  361.  
  362. //--------------------------------------------------------------
  363. // interne Funktion
  364. // einen Wert in eine Register schreiben
  365. //--------------------------------------------------------------
  366. void P_LCD1289_WriteReg(uint8_t reg_adr, uint16_t reg_value)
  367. {
  368. // adresse anlegen
  369. LCD_REG = reg_adr;
  370. // wert schreiben
  371. LCD_RAM = reg_value;
  372. }
  373.  
  374.  
  375. //--------------------------------------------------------------
  376. // kleine Pause (ohne Timer)
  377. //--------------------------------------------------------------
  378. void P_LCD1289_Delay(volatile uint32_t nCount)
  379. {
  380. while(nCount--)
  381. {
  382. }
  383. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement