一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

PIC32MX470的溫濕度計(jì):調(diào)SPI和OLED顯示實(shí)驗(yàn)

算法&編程學(xué)院 ? 來(lái)源:網(wǎng)絡(luò)整理 ? 2018-02-01 03:55 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

溫濕度可以正常讀取了,接下來(lái)就是調(diào)SPI和OLED顯示,嘗試將數(shù)據(jù)通過(guò)OLED屏顯示出來(lái)。

查看OLED屏的資料,支持多種連接方式,默認(rèn)的是4線SPI,但是沒(méi)有MISO,也就是說(shuō)OLED屏沒(méi)有輸出信號(hào),不可讀。那就在Information sheet上找SPI的管腳,老原因接著用用X32接口上的SPI2。為了接線方便些,用鄰近的管腳作RST和DC信號(hào)

224729ldf7wuwfufifiwde

由于X32上只有一個(gè)3.3V,溫濕度傳感器最高耐壓5.5V,就把它接到5V上吧,按如下方式連接OLED屏和溫濕度傳感器

2

接下來(lái)依然是通過(guò)MHC來(lái)使能SPI驅(qū)動(dòng)

1. 打開(kāi)MHC的Options選項(xiàng)卡,找到SPI對(duì)應(yīng)的driver選項(xiàng)打開(kāi)并做相應(yīng)的配置,我的配置如下

3

4

2. 打開(kāi)MHC的Pin Settings,將RG6、RG7、RG8、RG9設(shè)置為SPI管腳,RB8設(shè)置為DC,RD7設(shè)置為RST

5

6

3. 然后生成代碼,主要包含以下幾個(gè)源文件

7

4. 分析SPI驅(qū)動(dòng)代碼后可知在SYS_Initialize中已經(jīng)根據(jù)用戶(hù)的配置調(diào)用了SPI相關(guān)的初始化函數(shù),所以使用時(shí)只需要在代碼里直接調(diào)用drv_spi_mapping.c中的其他API就可以了。但是SPI的速率較高,我設(shè)置的是5M,如果使用中斷模式,處理不好中斷頻繁產(chǎn)生的話,不知道CPU是不是吃得消;以前在SAM4N上用過(guò)輪詢(xún)方式的SPI,索性將代碼拿來(lái)直接用,等到調(diào)通了之后再改成中斷甚至DMA看能不能處理好。先不用MHC產(chǎn)生的代碼了,相當(dāng)于只利用了它的初始化和訪問(wèn)硬件的PLIB庫(kù)。主要的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,把原先讀溫濕度操作之后的串口打印,改成顯示數(shù)據(jù),每秒讀一次并通過(guò)OLED屏顯示出來(lái)

8

調(diào)試還算順利,OLED顯示如下

9

