[求助] 使用TFT显示屏实时显示动态图线的问题

若月听风   2018-7-11 13:22 楼主
各位大神,小弟在显示动态曲线的时候出了些问题,如下:
小弟用的单片机是正点原子的F1战舰版,最近在做32和FPGA之间的数据传输,以前都是FPGA采取2MHZ以下的数据,然后利用SPI通信协议传输给32,32再将数据再TFT显示屏上动态显示出来,自己写的程序,在显示低中频时效果还行,但是最近做高频,外部输入信号差不多有60MHZ,这就导致32在画动态曲线的时候,由于32内部执行的语句过多,导致,32在执行完显示语句以及擦线语句后,存在一个很短的时间间隔,但对于高频信号,就存在一个采取间断,所接收到的数据,并不是连续的,因此画的动态曲线也是断断续续,用通俗的话来讲,就是外部传输速率太快,然后32内部执行的速度跟不上(由于程序上,32要执行的语句过多导致)。请求各位大神   ,能不能帮小弟指点下,下面是我的程序,谢谢
void showline(float led0pwmval)//此函数直接调用   led0pwmval为外部接收到的数据
{
        static u16 i;
       static u16 x=1;
       static u16 buf[481];  //由于小弟采用的是480*800的TFT显示屏,利用横轴  作为数据的X轴
        if(x>480)
        {        
                POINT_COLOR=YELLOW;
                for(i=0;i<480;i++)
                {
                        buf=buf[i+1];  //实现数据的左移
                }
                buf[480]=led0pwmval*A;//将新接收到的数据传输给数组的最后一位,A为数据的放大参数
                for(i=0;i<479;i++)
                {
                        if(buf[i+1]>buf)        LCD_DrawLine(i,800-buf/B,i+1,800-buf[i+1]/B);   //画线函数   B为数据的缩小参数
                        else LCD_DrawLine(i,800-buf[i+1]/B,i+1,800-buf/B);
                }
                if(i==479)//边界数据的处理
                {
                        if(buf[480]>buf[479])        LCD_DrawLine(479,800-buf[479]/B,480,800-buf[480]/B);   
                        else LCD_DrawLine(479,800-buf[480]/B,480,800-buf[479]/B);
                }
                for(i=0;i<480;i++)
                {
                        
                        if(buf[i+1]>buf)LCD_CDrawLine(i,800-buf/B,i+1,800-buf[i+1]/B);//擦线函数  将buf所存的上次数据,全部擦掉(即,改为背景色)
                        else LCD_CDrawLine(i,800-buf[i+1]/B,i+1,800-buf/B);
                }
        }
        else
                {
                        POINT_COLOR=YELLOW;
                        buf[0]=0;
                        x++;
                        delay_ms(10);
                        buf[x]=led0pwmval*A;
                        if(buf[x]>buf[x-1])        LCD_DrawLine(x-1,800-buf[x-1]/B,x,800-buf[x]/B);   
                        else LCD_DrawLine(x-1,800-buf[x]/B,x,800-buf[x-1]/B);
                        if(x==480)
                        {
                                for(x=0;x<481;x++)
                                {
                                        if(buf[x+1]>buf[x])LCD_CDrawLine(x,800-buf[x]/B,x+1,800-buf[x+1]/B);
                                        else LCD_CDrawLine(x,800-buf[x+1]/B,x+1,800-buf[x]/B);
                                }        
                        }
          }
}



回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复