标题:
STC15系列单片机利用硬件SPI可以提高显示速度一倍
[打印本页]
作者:
51hei团团
时间:
2018-8-9 03:28
标题:
STC15系列单片机利用硬件SPI可以提高显示速度一倍
买了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%
对比测试的视频
http://v.youku.com/v_show/id_XMTQ3Nzg4ODcwOA==.html
弹来弹去的时间显示。
http://v.youku.com/v_show/id_XMTQ3ODIwMDA1Ng==.html
作者:
NPC-1024
时间:
2018-8-15 10:57
有机会我也要学习一下硬件控制器
作者:
cqt5001
时间:
2019-2-21 14:51
TFT_KMRTM24024: 2.4寸TFT触摸屏,4线SPI,
刷屏6次,软件SPI:7032ms, 硬件SPI:1920ms
差别很大
作者:
miyuhao
时间:
2019-6-6 17:30
正在学习硬件spi,和cs5530通信程序。
作者:
a4umi001
时间:
2019-12-2 11:52
最近无聊正在研究一块OLED小屏
作者:
老电子
时间:
2020-4-16 21:09
请教,带字库的TFT或OLCD有两处片选,但共用其它三个脚,怎么设置??
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1