MCU驱动TFT彩屏 刷屏数据40ms左右传完了 但屏幕实际刷新时间用了300ms以上

MCU驱动TFT彩屏 刷屏数据40ms左右传完了 但屏幕实际刷新时间用了300ms以上

问题相关代码,请勿粘贴截图
#include<STC8A8K64D4.H>
#include "TFT.h"
#include "weather.h"

sbit BLK = P5^3;    //背光控制
sbit RS = P0^5;     //数据命令切换线
sbit RST = P0^6;    //复位线
sbit CS = P0^7;     //片选
sbit SCLK = P1^5;   //SPI时钟线
sbit MOSI = P1^3;    //SPI数据线
sbit LED = P5^0;
unsigned int time_i = 0;

void Timer0Init(void);
void UartInit(void);

bit Lcd_Clean = 0;
bit Lcd_color = 1;


void main()
{
    Timer0Init();
    UartInit();
    
    LED = 1;
    
    ET0 = 1;
    EA = 1;
    
    Lcd_Init();

    while(1)
    {
        if(Lcd_Clean)
        {
            Lcd_Clean = 0;

            if(Lcd_color)
            {
                Lcd_clear(0x8080);
                Lcd_color = 0;
            }
            else
            {
                Lcd_clear(0xFFFF);
                Lcd_color = 1;
            }
        }

    }
}


void TM0_Isr() interrupt 1
{
    
    time_i++;
    if(time_i == 1000)
    {
        time_i = 0;
        Lcd_Clean = 1;
    }
}

void Timer0Init(void)        //1毫秒@33.1776MHz
{
    AUXR |= 0x80;        //定时器时钟1T模式
    TMOD &= 0xF0;        //设置定时器模式
    TL0 = 0x66;        //设置定时初始值
    TH0 = 0x7E;        //设置定时初始值
    TF0 = 0;        //清除TF0标志
    TR0 = 1;        //定时器0开始计时
}


void UartInit(void)        //115200bps@33.1776MHz
{
    SCON = 0x50;        //8位数据,可变波特率
    AUXR |= 0x40;        //定时器时钟1T模式
    AUXR &= 0xFE;        //串口1选择定时器1为波特率发生器
    TMOD &= 0x0F;        //设置定时器模式
    TL1 = 0xB8;        //设置定时初始值
    TH1 = 0xFF;        //设置定时初始值
    ET1 = 0;        //禁止定时器%d中断
    TR1 = 1;        //定时器1开始计时
}


void Delay500ms()        //@12.000MHz
{
    unsigned char i, j, k;

    _nop_();
    _nop_();
    i = 23;
    j = 205;
    k = 120;
    do
    {
        do
        {
            while (--k);
        } while (--j);
    } while (--i);
}

void SPI_Init()   //初始化SPI  SPI频率为FOSC/2
{
    SPDAT = 0;
    SPSTAT = 0xC0;
    SPCTL = 0xDF;
}


void Lcd_Write_cmd(unsigned char cmd)   //TFT写入一个命令
{
    CS = 0;
    RS = 0;
    
    SPDAT = cmd;
    while(!(SPSTAT & 0x80));
    SPSTAT = 0xC0;
    
    CS = 1;
}

void Lcd_Write_data(unsigned char dat)   //TFT写入一个8位数据
{
    CS  = 0;
    RS = 1;
    
    SPDAT = dat;
    while(!(SPSTAT & 0x80));
    SPSTAT = 0xC0;
    
    CS = 1;
}

void Lcd_Write_data_16bit(unsigned int dat)    //TFT写入一个16位数据
{
    Lcd_Write_data(dat >> 8);
    Lcd_Write_data(dat);
}

void Lcd_SetRegion(unsigned char x_start, unsigned char y_start, unsigned char x_end, unsigned char y_end)  //选中一个区域
{
    Lcd_Write_cmd(0x2A);    //列地址设置
    
    Lcd_Write_data(0);
    Lcd_Write_data(x_start+2);
    Lcd_Write_data(0);
    Lcd_Write_data(x_end+2);
    
    Lcd_Write_cmd(0x2B);   //行地址设置
    
    Lcd_Write_data(0);
    Lcd_Write_data(y_start+3);
    Lcd_Write_data(0);
    Lcd_Write_data(y_end+3);
    
    Lcd_Write_cmd(0x2C);
}

void Lcd_clear(unsigned int color)        //清屏
{
    unsigned int i;
    
    LED = 0;
    
    Lcd_SetRegion(0,0,127,127);

    for(i=0;i<16384;i++)
    {
        Lcd_Write_data_16bit(color);
    }
    LED = 1;
    
}

