在线时间1258 小时
UID3174487
注册时间2015-10-31
NXP金币2015
TA的每日心情 | 开心 2025-5-29 08:54 |
---|
签到天数: 2992 天 连续签到: 8 天 [LV.Master]伴坛终老
金牌会员
 
- 积分
- 12035
- 最后登录
- 2025-5-29
|
本帖最后由 limale 于 2017-4-6 21:50 编辑
上一节通过驱动数码管【LPC54114】+ A2.GPIO操作点亮数码管了解了GPIO口的操作,这一节我们尝试用SPI来驱动一块0.96英寸的显示屏。这种oled屏幕,可以用SPI或者IIC来驱动,这里我们使用SPI来驱动管脚定义如下:
为了图省事RES、D/C、CS这三个端口我们直接使用板载驱动LED0、LED1、LED2的这三个口。
根据原理图可以知道我们这里需要配置的是SPI3。
- void SPI_oled_Init(void)
- {
- spi_master_config_t masterConfig = {0};
-
- /* attach 12 MHz clock to SPI3 */
- CLOCK_AttachClk(kFRO12M_to_FLEXCOMM3);
- /* reset FLEXCOMM for SPI */
- RESET_PeripheralReset(kFC3_RST_SHIFT_RSTn);
-
- /* SPI2 pins */
- IOCON_PinMuxSet(IOCON, 0, 14, (IOCON_FUNC2 | IOCON_MODE_PULLUP | IOCON_GPIO_MODE | IOCON_DIGITAL_EN)); /* SPI3_CS - FLASH */
- IOCON_PinMuxSet(IOCON, 0, 11, (IOCON_FUNC1 | IOCON_MODE_PULLUP | IOCON_GPIO_MODE | IOCON_DIGITAL_EN)); /* SPI3_SCK */
- IOCON_PinMuxSet(IOCON, 0, 12, (IOCON_FUNC1 | IOCON_MODE_PULLUP | IOCON_GPIO_MODE | IOCON_DIGITAL_EN)); /* SPI3_MOSI */
- IOCON_PinMuxSet(IOCON, 0, 13, (IOCON_FUNC1 | IOCON_MODE_PULLUP | IOCON_GPIO_MODE | IOCON_DIGITAL_EN)); /* SPI3_MISO */
-
- SPI_MasterGetDefaultConfig(&masterConfig);
- masterConfig.direction = kSPI_MsbFirst;
- masterConfig.polarity = kSPI_ClockPolarityActiveHigh;
- masterConfig.phase = kSPI_ClockPhaseFirstEdge;
- masterConfig.baudRate_Bps = 100000;
- masterConfig.sselNum = (spi_ssel_t)2; // use GPIO as CS is prefer
- SPI_MasterInit(SPI3, &masterConfig, CLOCK_GetFreq(kCLOCK_Flexcomm3));
- }
- status_t spi_oled_exchange(uint8_t *in, uint8_t *out, uint32_t size)
- {
- spi_transfer_t xfer;
- /* SPI master start transfer */
- xfer.txData = in;
- xfer.rxData = out;
- xfer.dataSize = size;
- xfer.configFlags = kSPI_FrameAssert;
- return SPI_MasterTransferBlocking(SPI3, &xfer);
- }
复制代码 除了显示数字和字符外,通过取模软件也可以显示汉字的。
- /* Init board hardware. */
- /* attach 12 MHz clock to FLEXCOMM0 (debug console) */
- CLOCK_AttachClk(BOARD_DEBUG_UART_CLK_ATTACH);
- BOARD_InitPins();
- BOARD_BootClockRUN();
- BOARD_InitDebugConsole();
-
- SystemCoreClockUpdate();
-
- SysTick_Config(SystemCoreClock/1000);
-
- PRINTF("\r\n-------------------------------\r\n\r\n");
- PRINTF("hello world.\r\n");
- PRINTF("LPC54110 Sys Clock is %dMhz.\r\n", SystemCoreClock/1000000);
- PRINTF("\r\n-------------------------------\r\n");
-
- CLOCK_EnableClock(kCLOCK_InputMux);
- CLOCK_EnableClock(kCLOCK_Iocon);
- CLOCK_EnableClock(kCLOCK_Gpio0);
- CLOCK_EnableClock(kCLOCK_Gpio1);
-
- // HC595Init();
- SPI_oled_Init();
- // I2C_oled_Init();
- led_init();
- key_init();
-
- HAL_Delay(10);
- OLED_Init();
- OLED_Clear();
- PRINTF("\r\n111111111111111111111111111\r\n");
- OLED_Clear();
- OLED_ShowCHinese(0,0,0);
- OLED_ShowCHinese(16,0,1);
- OLED_ShowCHinese(32,0,2);
- OLED_ShowCHinese(48,0,3);
- OLED_ShowCHinese(64,0,4);
- OLED_ShowCHinese(80,0,5);
- OLED_ShowCHinese(96,0,6);
- OLED_ShowCHinese(112,0,7);
- OLED_ShowString(0, 2, (char *)&str1, 16);
- OLED_ShowString(0, 4, (char *)&str2, 16);
- OLED_ShowString(0, 6, (char *)&str3, 16);
复制代码
上一张效果图,本来还打算以IIC的方式来驱动的,顺便熟悉一下IIC的操作不知道是不是哪里没配置好,还没有成功。
|
|