久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 9988|回復: 5
打印 上一主題 下一主題
收起左側

STC15系列單片機利用硬件SPI可以提高顯示速度一倍

[復制鏈接]
跳轉到指定樓層
樓主
ID:328014 發表于 2018-8-9 03:28 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
買了1塊SPI接口的OLED屏。
商家提供的51下的驅動代碼是軟件模擬SPI的方式實現的。
雖然速度上基本上可以達到應用的要求了,但是出于實驗的目的,周末研究了一下15系列硬件SPI,改寫了一下驅動,并且比較了利用軟硬兩種SPI之間的差距。發現利用硬件SPI至少可以提高顯示速度50%以上的效率。

看來以后在條件允許的情況下,多利用硬件SPI對程序的執行效率的提高是很有幫助的。

具體思路如下:
1.改寫驅動代碼
將往OLED屏寫入字節的函數改為硬件SPI方式寫入。
用_HARD_SPI_宏來切換軟硬SPI接口
  1.     #ifdef    _HARD_SPI_
  2.     void OLED_WR_Byte(u8 dat, u8 cmd)
  3.     {
  4.         if(cmd)
  5.             OLED_DC_Set();
  6.         else
  7.             OLED_DC_Clr();
  8.         SPDAT = dat;
  9.         while(!(SPSTAT&SPIF));
  10.         SPSTAT = SPIF | WCOL;
  11.         OLED_DC_Set();        
  12.     }
  13.     #else
  14.     void OLED_WR_Byte(u8 dat,u8 cmd)
  15.     {
  16.         u8 i;
  17.         if(cmd)
  18.             OLED_DC_Set();
  19.         else
  20.             OLED_DC_Clr();
  21.         OLED_CS_Clr();
  22.         for(i=0;i<8;i++)
  23.         {              
  24.             OLED_SCLK_Clr();
  25.             if(dat&0x80)
  26.             {
  27.                 OLED_SDIN_Set();
  28.             }
  29.             else
  30.             {
  31.                 OLED_SDIN_Clr();
  32.             }
  33.             OLED_SCLK_Set();
  34.             dat<<=1;  
  35.         }
  36.         OLED_CS_Set();
  37.         OLED_DC_Set();        
  38.     }
  39.     #endif
復制代碼
2.在main函數中對顯示函數調用10000次
在循環調用前清除計數器并打開定時中斷(定時器設定為1ms,晶振主頻為30M)
定時中斷負責計數。
10000次顯示結束后輸出定時中斷計數器的值。
以下是main.c
  1.     #include "STC15W4Kxxs4.h"
  2.     #include "__c_param__.h"
  3.     #include "display.h"
  4.     #include "resource.h"
  5.     unsigned long ulCount = 0;
  6.     void timer0_int (void) interrupt 1
  7.     {
  8.        ulCount++;
  9.     }
  10.     void Timer0Init(void)        //1毫秒@30.000MHz
  11.     {
  12.         AUXR |= 0x80;        //定時器時鐘1T模式
  13.         TMOD &= 0xF0;        //設置定時器模式
  14.         TL0 = 0xD0;        //設置定時初值
  15.         TH0 = 0x8A;        //設置定時初值
  16.         TF0 = 0;        //清除TF0標志
  17.         TR0 = 1;        //定時器0開始計時
  18.     }
  19.     void main()
  20.     {
  21.         int    i;
  22.         unsigned char    col,row;
  23.         
  24.         Timer0Init();
  25.         
  26.         initial_lcd();
  27.         
  28.         clear_screen();
  29.         display_graphic_Nx8M(1,1, dabai, 0, 128, 8);
  30.         ulCount = 0;
  31.         EA = 1;
  32.         ET0 = 1;                 //Timer0中斷允許
  33.         //顯示10000次 17*32大小的數字
  34.         for(i = 0; i < 10000; i++)
  35.         {
  36.             display_graphic_Nx8M((i%2)*FONT_LARGE_H+1,1, font17x32, i % FONT_LARGE_C, FONT_LARGE_W, FONT_LARGE_H);
  37.     //        display_graphic_Nx8M(1,1, dabai, 0, 128, 8);
  38.     //        display_graphic_Nx8M((i%8),1,font7x8, i % FONT_SMALL_C, FONT_SMALL_W, FONT_SMALL_H);
  39.         }
  40.         ET0 = 0;                 //Timer0中斷允許
  41.         EA = 0;
  42.         
  43.         clear_screen();
  44.         col = 1;
  45.         row = 4;
  46.         display_graphic_Nx8M(row,col, font11x24, (ulCount / 1000000) % 10, FONT_BIG_W, FONT_BIG_H);
  47.         col += FONT_BIG_W;
  48.         display_graphic_Nx8M(row,col, font11x24, (ulCount / 100000) % 10, FONT_BIG_W, FONT_BIG_H);
  49.         col += FONT_BIG_W;
  50.         display_graphic_Nx8M(row,col, font11x24, (ulCount / 10000) % 10, FONT_BIG_W, FONT_BIG_H);
  51.         col += FONT_BIG_W;
  52.         display_graphic_Nx8M(row,col, font11x24, (ulCount / 1000) % 10, FONT_BIG_W, FONT_BIG_H);
  53.         col += FONT_BIG_W;
  54.         display_graphic_Nx8M(row,col, font11x24, (ulCount / 100) % 10, FONT_BIG_W, FONT_BIG_H);
  55.         col += FONT_BIG_W;
  56.         display_graphic_Nx8M(row,col, font11x24, (ulCount / 10) % 10, FONT_BIG_W, FONT_BIG_H);
  57.         col += FONT_BIG_W;
  58.         display_graphic_Nx8M(row,col, font11x24, (ulCount) % 10, FONT_BIG_W, FONT_BIG_H);
  59.         
  60.         while(1);
  61.     }