void Lcd_Init()   //初始化LCD
{
    BLK = 0;
    
    RST = 0;
    Delay500ms();
    
    RST = 1;
    Delay500ms();
    
    SPI_Init();
    
    Delay500ms();
    
    Lcd_Write_cmd(0x11);    //退出休眠
    
    Delay500ms();
    
    Lcd_Write_cmd(0xB1);    //设置正常刷新率
    Lcd_Write_data(0x01);
    Lcd_Write_data(0x2C);
    Lcd_Write_data(0x2D);
    
    Lcd_Write_cmd(0xB2);    //设置空闲模式刷新率
    Lcd_Write_data(0x01);
    Lcd_Write_data(0x2C);
    Lcd_Write_data(0x2D);
    
    Lcd_Write_cmd(0xB3);    //设置部分/全色的刷新率
    Lcd_Write_data(0x01);
    Lcd_Write_data(0x2C);
    Lcd_Write_data(0x2D);
    Lcd_Write_data(0x01);
    Lcd_Write_data(0x2C);
    Lcd_Write_data(0x2D);
    
    Lcd_Write_cmd(0xB4);     //显示反转模式控制
    Lcd_Write_data(0x07);
    
    Lcd_Write_cmd(0xC0);     //电源控制1
    Lcd_Write_data(0xA2);
    Lcd_Write_data(0x02);
    Lcd_Write_data(0x84);
    
    Lcd_Write_cmd(0xC1);     //电源控制2
    Lcd_Write_data(0xC5);
    
    Lcd_Write_cmd(0xC2);     //电源控制3
    Lcd_Write_data(0x0A);
    Lcd_Write_data(0x00);
    
    Lcd_Write_cmd(0xC3);     //电源控制4
    Lcd_Write_data(0x8A);
    Lcd_Write_data(0x2A);
    
    Lcd_Write_cmd(0xC4);     //电源控制5
    Lcd_Write_data(0x8A);
    Lcd_Write_data(0xEE);
    
    Lcd_Write_cmd(0xC5);     //VCOM控制1
    Lcd_Write_data(0x0E);
    
    Lcd_Write_cmd(0x36);     //内存数据访问控制
    
    Lcd_Write_data(0xC8);
    
    //Lcd_Write_cmd(0x21);
    
    Lcd_Write_cmd(0xE0); 
    Lcd_Write_data(0x0F); 
    Lcd_Write_data(0x1A); 
    Lcd_Write_data(0x0F); 
    Lcd_Write_data(0x18); 
    Lcd_Write_data(0x2F); 
    Lcd_Write_data(0x28); 
    Lcd_Write_data(0x20); 
    Lcd_Write_data(0x22); 
    Lcd_Write_data(0x1F); 
    Lcd_Write_data(0x1B); 
    Lcd_Write_data(0x23); 
    Lcd_Write_data(0x37); 
    Lcd_Write_data(0x00);     
    Lcd_Write_data(0x07); 
    Lcd_Write_data(0x02); 
    Lcd_Write_data(0x10);
    
    Lcd_Write_cmd(0xE1); 
    Lcd_Write_data(0x0F); 
    Lcd_Write_data(0x1B); 
    Lcd_Write_data(0x0F); 
    Lcd_Write_data(0x17); 
    Lcd_Write_data(0x33); 
    Lcd_Write_data(0x2C); 
    Lcd_Write_data(0x29); 
    Lcd_Write_data(0x2E); 
    Lcd_Write_data(0x30); 
    Lcd_Write_data(0x30); 
    Lcd_Write_data(0x39); 
    Lcd_Write_data(0x3F); 
    Lcd_Write_data(0x00); 
    Lcd_Write_data(0x07); 
    Lcd_Write_data(0x03); 
    Lcd_Write_data(0x10); 
    
    Lcd_Write_cmd(0xF0);    //启动测试命令
    Lcd_Write_data(0x01);   
    
    Lcd_Write_cmd(0xF6);    //禁用ram省电模式
    Lcd_Write_data(0x00);
    
    Lcd_Write_cmd(0x3A);    //65k mode
    Lcd_Write_data(0x05);
    
    Lcd_Write_cmd(0x29);  //开启显示
    
//    Lcd_SetRegion(0,0,127,127);   //选中整个屏幕
    
    Lcd_clear(0x0000);   //清屏(青色)
    
    BLK = 1;
}

LED是控制外部IO用逻辑分析仪来检测数据传输时间的

img

img

刷屏时间明显超过写数据的时间,请问这个是哪的问题

写数据时间是通过测量BLK信号?
那你所谓的刷屏时间又是通过测量什么得到的?

因为你刷屏受Lcd_Clean这个变量控制,而Lcd_Clean是在定时器改变的,定时器的周期限制了刷屏的频率。看你的注释,定时器的周期是1ms,结合代码的话,就是1秒刷一次,不过实际周期显然不是这样,可能运行参数和你的代码注释不一样。

因为清屏函数里,用的for循坏1万6千多次的写入