国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    冷庫溫濕度監控系統物聯網解決方案

    冷庫作為生鮮食品、醫藥試劑、化工原料等物資的核心存儲載體,溫濕度的穩定性直接決定物資品質與安全。傳統冷庫溫濕度管理存在諸多痛點:人工巡檢效率低、誤差大,難以實現 24 小時全覆蓋監測;溫濕度異常后
    的頭像 發表于 01-19 16:57 ?474次閱讀

    科研場景定制化:POE 供電溫濕度監控系統個性化設計方案

    科研實驗室利用以太網POE供電溫濕度傳感器進行溫濕度監控系統的方案設計需要考慮哪些因素? 結合科研實驗室的場景特殊性、POE 技術特性及溫濕度
    的頭像 發表于 12-18 14:48 ?1012次閱讀

    科研實驗室以太網POE供電溫濕度監控系統方案

    科研實驗室以太網POE溫濕度監控系統設計方案 一、方案設計背景與目標 1. 設計背景 科研實驗室(如生物培養室、化學試劑存儲室、電子元器件測試實驗室等)對
    的頭像 發表于 12-18 14:35 ?1366次閱讀
    科研<b class='flag-5'>實驗</b>室以太網POE供電<b class='flag-5'>溫濕度</b>監控系統方案

    應用于智能門鎖的溫濕度傳感器解決方案

    智能傳感器已廣泛應用于我們生活的方方面面,從智能開關(86盒)、電子溫濕度計到智能窗簾盒、煙感器等,無處不在。其中,溫濕度傳感器芯片憑借其高精度、低功耗和小體積的優勢,成為環境監測的核心硬件。溫濕度傳感器不僅能精準采集室內數據,
    的頭像 發表于 11-28 15:03 ?337次閱讀

    溫濕度傳感器HTU31D在溫濕度控器中的應用優勢

    溫濕度控制器是一種用于監測和調節環境溫度與濕度的設備,廣泛應用于農業、倉儲、工業生產、家庭等多個領域。其主要功能是維持特定環境條件,以確保產品質量和舒適的居住環境。 溫濕度控制器的工作過程是傳感器
    的頭像 發表于 11-06 14:38 ?331次閱讀
    <b class='flag-5'>溫濕度</b>傳感器HTU31D在<b class='flag-5'>溫濕度</b>控器中的應用優勢

    【HZ-T536開發板免費體驗】4、使用藍牙模塊讀取小米溫濕度計的數據

    雖然設備上沒有藍牙模塊,我們依舊可以通過USB的星閃模組實現藍牙ble相關的功能,例如讀取小米溫濕度計的數據。 首先需要加載對應的模塊,這些模塊在前面一個章節已經編譯好了。 insmod
    發表于 08-25 22:16

    【上海晶珩睿莓1開發板試用體驗】Home Assistant 物聯網溫濕度計

    【上海晶珩睿莓1開發板試用體驗】Home Assistant 物聯網溫濕度計 本文介紹了上海晶珩睿莓 1 開發板通過 AHT10 傳感器實現環境溫濕度采集,結合 WiFi 和 MQTT 協議實現數據
    發表于 08-18 13:55

    功耗創新低!涂鴉產品級Zigbee 3.0溫濕度計開發包,開箱即用、完全開源

    溫濕度計作為智能家居環境感知的核心組件,通過實時檢測溫濕度信息,可主動聯動暖通、加濕器等設備,幫助提升居住舒適度、降低能源消耗。這類產品通常是由電池供電,對低功耗的要求較高。而Zigbee天然支持
    的頭像 發表于 07-31 19:13 ?837次閱讀
    功耗創新低!涂鴉產品級Zigbee 3.0<b class='flag-5'>溫濕度計</b>開發包,開箱即用、完全開源

    一款適用于粉塵、易結露等惡劣環境溫濕度監控中的溫濕度傳感芯片

    溫濕度監控系統在惡劣環境中通過傳感器實時監測溫濕度參數,當達到預設閾值時自動觸發預警或調節機制,確保環境狀態維持在安全范圍內。
    的頭像 發表于 07-09 09:41 ?690次閱讀
    一款適用于粉塵、易結露等惡劣環境<b class='flag-5'>溫濕度</b>監控中的<b class='flag-5'>溫濕度</b>傳感芯片

    常見的溫濕度傳感器類型?

    溫濕度傳感器是一種用于測量環境溫度和濕度的設備,廣泛應用于工業、農業、氣象等領域。以下是幾種常見的溫濕度傳感器類型及其優缺點: 電容式濕度傳感器 電容式
    發表于 06-24 09:24

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

    功能就是精準測量環境中的溫度和濕度。它采用高精度的傳感器,能夠快速、準確地感知環境溫濕度的變化,并將這些數據轉化為可識別的電信號。無論是在實驗室、倉庫,還是在生產車間,都能為用戶提供可靠的溫濕
    發表于 06-03 10:56

    智能倉儲:溫濕度監控方案應用

    隨著倉儲環境要求提高,溫濕度監控對保障貨物品質至關重要。本文介紹一個工廠倉庫溫濕度監控方案,利用溫濕度變送器、LoRa技術和智能監測平臺,為倉庫業主提供高效、可靠的監測解決方案。倉庫溫濕度
    的頭像 發表于 05-29 11:35 ?785次閱讀
    智能倉儲:<b class='flag-5'>溫濕度</b>監控方案應用

    用樹莓派RP2350 DIY 桌面動態溫濕度計

    桌面動態溫濕度計本文介紹了DFrobotBeetleRP2350開發板結合DHT11模塊、鋰電池模塊、隨機眨眼動畫,實現OLED顯示的桌面動態溫濕度計的項目設計。一、項目介紹本項目包括
    的頭像 發表于 05-27 08:05 ?914次閱讀
    用樹莓派RP2350 DIY 桌面動態<b class='flag-5'>溫濕度計</b>

    樹莓派RP2350 - 桌面動態溫濕度計

    樹莓派RP2350 - 桌面動態溫濕度計 本文介紹了 DFRobot Beetle RP2350 開發板結合 DHT11 模塊、鋰電池模塊、隨機眨眼動畫,實現 OLED 顯示的桌面動態溫濕度計
    發表于 05-26 02:02

    如何操作電子溫濕度記錄儀

    電子溫濕度記錄儀是一種常用的記錄儀產品類型,選用進口傳感器、進口高能鋰電池供電,采用低功耗技術設計,可以外接電源供電,體積小巧,整機功耗小,精度高。被廣泛用于工業、環保、衛生防疫、倉儲運輸、博物館等
    的頭像 發表于 03-25 10:39 ?1458次閱讀
    如何操作電子<b class='flag-5'>溫濕度</b>記錄儀