復制代碼
最后結果:
顯示17x32大小數字時       硬件SPI:3605ms          軟件SPI:8030ms         提高:56.3%
顯示128x64大小的圖像     硬件SPI:22458ms        軟件SPI:51544ms       提高:56.4%
顯示7x8大小的數字           硬件SPI:597ms            軟件SPI:1156ms         提高:48.4%

對比測試的視頻


彈來彈去的時間顯示。



評分

參與人數 1黑幣 +10 收起 理由
NPC-1024 + 10 很給力!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:371423 發表于 2018-8-15 10:57 | 只看該作者
有機會我也要學習一下硬件控制器
回復

使用道具 舉報

板凳
ID:223707 發表于 2019-2-21 14:51 | 只看該作者
TFT_KMRTM24024: 2.4寸TFT觸摸屏,4線SPI,
刷屏6次,軟件SPI:7032ms, 硬件SPI:1920ms
差別很大
回復

使用道具 舉報

地板
ID:419072 發表于 2019-6-6 17:30 | 只看該作者
正在學習硬件spi,和cs5530通信程序。
回復

使用道具 舉報

5#
ID:292359 發表于 2019-12-2 11:52 | 只看該作者
最近無聊正在研究一塊OLED小屏
回復

使用道具 舉報

6#
ID:655943 發表于 2020-4-16 21:09 | 只看該作者
請教,帶字庫的TFT或OLCD有兩處片選,但共用其它三個腳,怎么設置??
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产中文一区二区三区 | 狠狠干美女 | 中文一区| 久久天堂网| 国产高清视频在线观看 | 日韩一区二区三区在线看 | 欧美a在线 | 午夜在线影院 | 毛片免费在线 | 啪啪免费网 | 日本视频免费观看 | 色偷偷噜噜噜亚洲男人 | 亚洲黄色片免费观看 | 久久久久久亚洲精品 | 亚州综合在线 | 国产美女在线精品免费 | 精产国产伦理一二三区 | 91偷拍精品一区二区三区 | 夜夜骚 | 91成人在线视频 | 亚洲高清视频在线 | 精品国产乱码久久久久久蜜退臀 | 国产精品免费小视频 | 黄视频网站在线 | 性高湖久久久久久久久3小时 | 亚洲国产情侣自拍 | 久久久久久成人 | 麻豆一区一区三区四区 | 在线天堂免费中文字幕视频 | 免费观看www| 在线观看国产视频 | 天堂亚洲网 | 一级网站 | 久久久av中文字幕 | 久久久精品综合 | 国精产品一区二区三区 | 在线一区视频 | 99热热热| 99精品在线观看 | 国产激情视频网站 | 欧美激情国产日韩精品一区18 |