精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

    瀏覽量

    1803
收藏 人收藏

    評論

    相關推薦

    LORA無線溫濕度監測系統

    LORA無線溫濕度監測系統,作為現代環境監測技術的重要組成部分,正日益受到各行各業的廣泛關注和應用。 LORA無線溫濕度監測系統,利用LORA無線通信技術,對環境中溫度和濕度的實時監測和數據傳輸,為
    的頭像 發表于 11-07 16:57 ?214次閱讀

    溫濕度控制器的功能和應用

    溫濕度控制器在電阻柜中的應用主要涉及以下幾個方面: 溫濕度控制器的功能 檢測與控制:溫濕度控制器可以同時檢測和控制環境中的溫度和濕度。它通常由傳感器、控制器和加熱器三部分組成。傳感器負
    的頭像 發表于 11-07 15:08 ?147次閱讀

    冷庫環境溫濕度監控系統

    預防因溫濕度波動導致的貨物損失,確保產品從生產到消費終端的全鏈條品質穩定。 冷庫環境溫濕度監控系統,集數據采集、傳輸、處理、顯示、報警于一體的智能化管理解決方案。通過實時監測、精準控制、預警報警、數據記錄與分
    的頭像 發表于 08-21 16:07 ?275次閱讀

    Arduino Nano 和 NodeMCU ESP8266 讀取 DHT11 環境溫濕度數據及 OLED顯示

    Arduino Nano 和 NodeMCU ESP8266 讀取 DHT11 環境溫濕度數據及 OLED顯示
    的頭像 發表于 08-13 18:04 ?984次閱讀
    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 ?357次閱讀

    庫房溫濕度自動監測系統

    倉儲、庫房在管理上,環境控制都是重中之重。庫房溫濕度自動監測系統作為一種更為便捷的解決方案,已經得到廣泛的應用。 庫房溫濕度自動監測系統通過集成傳感器、數據采集器、傳輸設備和管理平臺等硬件設備,實現
    的頭像 發表于 07-09 18:00 ?657次閱讀

    糧倉溫濕度監測解決方案

    溫濕度是影響糧食儲存品質的重要因素。過高的溫度會加速糧食的呼吸作用,導致水分散失和品質下降。因此,糧倉的溫濕度管理,成為了確保糧食儲存安全和質量穩定的關鍵因素。方便及時發現糧倉的發熱點,及時減少糧食
    的頭像 發表于 07-04 16:37 ?321次閱讀

    想要準確地測量環境溫濕度溫濕度傳感器是關鍵!

    ? 溫濕度是生產生活中最重要的環境指標之一,不僅人需要在適宜的溫濕度條件下保持良好的精神狀態和敏捷的思維,食品、藥品、各種儀器設備等都對環境溫濕度有特殊的要求。基于對環境溫濕度的要求,
    的頭像 發表于 07-04 08:48 ?497次閱讀

    無線溫濕度監控系統

    無線溫濕度監控系統,作為現代環境監測技術的杰出代表,已經廣泛應用于各個行業和領域。利用無線通信技術,實現對環境溫濕度的實時、遠程監控,從而保障了各種設備和物品的安全運行和保存。 無線溫濕度控制系統
    的頭像 發表于 05-30 16:43 ?723次閱讀

    小白測功耗之藍牙溫濕度傳感器

    小小的溫濕度計,是人們日常生活中的智能小幫手,也是極為典型的電池供電類低功耗產品。通常采用紐扣電池供電,可方便地擺放或粘貼于各種應用場景。市面上常見的溫濕度計,功耗到底有多低?今天,我們就用即將
    的頭像 發表于 04-16 08:04 ?1109次閱讀
    小白測功耗之藍牙<b class='flag-5'>溫濕度</b>傳感器

    溫濕度監測物聯網系統解決方案

    無論是在我們的日常生活中,還是在工業生產、科研實驗等領域,溫濕度都是一個不可或缺的因素。許多工業產品,如食品、藥品、電子產品等,都需要在特定的溫濕度環境下生產、儲存和運輸。一旦溫濕度
    的頭像 發表于 02-28 16:02 ?839次閱讀
    <b class='flag-5'>溫濕度</b>監測物聯網系統解決方案

    溫濕度傳感器有哪些應用場景?

    溫濕度傳感器在眾多領域,特別是在實時記錄溫濕度變化的工作中最為廣泛。溫濕度傳感器可以根據所記錄的內容,對其進行科學有效的管理、分析和歸納。下面我們就溫濕度傳感器在不同場景中的應用做下介
    的頭像 發表于 02-19 16:28 ?1248次閱讀
    <b class='flag-5'>溫濕度</b>傳感器有哪些應用場景?

    溫濕度傳感器工作原理 溫濕度傳感器的接線方法

    溫濕度傳感器是一種用于測量環境溫度和相對濕度的裝置。它通常用于工業、農業、氣象、室內空調等領域。本文將詳細介紹溫濕度傳感器的工作原理和接線方法。 一、溫濕度傳感器的工作原理
    的頭像 發表于 02-14 18:00 ?8952次閱讀

    溫濕度監測系統解決方案應用場景

    隨著生活水平質量不斷提高,因溫度引發的各行業越來越重視產品生產、物品設備、存儲等溫濕度管理環境。科學應用溫濕度監測系統,確保在儲運過程中或實驗、生產制造等過程中,有無任何危及產品安全的事件發生
    的頭像 發表于 01-24 16:21 ?552次閱讀

    實驗室溫濕度要求及其控制措施

    1.實驗室環境溫濕度控制范圍識別各項工作對環境溫濕度的要求主要識別儀器的需要、試劑的需要、實驗程序的需要,以及實驗室員工的人性化考慮(人體在
    的頭像 發表于 01-24 08:43 ?1823次閱讀
    <b class='flag-5'>實驗室溫濕度</b>要求及其控制措施