0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

PIC32MX470的温湿度计:调SPI和OLED显示实验

算法&编程学院 来源:网络整理 2018-02-01 03:55 次阅读

温湿度可以正常读取了,接下来就是调SPI和OLED显示,尝试将数据通过OLED屏显示出来。

查看OLED屏的资料,支持多种连接方式,默认的是4线SPI,但是没有MISO,也就是说OLED屏没有输出信号,不可读。那就在Information sheet上找SPI的管脚,老原因接着用用X32接口上的SPI2。为了接线方便些,用邻近的管脚作RST和DC信号

224729ldf7wuwfufifiwde

由于X32上只有一个3.3V,温湿度传感器最高耐压5.5V,就把它接到5V上吧,按如下方式连接OLED屏和温湿度传感器

2

接下来依然是通过MHC来使能SPI驱动

1. 打开MHC的Options选项卡,找到SPI对应的driver选项打开并做相应的配置,我的配置如下

3

4

2. 打开MHC的Pin Settings,将RG6、RG7、RG8、RG9设置为SPI管脚,RB8设置为DC,RD7设置为RST

5

6

3. 然后生成代码,主要包含以下几个源文件

7

4. 分析SPI驱动代码后可知在SYS_Initialize中已经根据用户的配置调用了SPI相关的初始化函数,所以使用时只需要在代码里直接调用drv_spi_mapping.c中的其他API就可以了。但是SPI的速率较高,我设置的是5M,如果使用中断模式,处理不好中断频繁产生的话,不知道CPU是不是吃得消;以前在SAM4N上用过轮询方式的SPI,索性将代码拿来直接用,等到调通了之后再改成中断甚至DMA看能不能处理好。先不用MHC产生的代码了,相当于只利用了它的初始化和访问硬件的PLIB库。主要的spi和ssd1306的代码如下

bsp_spi.c

void spi_select_device(PORTS_CHANNEL ch, PORTS_BIT_POS pos)

{

SYS_PORTS_PinClear(PORTS_ID_0, ch, pos);

}

void spi_deselect_device(PORTS_CHANNEL ch, PORTS_BIT_POS pos)

{

SYS_PORTS_PinSet(PORTS_ID_0, ch, pos);

}

static inline void spi_write_single(uint8_t data)

{

PLIB_SPI_BufferWrite(SPI_ID_2, data);

}

bsp_ssd1306.c

#define SSD1306_SPI_INTERFACE

#define SSD1306_SPI SPI

#define SSD1306_DC_PIN_CH PORT_CHANNEL_B

#define SSD1306_DC_PIN_POS PORTS_BIT_POS_8

#define SSD1306_CS_PIN_CH PORT_CHANNEL_G

#define SSD1306_CS_PIN_POS PORTS_BIT_POS_9

#define SSD1306_RES_PIN_CH PORT_CHANNEL_D

#define SSD1306_RES_PIN_POS PORTS_BIT_POS_7

#define UG_2832HSWEG04_BAUDRATE 5000000

#define SSD1306_LATENCY 10

#define ssd1306_reset_clear() SYS_PORTS_PinClear(PORTS_ID_0, SSD1306_RES_PIN_CH, SSD1306_RES_PIN_POS)

#define ssd1306_reset_set() SYS_PORTS_PinSet(PORTS_ID_0, SSD1306_RES_PIN_CH, SSD1306_RES_PIN_POS)

// Data/CMD select, PC21Could not add reference to assembly IronPython.wpf

#define ssd1306_sel_data() SYS_PORTS_PinSet(PORTS_ID_0, SSD1306_DC_PIN_CH, SSD1306_DC_PIN_POS)

#define ssd1306_sel_cmd() SYS_PORTS_PinClear(PORTS_ID_0, SSD1306_DC_PIN_CH, SSD1306_DC_PIN_POS)

static inline void delay_us(unsigned int n)

{

volatile uint32_t i;

volatile uint32_t j;

i = (n > 0) ? n : 1;

for (; i > 0; i--) {

for (j = 0; j < 100; j++) {

;

}

}

}

static inline void ssd1306_write_command(uint8_t command)

{

spi_select_device(SSD1306_CS_PIN_CH, SSD1306_CS_PIN_POS);

ssd1306_sel_cmd();

spi_write_single(command);

delay_us(SSD1306_LATENCY); // At least 3us

spi_deselect_device(SSD1306_CS_PIN_CH, SSD1306_CS_PIN_POS);

}

static inline void ssd1306_write_data(uint8_t data)

{

spi_select_device(SSD1306_CS_PIN_CH, SSD1306_CS_PIN_POS);

ssd1306_sel_data();

spi_write_single(data);

delay_us(SSD1306_LATENCY); // At least 3us

spi_deselect_device(SSD1306_CS_PIN_CH, SSD1306_CS_PIN_POS);

}

static inline void ssd1306_hard_reset(void)

{

ssd1306_reset_clear();

delay_us(SSD1306_LATENCY); // At least 3us

ssd1306_reset_set();

delay_us(SSD1306_LATENCY); // At least 3us

}

