[Atmel] 跑一下SAM4N例程(二十四):SS1306

[复制链接]
 楼主| ddllxxrr 发表于 2015-5-4 21:25 | 显示全部楼层 |阅读模式
SS1306是SPI驱动的OLED,OLED就特点就是不用背光,且还挺省电,显示也很清楚。

这个例程,有四个配置h文件:

conf_board.h:主要配置开发板的接口


  1. #ifndef CONF_BOARD_H_INCLUDED
  2. #define CONF_BOARD_H_INCLUDED

  3. /** Enable the OLED screen. */
  4. #define CONF_BOARD_SPI
  5. #define CONF_BOARD_SPI_NPCS2

  6. #define CONF_BOARD_OLED_UG_2832HSWEG04

  7. #endif /* CONF_BOARD_H_INCLUDED */


而这些定义的实现函数在init.c中。

conf_clock.h:用来配置时钟源

  1. #ifndef CONF_CLOCK_H_INCLUDED
  2. #define CONF_CLOCK_H_INCLUDED

  3. // ===== System Clock (MCK) Source Options
  4. //#define CONFIG_SYSCLK_SOURCE        SYSCLK_SRC_SLCK_RC
  5. //#define CONFIG_SYSCLK_SOURCE        SYSCLK_SRC_SLCK_XTAL
  6. //#define CONFIG_SYSCLK_SOURCE        SYSCLK_SRC_SLCK_BYPASS
  7. //#define CONFIG_SYSCLK_SOURCE        SYSCLK_SRC_MAINCK_4M_RC
  8. //#define CONFIG_SYSCLK_SOURCE        SYSCLK_SRC_MAINCK_8M_RC
  9. //#define CONFIG_SYSCLK_SOURCE        SYSCLK_SRC_MAINCK_12M_RC
  10. //#define CONFIG_SYSCLK_SOURCE        SYSCLK_SRC_MAINCK_XTAL
  11. //#define CONFIG_SYSCLK_SOURCE        SYSCLK_SRC_MAINCK_BYPASS
  12. #define CONFIG_SYSCLK_SOURCE        SYSCLK_SRC_PLLACK

  13. // ===== System Clock (MCK) Prescaler Options   (Fmck = Fsys / (SYSCLK_PRES))
  14. //#define CONFIG_SYSCLK_PRES          SYSCLK_PRES_1
  15. #define CONFIG_SYSCLK_PRES          SYSCLK_PRES_2
  16. //#define CONFIG_SYSCLK_PRES          SYSCLK_PRES_4
  17. //#define CONFIG_SYSCLK_PRES          SYSCLK_PRES_8
  18. //#define CONFIG_SYSCLK_PRES          SYSCLK_PRES_16
  19. //#define CONFIG_SYSCLK_PRES          SYSCLK_PRES_32
  20. //#define CONFIG_SYSCLK_PRES          SYSCLK_PRES_64
  21. //#define CONFIG_SYSCLK_PRES          SYSCLK_PRES_3

  22. // ===== PLL0 (A) Options   (Fpll = (Fclk * PLL_mul) / PLL_div)
  23. // Use mul and div effective values here.
  24. #define CONFIG_PLL0_SOURCE          PLL_SRC_MAINCK_8M_RC
  25. #define CONFIG_PLL0_MUL             25
  26. #define CONFIG_PLL0_DIV             1

  27. // ===== Target frequency (System clock)
  28. // - Internal RC frequency: 8MHz
  29. // - System clock source: PLLA
  30. // - System clock prescaler: 2 (divided by 2)
  31. // - PLLA source: 8M_RC
  32. // - PLLA output: 8M_RC * 25 / 1
  33. // - System clock: 8M_RC * 25 / 1 / 2 = 100MHz

  34. #endif /* CONF_CLOCK_H_INCLUDED */

可以看出本例中用了PLL时钟源是8MHZ内部RC
conf_SPI_master.h:
配置SPI主机的一些参数。

  1. /* Possibility to change low-level configurations here. */

  2. //! Default Configuration of SPI Master Delay BCS
  3. #define CONFIG_SPI_MASTER_DELAY_BCS            0x00

  4. //! Default Configuration of SPI Master Bits per Transfer Definition
  5. #define CONFIG_SPI_MASTER_BITS_PER_TRANSFER    8

  6. //! Default Configuration of SPI Master Delay BCT
  7. #define CONFIG_SPI_MASTER_DELAY_BCT            0x00

  8. //! Default Configuration of SPI Master Delay BS
  9. #define CONFIG_SPI_MASTER_DELAY_BS             0x00

  10. //! Default Configuration of SPI Master Dummy Field
  11. // #define CONFIG_SPI_MASTER_DUMMY                0xFF

  12. #endif /* CONF_SPI_MASTER_H_INCLUDED */
conf_ssd1306.h:主要定义控制管脚及SPI速率

  1. #ifndef CONF_SSD1306_H_INCLUDED
  2. #define CONF_SSD1306_H_INCLUDED

  3. // Interface configuration for SAM4N Xplained Pro
  4. #define SSD1306_SPI_INTERFACE
  5. #define SSD1306_SPI SPI

  6. #define SSD1306_DC_PIN       UG_2832HSWEG04_DATA_CMD_GPIO
  7. #define SSD1306_RES_PIN      UG_2832HSWEG04_RESET_GPIO
  8. #define SSD1306_CS_PIN       UG_2832HSWEG04_SS

  9. // Minimum clock period is 50ns[url=home.php?mod=space&uid=517595]@3.3V[/url] -> max frequency is 20MHz
  10. #define SSD1306_CLOCK_SPEED          UG_2832HSWEG04_BAUDRATE
  11. #define SSD1306_DISPLAY_CONTRAST_MAX 40
  12. #define SSD1306_DISPLAY_CONTRAST_MIN 30


而主函数只是先添满显示区,然后利用硬件滚屏。

  1. // fill display with lines
  2.         for (page_address = 0; page_address <= 7; page_address++) {
  3.                 ssd1306_set_page_address(page_address);
  4.                 for (column_address = 0; column_address < 128; column_address++) {
  5.                         ssd1306_set_column_address(column_address);
  6.                         /* fill every other pixel in the display. This will produce
  7.                         horizontal lines on the display. */
  8.                         ssd1306_write_data(0x6F);
  9.                 }
  10.         }

  11.         // scroll the display using hardware support in the LCD controller
  12.         while (true) {
  13.                 ssd1306_set_display_start_line_address(start_line_address++);
  14.                 delay_ms(250);
  15.         }


最后的运行效果如下:


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:http://shop34182318.taobao.com/ http://shop562064536.taobao.com

2403

主题

6994

帖子

68

粉丝
快速回复 在线客服 返回列表 返回顶部