买了1块SPI接口的OLED屏。
商家提供的51下的驱动代码是软件模拟SPI的方式实现的。
虽然速度上基本上可以达到应用的要求了,但是出于实验的目的,周末研究了一下15系列硬件SPI,改写了一下驱动,并且比较了利用软硬两种SPI之间的差距。发现利用硬件SPI至少可以提高显示速度50%以上的效率。
看来以后在条件允许的情况下,多利用硬件SPI对程序的执行效率的提高是很有帮助的。
具体思路如下:
1.改写驱动代码
将往OLED屏写入字节的函数改为硬件SPI方式写入。
用_HARD_SPI_宏来切换软硬SPI接口
- #ifdef _HARD_SPI_
- void OLED_WR_Byte(u8 dat, u8 cmd)
- {
- if(cmd)
- OLED_DC_Set();
- else
- OLED_DC_Clr();
- SPDAT = dat;
- while(!(SPSTAT&SPIF));
- SPSTAT = SPIF | WCOL;
- OLED_DC_Set();
- }
- #else
- void OLED_WR_Byte(u8 dat,u8 cmd)
- {
- u8 i;
- if(cmd)
- OLED_DC_Set();
- else
- OLED_DC_Clr();
- OLED_CS_Clr();
- for(i=0;i<8;i++)
- {
- OLED_SCLK_Clr();
- if(dat&0x80)
- {
- OLED_SDIN_Set();
- }
- else
- {
- OLED_SDIN_Clr();
- }
- OLED_SCLK_Set();
- dat<<=1;
- }
- OLED_CS_Set();
- OLED_DC_Set();
- }
- #endif
复制代码 2.在main函数中对显示函数调用10000次
在循环调用前清除计数器并打开定时中断(定时器设定为1ms,晶振主频为30M)
定时中断负责计数。
10000次显示结束后输出定时中断计数器的值。
以下是main.c
- #include "STC15W4Kxxs4.h"
- #include "__c_param__.h"
- #include "display.h"
- #include "resource.h"
- unsigned long ulCount = 0;
- void timer0_int (void) interrupt 1
- {
- ulCount++;
- }
- void Timer0Init(void) //1毫秒@30.000MHz
- {
- AUXR |= 0x80; //定时器时钟1T模式
- TMOD &= 0xF0; //设置定时器模式
- TL0 = 0xD0; //设置定时初值
- TH0 = 0x8A; //设置定时初值
- TF0 = 0; //清除TF0标志
- TR0 = 1; //定时器0开始计时
- }
- void main()
- {
- int i;
- unsigned char col,row;
-
- Timer0Init();
-
- initial_lcd();
-
- clear_screen();
- display_graphic_Nx8M(1,1, dabai, 0, 128, 8);
- ulCount = 0;
- EA = 1;
- ET0 = 1; //Timer0中断允许
- //显示10000次 17*32大小的数字
- for(i = 0; i < 10000; i++)
- {
- display_graphic_Nx8M((i%2)*FONT_LARGE_H+1,1, font17x32, i % FONT_LARGE_C, FONT_LARGE_W, FONT_LARGE_H);
- // display_graphic_Nx8M(1,1, dabai, 0, 128, 8);
- // display_graphic_Nx8M((i%8),1,font7x8, i % FONT_SMALL_C, FONT_SMALL_W, FONT_SMALL_H);
- }
- ET0 = 0; //Timer0中断允许
- EA = 0;
-
- clear_screen();
- col = 1;
- row = 4;
- display_graphic_Nx8M(row,col, font11x24, (ulCount / 1000000) % 10, FONT_BIG_W, FONT_BIG_H);
- col += FONT_BIG_W;
- display_graphic_Nx8M(row,col, font11x24, (ulCount / 100000) % 10, FONT_BIG_W, FONT_BIG_H);
- col += FONT_BIG_W;
- display_graphic_Nx8M(row,col, font11x24, (ulCount / 10000) % 10, FONT_BIG_W, FONT_BIG_H);
- col += FONT_BIG_W;
- display_graphic_Nx8M(row,col, font11x24, (ulCount / 1000) % 10, FONT_BIG_W, FONT_BIG_H);
- col += FONT_BIG_W;
- display_graphic_Nx8M(row,col, font11x24, (ulCount / 100) % 10, FONT_BIG_W, FONT_BIG_H);
- col += FONT_BIG_W;
- display_graphic_Nx8M(row,col, font11x24, (ulCount / 10) % 10, FONT_BIG_W, FONT_BIG_H);
- col += FONT_BIG_W;
- display_graphic_Nx8M(row,col, font11x24, (ulCount) % 10, FONT_BIG_W, FONT_BIG_H);
-
- while(1);
- }
复制代码 最后结果:
显示17x32大小数字时 硬件SPI:3605ms 软件SPI:8030ms 提高:56.3%
显示128x64大小的图像 硬件SPI:22458ms 软件SPI:51544ms 提高:56.4%
显示7x8大小的数字 硬件SPI:597ms 软件SPI:1156ms 提高:48.4%
对比测试的视频
弹来弹去的时间显示。
|