static inline void ssd1306_set_page_address(uint8_t address)

{

// Make sure that the address is 4 bits (only 8 pages)

address &= 0x0F;

ssd1306_write_command(SSD1306_CMD_SET_PAGE_START_ADDRESS(address));

}

static inline void ssd1306_set_column_address(uint8_t address)

{

// Make sure the address is 7 bits

address &= 0x7F;

ssd1306_write_command(SSD1306_CMD_SET_HIGH_COL(address >> 4));

ssd1306_write_command(SSD1306_CMD_SET_LOW_COL(address & 0x0F));

}

static inline void ssd1306_clear(void)

{

uint8_t page = 0;

uint8_t col = 0;

for (page = 0; page < 8; ++page)

{

ssd1306_set_page_address(page);

ssd1306_set_column_address(0);

for (col = 0; col < 128; ++col)

{

ssd1306_write_data(0x00);

}

}

}

void ssd1306_init(void)

{

// Do a hard reset of the OLED display controller

ssd1306_hard_reset();

// Initialize the interface

ssd1306_interface_init();

// 1/32 Duty (0x0F~0x3F)

ssd1306_write_command(SSD1306_CMD_SET_MULTIPLEX_RATIO);

ssd1306_write_command(0x3F);

// Shift Mapping RAM Counter (0x00~0x3F)

ssd1306_write_command(SSD1306_CMD_SET_DISPLAY_OFFSET);

ssd1306_write_command(0x00);

// Set Mapping RAM Display Start Line (0x00~0x3F)

ssd1306_write_command(SSD1306_CMD_SET_START_LINE(0x00));

// Set Column Address 0 Mapped to SEG0

ssd1306_write_command(SSD1306_CMD_SET_SEGMENT_RE_MAP_COL127_SEG0);

// Set COM/Row Scan Scan from COM63 to 0

ssd1306_write_command(SSD1306_CMD_SET_COM_OUTPUT_SCAN_DOWN);

// Set COM Pins hardware configuration

ssd1306_write_command(SSD1306_CMD_SET_COM_PINS);

ssd1306_write_command(0x12);

ssd1306_set_contrast(0x8F);

// Disable Entire display On

ssd1306_write_command(SSD1306_CMD_ENTIRE_DISPLAY_AND_GDDRAM_ON);

ssd1306_display_invert_disable();

// Set Display Clock Divide Ratio / Oscillator Frequency (Default => 0x80)

ssd1306_write_command(SSD1306_CMD_SET_DISPLAY_CLOCK_DIVIDE_RATIO);

ssd1306_write_command(0x80);

// Enable charge pump regulator

ssd1306_write_command(SSD1306_CMD_SET_CHARGE_PUMP_SETTING);

ssd1306_write_command(0x14);

// Set VCOMH Deselect Level

ssd1306_write_command(SSD1306_CMD_SET_VCOMH_DESELECT_LEVEL);

ssd1306_write_command(0x40); // Default => 0x20 (0.77*VCC)

// Set Pre-Charge as 15 Clocks & Discharge as 1 Clock

ssd1306_write_command(SSD1306_CMD_SET_PRE_CHARGE_PERIOD);

ssd1306_write_command(0xF1);

ssd1306_display_on();

}

void ssd1306_write_text(const char *string)

{

uint8_t *char_ptr;

uint8_t i;

while (*string != 0) {

if (*string < 0x7F) {

char_ptr = font_table[*string - 32];

for (i = 1; i <= char_ptr[0]; i++) {

ssd1306_write_data(char_ptr[i]);

}

ssd1306_write_data(0x00);

}

string++;

}

}

5. 最后在APP_Tasks中初始化ssd1306,把原先读温湿度操作之后的串口打印,改成显示数据,每秒读一次并通过OLED屏显示出来

8

调试还算顺利,OLED显示如下

9

虽然显示的终端由串口改成了OLED屏,但换个马甲依然无法掩饰它的简陋。下一步就是移植μGUI装一回大尾巴狼,哈哈哈

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • PIC32MX470
    +关注

    关注

    0

    文章

    5

    浏览量

    1801