雖然顯示的終端由串口改成了OLED屏,但換個(gè)馬甲依然無(wú)法掩飾它的簡(jiǎn)陋。下一步就是移植μGUI裝一回大尾巴狼,哈哈哈

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • PIC32MX470
    +關(guān)注

    關(guān)注

    0

    文章

    5

    瀏覽量

    1895
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    溫濕度變送器功能有哪些?一文詳細(xì)解析

    功能就是精準(zhǔn)測(cè)量環(huán)境中的溫度和濕度。它采用高精度的傳感器,能夠快速、準(zhǔn)確地感知環(huán)境溫濕度的變化,并將這些數(shù)據(jù)轉(zhuǎn)化為可識(shí)別的電信號(hào)。無(wú)論是在實(shí)驗(yàn)室、倉(cāng)庫(kù),還是在生產(chǎn)車(chē)間,都能為用戶(hù)提供可靠的溫濕
    發(fā)表于 06-03 10:56

    智能倉(cāng)儲(chǔ):溫濕度監(jiān)控方案應(yīng)用

    隨著倉(cāng)儲(chǔ)環(huán)境要求提高,溫濕度監(jiān)控對(duì)保障貨物品質(zhì)至關(guān)重要。本文介紹一個(gè)工廠倉(cāng)庫(kù)溫濕度監(jiān)控方案,利用溫濕度變送器、LoRa技術(shù)和智能監(jiān)測(cè)平臺(tái),為倉(cāng)庫(kù)業(yè)主提供高效、可靠的監(jiān)測(cè)解決方案。倉(cāng)庫(kù)溫濕度
    的頭像 發(fā)表于 05-29 11:35 ?275次閱讀
    智能倉(cāng)儲(chǔ):<b class='flag-5'>溫濕度</b>監(jiān)控方案應(yīng)用

    用樹(shù)莓派RP2350 DIY 桌面動(dòng)態(tài)溫濕度計(jì)

    桌面動(dòng)態(tài)溫濕度計(jì)本文介紹了DFrobotBeetleRP2350開(kāi)發(fā)板結(jié)合DHT11模塊、鋰電池模塊、隨機(jī)眨眼動(dòng)畫(huà),實(shí)現(xiàn)OLED顯示的桌面動(dòng)態(tài)溫濕度計(jì)的項(xiàng)目設(shè)計(jì)。一、項(xiàng)目介紹本項(xiàng)目包括
    的頭像 發(fā)表于 05-27 08:05 ?197次閱讀
    用樹(shù)莓派RP2350 DIY 桌面動(dòng)態(tài)<b class='flag-5'>溫濕度計(jì)</b>

    樹(shù)莓派RP2350 - 桌面動(dòng)態(tài)溫濕度計(jì)

    樹(shù)莓派RP2350 - 桌面動(dòng)態(tài)溫濕度計(jì) 本文介紹了 DFRobot Beetle RP2350 開(kāi)發(fā)板結(jié)合 DHT11 模塊、鋰電池模塊、隨機(jī)眨眼動(dòng)畫(huà),實(shí)現(xiàn) OLED 顯示的桌面動(dòng)態(tài)溫濕度計(jì)
    發(fā)表于 05-26 02:02

    Fluke 961A溫濕度記錄儀在微電子實(shí)驗(yàn)室中的應(yīng)用

    微電子實(shí)驗(yàn)室是致力于各類(lèi)半導(dǎo)體芯片研究的重要科研機(jī)構(gòu)。對(duì)于高端芯片的研發(fā)而言,實(shí)驗(yàn)室內(nèi)部的環(huán)境溫濕度條件至關(guān)重要,因此該實(shí)驗(yàn)室對(duì)環(huán)境溫濕度
    的頭像 發(fā)表于 02-26 15:16 ?544次閱讀

    工廠溫濕度監(jiān)控系統(tǒng)

    與智能調(diào)控,旨在為工業(yè)領(lǐng)域提供一套全面、高效的溫濕度管理解決方案。 工廠溫濕度監(jiān)控系統(tǒng),結(jié)合工業(yè)生產(chǎn)環(huán)境的特殊性,在生產(chǎn)車(chē)間、倉(cāng)庫(kù)、實(shí)驗(yàn)室等關(guān)鍵區(qū)域部署傳感器,實(shí)時(shí)采集工廠各區(qū)域的溫濕度
    的頭像 發(fā)表于 02-25 17:11 ?479次閱讀

    博物館溫濕度監(jiān)控系統(tǒng)

    ,若任其自然變化,則可能對(duì)文物造成意想不到的損害。為此,博物館溫濕度監(jiān)控系統(tǒng)應(yīng)運(yùn)而生,其具備多種功能,以確保文物環(huán)境的穩(wěn)定與安全。 博物館溫濕度監(jiān)控系統(tǒng),采集各庫(kù)房的溫濕度數(shù)據(jù),通過(guò)管理云平臺(tái)實(shí)時(shí)
    的頭像 發(fā)表于 12-20 16:42 ?881次閱讀

    XKCON祥控倉(cāng)庫(kù)存儲(chǔ)環(huán)境溫濕度在線監(jiān)測(cè)系統(tǒng)能夠取代人工巡檢,實(shí)現(xiàn)遠(yuǎn)程倉(cāng)庫(kù)存儲(chǔ)環(huán)境溫濕度變化的實(shí)時(shí)

    的XKCON祥控倉(cāng)庫(kù)存儲(chǔ)環(huán)境溫濕度在線監(jiān)測(cè)系統(tǒng)通過(guò)安裝固定式環(huán)境溫濕度檢測(cè)儀對(duì)倉(cāng)儲(chǔ)環(huán)境溫濕度實(shí)時(shí)數(shù)據(jù)進(jìn)行采集,并通過(guò)主機(jī)現(xiàn)場(chǎng)顯示并發(fā)送至遠(yuǎn)程監(jiān)管軟件,能夠取代人工巡檢,實(shí)現(xiàn)遠(yuǎn)程倉(cāng)庫(kù)存儲(chǔ)
    的頭像 發(fā)表于 11-20 11:20 ?554次閱讀
    XKCON祥控倉(cāng)庫(kù)存儲(chǔ)環(huán)境<b class='flag-5'>溫濕度</b>在線監(jiān)測(cè)系統(tǒng)能夠取代人工巡檢,實(shí)現(xiàn)遠(yuǎn)程倉(cāng)庫(kù)存儲(chǔ)環(huán)境<b class='flag-5'>溫濕度</b>變化的實(shí)時(shí)

    LORA無(wú)線溫濕度監(jiān)測(cè)系統(tǒng)

    LORA無(wú)線溫濕度監(jiān)測(cè)系統(tǒng),作為現(xiàn)代環(huán)境監(jiān)測(cè)技術(shù)的重要組成部分,正日益受到各行各業(yè)的廣泛關(guān)注和應(yīng)用。 LORA無(wú)線溫濕度監(jiān)測(cè)系統(tǒng),利用LORA無(wú)線通信技術(shù),對(duì)環(huán)境中溫度和濕度的實(shí)時(shí)監(jiān)測(cè)和數(shù)據(jù)傳輸,為
    的頭像 發(fā)表于 11-07 16:57 ?823次閱讀

    溫濕度控制器的功能和應(yīng)用

    溫濕度控制器在電阻柜中的應(yīng)用主要涉及以下幾個(gè)方面: 溫濕度控制器的功能 檢測(cè)與控制:溫濕度控制器可以同時(shí)檢測(cè)和控制環(huán)境中的溫度和濕度。它通常由傳感器、控制器和加熱器三部分組成。傳感器負(fù)
    的頭像 發(fā)表于 11-07 15:08 ?794次閱讀

    冷庫(kù)環(huán)境溫濕度監(jiān)控系統(tǒng)

    預(yù)防因溫濕度波動(dòng)導(dǎo)致的貨物損失,確保產(chǎn)品從生產(chǎn)到消費(fèi)終端的全鏈條品質(zhì)穩(wěn)定。 冷庫(kù)環(huán)境溫濕度監(jiān)控系統(tǒng),集數(shù)據(jù)采集、傳輸、處理、顯示、報(bào)警于一體的智能化管理解決方案。通過(guò)實(shí)時(shí)監(jiān)測(cè)、精準(zhǔn)控制、預(yù)警報(bào)警、數(shù)據(jù)記錄與分
    的頭像 發(fā)表于 08-21 16:07 ?759次閱讀

    溫濕度傳感器怎么調(diào)試

    溫濕度傳感器是一種廣泛應(yīng)用于工業(yè)、農(nóng)業(yè)、氣象、科研等領(lǐng)域的傳感器,用于測(cè)量環(huán)境的溫度和濕度。在實(shí)際應(yīng)用中,溫濕度傳感器的調(diào)試是非常重要的,它直接影響到測(cè)量結(jié)果的準(zhǔn)確性和穩(wěn)定性。 一、溫濕度
    的頭像 發(fā)表于 08-19 15:04 ?2351次閱讀

    Arduino Nano 和 NodeMCU ESP8266 讀取 DHT11 環(huán)境溫濕度數(shù)據(jù)及 OLED顯示

    Arduino Nano 和 NodeMCU ESP8266 讀取 DHT11 環(huán)境溫濕度數(shù)據(jù)及 OLED顯示
    的頭像 發(fā)表于 08-13 18:04 ?2075次閱讀
    Arduino Nano 和 NodeMCU ESP8266 讀取 DHT11 環(huán)境<b class='flag-5'>溫濕度</b>數(shù)據(jù)及 <b class='flag-5'>OLED</b><b class='flag-5'>顯示</b>

    溫濕度監(jiān)測(cè)系統(tǒng)應(yīng)用

    在現(xiàn)代化工業(yè)生產(chǎn)、倉(cāng)儲(chǔ)管理、農(nóng)業(yè)種植以及智能家居等領(lǐng)域,溫濕度監(jiān)測(cè)已成為不可或缺的一環(huán)。溫濕度作為環(huán)境控制的關(guān)鍵因素,直接影響著產(chǎn)品質(zhì)量、存儲(chǔ)安全、作物生長(zhǎng)效率以及居住舒適度。因此,一套高效、精準(zhǔn)
    的頭像 發(fā)表于 07-26 16:15 ?907次閱讀

    藥品倉(cāng)庫(kù)溫濕度監(jiān)控系統(tǒng)

    藥品倉(cāng)庫(kù)作為藥品儲(chǔ)存的主要場(chǎng)所,需要特定的溫度和濕度條件,其環(huán)境條件的控制直接影響到藥品的質(zhì)量和療效,以保持其穩(wěn)定性和有效性。因此,建立一個(gè)高效、可靠的藥品倉(cāng)庫(kù)溫濕度監(jiān)控系統(tǒng),對(duì)于確保藥品的安全儲(chǔ)存
    的頭像 發(fā)表于 07-26 10:12 ?662次閱讀