<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                * 導師視頻講解:[**去聽課**](https://www.bilibili.com/video/BV1k34y1D7Vz?p=18) >[success] **技術支持說明:** >**1**.一般以自主學習為主 > **2**.可到官方問答社區中提問:[**去提問**](https://bbs.csdn.net/forums/zigbee) > **3**.工程師**會盡快**解答社區問題,但他們是一線開發,【**難以保證**】解答時效,解答辛苦,感謝理解! <br/> 本節課將講解如何基于CC2530來使用OLED顯示屏來顯示字符和圖片。 <br/> ## **OLED簡介** OLED的全稱是OrganicLight-Emitting Diode(有機發光二極管),具有自發光、廣視角、幾乎無窮高的對比度、較低耗電和反應速度快等優點。開發套件中的0.96英寸OLED屏幕的實物圖如圖所示,其分辨率是64×128像素,即縱向有64個像素點、橫向有128個像素點。 ![](https://img.kancloud.cn/be/a4/bea4eb74c685fc43d3dfcfbfbbc284db_404x360.png =300x) <br/> ## **SPI通信協議簡介** SPI的全稱是Serial Peripheral Interface(串行外設接口),是一種具有速度快、全雙工和同步通信特點的通信總線。配套的OLED顯示屏便是使用SPI通信協議。 <br/> ## **字庫與圖庫** 為了使OLED屏幕能夠正確地顯示各種字符或圖片,還需要先準備好一套字庫和圖庫,例如標準ASCII字庫、漢字字庫和自主制作的圖庫等。 <br/> ## **OLED 驅動 API** 為驅動OLED屏幕,筆者設計了相應驅動API供讀者學習和使用。 ### OLED的驅動API可分為兩個層次,分別是**上層的OLED顯示API**和**下層的SPI驅動API**,驅動API還需要字庫和圖庫文件配合工作。這3者在本實驗代碼中的如圖所示位置。 ![](https://img.kancloud.cn/53/95/53958d1088644a498022919e00119a58_464x324.png =300x) <br/> **OLED顯示API簡介** 在配置好顯示屏引腳和字庫/圖庫文件后,調用OLED顯示API即可在屏幕上顯示指定的內容。打開OLED122864文件夾中的hal_oled12864.h文件,可以找到OLED顯示API的定義代碼: ``` //2. 51單片機入門/6. 顯示器實驗/Workspace/code/HW_LCD/HAL_OLED/hal_oled12864.h /** * @fn halOLED12864Init * * @brief 初始化OLED12864顯示器,在使用屏幕前必須先調用 */ void halOLED12864Init(void); /** * @fn halOLED12864ClearScreen * * @brief 清除屏幕上顯示內容 */ void halOLED12864ClearScreen(void); /** * @fn halOLED12864Show * * @brief 在屏幕上顯示字符串,支持的字符格式:1. 8×16 ASCII碼;2. 16×16 漢字 * * @param line - 參數值范圍:0 ~ 3 * @param column - 參數值范圍:0 ~ 127 * @param str - 待顯示的字符串 * * @warning 16×16漢字 的字庫需要先在此文件中定義FONT_TABLE_CHINESE_16×16 */ void halOLED12864ShowX16(unsigned char line, unsigned char column, const unsigned char *str); /** * @fn halOLED12864ShowPicture * * @brief 在屏幕上顯示圖片 * * @param x - 指定在橫向從左邊數起第x個像素開始顯示圖像,參數值范圍:0 ~ 127 * @param y - 指定在縱向從上邊數起的第y個像素開始顯示圖像,參數值范圍:0 ~ 64 * @param picWidth - 圖片的寬度,參數值范圍:1~128 * @param picHeight - 圖片的高度,參數值范圍:1~64 * @param pic - 待顯示的圖片 */ void halOLED12864ShowPicture(unsigned char x, unsigned char y, unsigned char picWidth, unsigned char picHeight, const unsigned char *pic); ``` ### **halOLED12864ShowX16 使用詳解** OLED12864顯示屏的分辨率為64x128像素,可以把其理解為**64行和128列**的二維表格。halOLED12864ShowX16函數支持顯示8×16的標準ASCII字符和16×16的漢字,其中的8×16是指占據屏幕8行、16列的字體,16×16是指占據屏幕16行和16列的字體。因此可以理解為halOLED12864ShowX16函數支持在屏幕中顯示4行ASCII字符或漢字,于是參數line的取值范圍便是0~3,但是參數column仍是使用像素點來表示在橫向第幾個像素的位置開始顯示字符,因此其取值范圍為0~127。 <br/> **顯示屏引腳配置** 在調用上述顯示API前,需要先進行顯示屏引腳配置,即將顯示屏的引腳與CC2530的GPIO配置上。配套的0.96英寸OLED顯示屏包含如下7個引腳: (1)GND - 地線 (2)VCC - 電源(2.8~5.5v) (3)SCL(D0) - SPI時鐘 (4)SDA(D1) - SPI數據 (5)CS - SPI片選 (6)RES - 屏幕復位引腳 (7)DC - 數據或命令選擇 ### 打開hal\_lcd\_spi.h文件,可以看到如下引腳配置代碼。 ``` //2.51單片機入門/6.顯示器實驗/Workspace/code/HW_LCD/HAL_LCD_SPI/hal_lcd_spi.h #ifdef HAL_LCD_SPI_SW /* SCL -> CC2530 P1_5 引腳*/ #define HAL_LCD_SPI_SCK_PORT 1 #define HAL_LCD_SPI_SCK_PIN 5 /* SDA -> CC2530 P1_6 引腳*/ #define HAL_LCD_SPI_SDA_PORT 1 #define HAL_LCD_SPI_SDA_PIN 6 #endif /* CS -> CC2530 P2_0 引腳*/ #define HAL_LCD_SPI_CS_PORT 2 #define HAL_LCD_SPI_CS_PIN 0 /* DC -> CC2530 P1_4 引腳*/ #define HAL_LCD_SPI_DC_PORT 1 #define HAL_LCD_SPI_DC_PIN 4 /* RES -> CC2530 P1_0 引腳*/ #define HAL_LCD_SPI_RST_PORT 1 #define HAL_LCD_SPI_RST_PIN 0 ``` 上述代碼完成了5個引腳的配置,其中的VCC和GND引腳不用配置。如果需要修改引腳配置,那么直接修改上述代碼右邊的數字即可。 <br/> **配置字庫** 在配置好引腳后,還需配置字庫和圖庫,其中字庫包括兩種,分別是8×16標準ASCII字庫、16×16中文字庫,字庫文件在本實驗代碼如圖所示位置。 ![](https://img.kancloud.cn/de/10/de10a7d8b864024d4fbaab8482bf0d8a_692x836.png =200x) ### 在本課程配套的軟件工具中,可以找到“字模軟件2.2.zip”這個軟件,它就是用來生成字庫的。運行字模軟件,如圖所示。 ![](https://img.kancloud.cn/d5/1d/d51d150e3a3ce0b95644bbe60197786f_804x612.png =500x) >[warning] 如您還沒有下載本課程配套的軟件工具,可以前往下載頁下載:[前往](2316129) ### 8×16標準ASCII字庫取模取模步驟如下: (1)單擊“參數設置”→“其他選項”,依次選擇“縱向取模”、“字節倒序”和“保留”,如圖所示。 ![](https://img.kancloud.cn/6a/67/6a671c9ba08f032e3bb8e47e3ed7919c_566x318.png =400x) 不同屏幕顯示對字庫的要求有所不同,配套的OLED顯示屏要求“縱向取模”和“字節倒序”。 ### (2)在文字輸入區輸入想要取模的文字,輸入后按一下Ctrl+Enter,如圖所示。 ![](https://img.kancloud.cn/75/25/7525452bf98e24c3ca184fe7db56dc6a_778x612.png =600x) ### (3)單擊“取模方式”→“C51 格式”,選擇“點陣生成區”,即可看到成功生成的字模,如圖所示。 ![](https://img.kancloud.cn/d3/44/d344727a8fe44e94c29625d4aba1ed53_830x516.png =600x) ### 就這樣,8×16字體對應的字庫做好了。16×16漢字的取模方式與8×16字體基本一致,只需要依照相同的方式并且在輸入區輸入漢字即可。 <br/> **配置圖庫** 與自字體取模類似地,在基本操作處導入圖片,然后參照字體取模流程操作即可完成圖片的取模,如圖所示。 ![](https://img.kancloud.cn/8c/ce/8cce023ab24acc4af5e4389feac63258_386x588.png =300x) <br/> ## **使用OLED顯示API** 在配置好顯示屏引腳和字庫文件后,調用OLED顯示API即可在屏幕上顯示內容。打開配套的實驗代碼,打開OLED12864文件夾中的main.c,可以看到使用OLED顯示API的示例代碼: ``` //2. 51單片機入門/6. 顯示器實驗/Workspace/code/OLED12864/main.c void main(void) { setSystemClk32MHZ();//把系統頻率設置為32MHz halOLED12864Init();//初始化 while(1) { /* Test1 - 顯示 8×16 的字符 */ halOLED12864ShowX16(0, 0, "0123456789");//在第1行顯示 halOLED12864ShowX16(1, 0, "abcdefghiABCDE");//在第2行顯示 halOLED12864ShowX16(2, 0, "{}[]()!@#$%");//在第3行顯示 halOLED12864ShowX16(3, 0, "==========>");//在第3行顯示 delayMs(SYSCLK_32MHZ, 4000);//延遲 halOLED12864ClearScreen();//清空 /* Test2 - 顯示 8×16 字符 和 16×16 漢字 */ halOLED12864ShowX16(0, 0, "今天氣溫:"); halOLED12864ShowX16(1, 30, "溫度:22 ℃"); halOLED12864ShowX16(2, 30, "濕度:30 %"); /* 注意:對于漢字,必須先取字模后存放到漢字字庫文件font_chinese_v_16x16.h中*/ delayMs(SYSCLK_32MHZ, 4000);//延遲 halOLED12864ClearScreen();//清空 /* Test3 - 在坐標(30像素, 30像素)處顯示分辨率為 32x32 像素的圖片*/ halOLED12864ShowPicture(30, 30, 32, 32, Picture_32x32_AppleIco); /*注意:對于圖片,系需要先取模后存放在圖庫文件font_v_picture.h中*/ delayMs(SYSCLK_32MHZ, 4000);//延遲 halOLED12864ClearScreen();//清空 /* Test4 - 全屏顯示 128x64 圖片,即在坐標(30像素, 30像素)處顯示一張分辨率為128x64像素的圖片 */ halOLED12864ShowPicture(0, 0, 128, 64, Picture_128x128_SuccessPic); delayMs(SYSCLK_32MHZ, 4000);//延遲 halOLED12864ClearScreen();//清空 } } ``` 在實際的開發過程中,開發者一般只要套用上述代碼即可使用OLED屏幕,非常方便。 <br/> ## **SPI 驅動 API 的設計原理** >[warning] SPI 驅動 API 的設計原理較為復雜,讀者簡單了解其原理即可。 上文講到,筆者設計的OLED屏幕的驅動API可分為兩個層次,分別是**上層的OLED顯示API**和**下層的SPI驅動API**。這里簡單地講解一下本SPI驅動API的設計原理。 <br/> **設計思想** 筆者把SPI驅動API分為兩個部分,分別是**通用SPI驅動API**和**專用SPI驅動API**。 (1)**通用SPI驅動API**適用于使用SPI通信的多種設備,圖中的SPI_Driver文件夾存放的便是此部分API。 (2)**專用SPI驅動API**在**通用SPI驅動API**的基礎上,專門去適配特定的設備,例如配套的這個OLED顯示屏。圖中的hal\_lcd\_spi.h和hal\_lcd\_spi.c便是此部分API ![](https://img.kancloud.cn/32/3a/323afb12d7e13f13ad507aca44943e2d_344x282.png =250x) 這樣做的好處還是比較明顯的,通用SPI驅動API可以在各種SPI設備中使用,只需要為這些設備增加對應的適配代碼即可。 <br/> **硬件和軟件SPI模式的支持** 在通用的SPI驅動API中,支持硬件SPI和軟件SPI模式。硬件模式SPI是指利用利用硬件處理單元實現SPI協議,軟件SPI模式是指通過編寫程序代碼的方式實現SPI。如圖所示,hw\_spi.h/c是基于硬件實現的SPI驅動API,sw\_spi.h/c是軟件模擬實現的SPI驅動API,如圖所示。 ![](https://img.kancloud.cn/7e/02/7e025117a07dcc7a01bfb19a0a1e7b20_322x160.png =300x) ### 可以在適配程序hal\_lcd\_spi.h和hal\_lcd\_spi.c中通過配置的方式來選擇使用哪種方式,如圖所示。 ![](https://img.kancloud.cn/ac/ad/acadd71f22932380890a28b5922d83ee_832x182.png =600x) <br/> ## **調試仿真** 可以運行本實驗代碼以觀察運行結果,操作步驟如下: (1)把OLED屏幕插入到標準板或者Mini板中,如圖所示。 ![](https://img.kancloud.cn/93/15/93156ba0c66abaa69a32fd977ea3fd56_3100x2107.png =350x) ![](https://img.kancloud.cn/16/bf/16bf3fe45af632e48e5f44b89e0e2598_3710x2976.png =300x) ### (2)由于本實驗需要用到SPI通信,因此如果使用ZigBee標準板測試,需要把撥碼開關的第8、9和10位分別打到CLK、SDI和SDO端,如圖所示。 ![](https://img.kancloud.cn/f9/7b/f97ba2493dbafcbdaf91167bab938cbc_652x1064.png =100x) ### (3)編譯鏈接本實驗代碼后,把程序燒錄到配套的ZigBee開發板中,即可看到屏幕循環地顯示相應的內容。 <br/> <br/> ## **項目定制** * 如需項目定制開發,可掃碼添加項目經理好友(注明“**項目定制**”) * 定制范圍:**NB-IoT**、**CATn(4G)**、**WiFi**、**ZigBee**、**BLE Mesh**以及**STM32**、**嵌入式Linux**等IoT技術方案 * 善學坊官網:[www.sxf-iot.com](https://www.sxf-iot.com/) ![](https://img.kancloud.cn/ca/73/ca739f92cab220a3059378642e3bd502_430x430.png =200x) * 非項目定制**勿擾**,此處**非**技術支持
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看