收藏 人收藏

    评论

    相关推荐

    冷库环境温湿度监控系统

    预防因温湿度波动导致的货物损失,确保产品从生产到消费终端的全链条品质稳定。 冷库环境温湿度监控系统,集数据采集、传输、处理、显示、报警于一体的智能化管理解决方案。通过实时监测、精准控制、预警报警、数据记录与分
    的头像 发表于 08-21 16:07 248次阅读

    Arduino Nano 和 NodeMCU ESP8266 读取 DHT11 环境温湿度数据及 OLED显示

    Arduino Nano 和 NodeMCU ESP8266 读取 DHT11 环境温湿度数据及 OLED显示
    的头像 发表于 08-13 18:04 860次阅读
    Arduino Nano 和 NodeMCU ESP8266 读取 DHT11 环境<b class='flag-5'>温湿度</b>数据及 <b class='flag-5'>OLED</b><b class='flag-5'>显示</b>

    温湿度监测系统应用

    在现代化工业生产、仓储管理、农业种植以及智能家居等领域,温湿度监测已成为不可或缺的一环。温湿度作为环境控制的关键因素,直接影响着产品质量、存储安全、作物生长效率以及居住舒适度。因此,一套高效、精准
    的头像 发表于 07-26 16:15 326次阅读

    库房温湿度自动监测系统

    仓储、库房在管理上,环境控制都是重中之重。库房温湿度自动监测系统作为一种更为便捷的解决方案,已经得到广泛的应用。 库房温湿度自动监测系统通过集成传感器、数据采集器、传输设备和管理平台等硬件设备,实现
    的头像 发表于 07-09 18:00 621次阅读

    粮仓温湿度监测解决方案

    温湿度是影响粮食储存品质的重要因素。过高的温度会加速粮食的呼吸作用,导致水分散失和品质下降。因此,粮仓的温湿度管理,成为了确保粮食储存安全和质量稳定的关键因素。方便及时发现粮仓的发热点,及时减少粮食
    的头像 发表于 07-04 16:37 288次阅读

    想要准确地测量环境温湿度温湿度传感器是关键!

    温湿度是生产生活中最重要的环境指标之一,不仅人需要在适宜的温湿度条件下保持良好的精神状态和敏捷的思维,食品、药品、各种仪器设备等都对环境温湿度有特殊的要求。基于对环境温湿度的要求,
    的头像 发表于 07-04 08:48 446次阅读

    无线温湿度监控系统

    无线温湿度监控系统,作为现代环境监测技术的杰出代表,已经广泛应用于各个行业和领域。利用无线通信技术,实现对环境温湿度的实时、远程监控,从而保障了各种设备和物品的安全运行和保存。 无线温湿度控制系统
    的头像 发表于 05-30 16:43 686次阅读

    小白测功耗之蓝牙温湿度传感器

    小小的温湿度计,是人们日常生活中的智能小帮手,也是极为典型的电池供电类低功耗产品。通常采用纽扣电池供电,可方便地摆放或粘贴于各种应用场景。市面上常见的温湿度计,功耗到底有多低?今天,我们就用即将
    的头像 发表于 04-16 08:04 1052次阅读
    小白测功耗之蓝牙<b class='flag-5'>温湿度</b>传感器

    温湿度监测物联网系统解决方案

    无论是在我们的日常生活中,还是在工业生产、科研实验等领域,温湿度都是一个不可或缺的因素。许多工业产品,如食品、药品、电子产品等,都需要在特定的温湿度环境下生产、储存和运输。一旦温湿度
    的头像 发表于 02-28 16:02 784次阅读
    <b class='flag-5'>温湿度</b>监测物联网系统解决方案

    温湿度传感器有哪些应用场景?

    温湿度传感器在众多领域,特别是在实时记录温湿度变化的工作中最为广泛。温湿度传感器可以根据所记录的内容,对其进行科学有效的管理、分析和归纳。下面我们就温湿度传感器在不同场景中的应用做下介
    的头像 发表于 02-19 16:28 1173次阅读
    <b class='flag-5'>温湿度</b>传感器有哪些应用场景?

    温湿度传感器工作原理 温湿度传感器的接线方法

    温湿度传感器是一种用于测量环境温度和相对湿度的装置。它通常用于工业、农业、气象、室内空调等领域。本文将详细介绍温湿度传感器的工作原理和接线方法。 一、温湿度传感器的工作原理
    的头像 发表于 02-14 18:00 8585次阅读

    温湿度监测系统解决方案应用场景

    随着生活水平质量不断提高,因温度引发的各行业越来越重视产品生产、物品设备、存储等温湿度管理环境。科学应用温湿度监测系统,确保在储运过程中或实验、生产制造等过程中,有无任何危及产品安全的事件发生
    的头像 发表于 01-24 16:21 494次阅读

    实验室温湿度要求及其控制措施

    1.实验室环境温湿度控制范围识别各项工作对环境温湿度的要求主要识别仪器的需要、试剂的需要、实验程序的需要,以及实验室员工的人性化考虑(人体在
    的头像 发表于 01-24 08:43 1668次阅读
    <b class='flag-5'>实验室温湿度</b>要求及其控制措施

    【ELF 1开发板试用】板载资源测试4:体验温湿度传感器

    飞凌嵌入式ELF1开发板(以下简称为“开发板”)将温湿度传感器器AHT20集成在了底板上,此次依旧做最基础的测试,以下是测试过程记录。一、实验名称ELF 1开发板板载资源测试2:体验温湿度传感器二
    发表于 12-18 11:09

    温湿度变送器概述和技术参数

    温湿度变送器是一种将温度变量和湿度变量转换为可传送的标准化输出信号的仪表,主要由温度传感器、湿度传感器、测量电路、信号转换电路等组成,有些变送器增加了显示功能和通讯功能。嘉可仪表JK系
    的头像 发表于 11-08 16:31 4807次阅读