本帖最后由 jinglixixi 于 2018-11-19 16:01 编辑
前面介绍了LCD5110屏的显示方法,这次再介绍一下如何使用SPI接口的OLED屏,并实现A/D采样值的显示。
1)SPI_OLED屏显示 为充分利用Arduino UNO扩展接口,这次还是用它来与OLED屏来进行连接,其连接关系如下: GND--GND VCC --P1.29 SCLK--P0.8 D0 DIN --P0.9 D1 RST --P0.2 DC --P2.3 CS --P1.28
之所以用P1.29来充当电源是因为OLED屏的电源引脚与板上提供的电源引脚正相反,无奈之下只好错位使用了。 对应相应引脚输出高低电平的语句为: #define LCD_LED_H Chip_GPIO_SetPinState(LPC_GPIO, 1, 29, 1);
#define OLED_SCLK_Clr() Chip_GPIO_SetPinState(LPC_GPIO, 0, 8, 0); #define OLED_SCLK_Set() Chip_GPIO_SetPinState(LPC_GPIO, 0, 8, 1);
#define OLED_SDIN_Clr() Chip_GPIO_SetPinState(LPC_GPIO, 0, 9, 0); #define OLED_SDIN_Set() Chip_GPIO_SetPinState(LPC_GPIO, 0, 9, 1);
#define OLED_RST_Clr() Chip_GPIO_SetPinState(LPC_GPIO, 0, 2, 0); #define OLED_RST_Set() Chip_GPIO_SetPinState(LPC_GPIO, 0, 2, 1);
#define OLED_DC_Clr() Chip_GPIO_SetPinState(LPC_GPIO, 2, 3, 0); #define OLED_DC_Set() Chip_GPIO_SetPinState(LPC_GPIO, 2, 3, 1);
#define OLED_CS_Clr() Chip_GPIO_SetPinState(LPC_GPIO, 1, 28, 0); #define OLED_CS_Set() Chip_GPIO_SetPinState(LPC_GPIO, 1, 28, 1);
配置相关引脚为输出引脚的函数为: - void LCD_GPIO_Cogfig(void)
- {
- Chip_GPIO_SetPinDIROutput(LPC_GPIO, 1, 29);
- Chip_GPIO_SetPinDIROutput(LPC_GPIO, 0, 8);
- Chip_GPIO_SetPinDIROutput(LPC_GPIO, 0, 9);
- Chip_GPIO_SetPinDIROutput(LPC_GPIO, 0, 2);
- Chip_GPIO_SetPinDIROutput(LPC_GPIO, 2, 3);
- Chip_GPIO_SetPinDIROutput(LPC_GPIO, 1, 28);
- LCD_LED_H;
- }
复制代码
测试显示情况的主程序为: - int main(void)
- {
- SystemCoreClockUpdate();
- Board_Init();
- OLED_Init();
- OLED_Clear();
- OLED_ShowString(8,0,"LPC11U68");
- OLED_ShowString(8,2,"OLED TEST");
- OLED_ShowString(8,4,"JINGLIXIXI");
- OLED_ShowString(8,6,"2018/11/18");
- while (1);
- return 0;
- }
复制代码
2)A/D采样显示 有了OLED屏的显示功能,我们可以结合例程所提供温度检测程序来实现数据的直观显示,其效果如下图所示,其中第一个数据为本轮的最近采样值,第二个数据为本轮的最初采样值。 A/D采样显示效果
实现上面显示效果的主程序为: - int main(void)
- {
- uint32_t rawSample;
- SystemCoreClockUpdate();
- Board_Init();
- OLED_Init();
- OLED_Clear();
- OLED_ShowString(8,0,"LPC11U68");
- OLED_ShowString(8,2,"Temperature");
- Chip_ADC_Init(LPC_ADC, 0);
- Chip_ADC_SetClockRate(LPC_ADC, 250000);
- Chip_ADC_SetupSequencer(LPC_ADC, ADC_SEQA_IDX, (ADC_SEQ_CTRL_CHANSEL(0) |ADC_SEQ_CTRL_MODE_EOS));
- Chip_SYSCTL_PowerUp(SYSCTL_POWERDOWN_TS_PD);
- Chip_ADC_SetTrim(LPC_ADC, ADC_TRIM_VRANGE_HIGHV);
- Chip_ADC_StartCalibration(LPC_ADC);
- while (!(Chip_ADC_IsCalibrationDone(LPC_ADC))) {}
- Chip_ADC_ClearFlags(LPC_ADC, Chip_ADC_GetFlags(LPC_ADC));
- Chip_ADC_EnableInt(LPC_ADC, ADC_INTEN_SEQA_ENABLE);
- NVIC_EnableIRQ(ADC_A_IRQn);
- Chip_ADC_EnableSequencer(LPC_ADC, ADC_SEQA_IDX);
- SysTick_Config(SystemCoreClock / TICKRATE_HZ);
- while(1) {
- if (tempCycleComplete()) {
- rawSample = tempGetSample();
- if ((rawSample & ADC_SEQ_GDAT_DATAVALID) != 0) {
- OLED_ShowNum(0,4,ADC_DR_RESULT(rawSample),6,16); //0xfff=4095
- OLED_ShowNum(0,6,ADC_DR_RESULT(temp[0]),6,16);
- }
- else {
- OLED_ShowString(8,6,"Invalid");
- }
- }
- }
- return 0;
- }
复制代码
|