恳请高手看看,TFTLCD黑屏

2019-07-20 21:34发布

#include "stdio.h"
#include "math.h"
#include "stdlib.h"
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "lcd.h"
#define PI 3.141593
#define Vx y[1]
#define Vy y[2]
#define X  y[3]//水平
#define Y  y[4]//高度
#define f1(y1,y2,y3,y4,t) (-0.1109*y1)//Vx(Vr)
#define f2(y1,y2,y3,y4,t) (-0.1109*y2-9.81)//Vy(Vh)
#define f3(y1,y2,y3,y4,t) (y1)//X(r)
#define f4(y1,y2,y3,y4,t) (y2)//Y(h)

//ALIENTEK 探索者STM32F407开发板 实验13
//LCD显示实验-库函数版本
//技术支持:www.openedv.com
//淘宝店铺:http://eboard.taobao.com  
//广州市星翼电子科技有限公司  
//作者:正点原子 @ALIENTEK

int main(void)
{
       
        int   i,j,V,m=4,n=151;
        double     F,t,d,A[150],Db[150],Dc[150],B[150],C[150],G[150],M[150],r[150],R[150],y[150],y0[150],k1[150],k2[150],k3[150],k4[150]; //B[151],C[151],G[151]对应论文中X,Y,Z
        B[0]=0;//目标初始位置不变
        C[0]=100;
        G[0]=100;
        M[0]=0;//目标速度Vx
        M[1]=0;//Vy
        M[2]=-10;//Vz
    V=120;//弹丸初速120,对应整体中v[0]
        d=0.01;  //积分步长对应整体中h ,步长是关键,还未确定步长
        t=0;
        delay_init(168);      //初始化延时函数
        LCD_Init();           //初始化LCD FSMC接口
        POINT_COLOR=RED;      //画笔颜 {MOD}:红 {MOD}
        LCD_ShowString(30,40,210,24,24,"Angle:");       
        B[1]=B[0]+M[0]*t;//X(B[1])不断变化
        C[1]=C[0]+M[1]*t;
        G[1]=G[0]+M[2]*t;//目标z方向速度,
        r[1]=sqrt(B[1]*B[1]+G[1]*G[1]);
        R[1]=sqrt(r[1]*r[1]+C[1]*C[1]);
        A[1]=atan(C[1]/r[1]);//弹丸射角
        A[1]=A[1]*180/PI;//弧度化角度,程序中均为弧度,返回值A也为弧度,故化为角度,180度=π弧度 ,1度=π/180 弧度 ( ≈0.017453弧度 )
        A[1]=cos(A[1]*PI/180);//输入必须为弧度
        y0[1]=V*A[1];//弹丸初始条件
        A[1]=atan(C[1]/r[1]);//弹丸射角
        A[1]=A[1]*180/PI;//弧度化为度
        A[1]=sin(A[1]*PI/180);//输入必须为弧度
        y0[2]=V*A[1];
        y0[3]=0;
        y0[4]=0;
        for(j=1;j<=m;j++)//赋值,但不知道为什么这样赋值
                y[j]=y0[j];       
for(i=1;i<n;i++)
{
        for(j=1;j<=m;j++)
{
        if(j==1)
                k1[j]=d*f1((y[j]),(y[j+1]),(y[j+2]),(y[j+3]),t);
        else if(j==2)
                k1[j]=d*f2((y[j-1]),(y[j]),(y[j+1]),(y[j+2]),t);
        else if(j==3)
                k1[j]=d*f3((y[j-2]),(y[j-1]),(y[j]),(y[j+1]),t);
        else if(j==4)
                k1[j]=d*f4((y[j-3]),(y[j-2]),(y[j-1]),(y[j]),t);
}
for(j=1;j<=m;j++)
{
        if(j==1)
                k2[j]=d*f1((y[j]+0.5*k1[j]),(y[j+1]+0.5*k1[j+1]),(y[j+2]+0.5*k1[j+2]),(y[j+3]+0.5*k1[j+3]),(t+0.5*d));
        else if(j==2)
                k2[j]=d*f2((y[j-1]+0.5*k1[j-1]),(y[j]+0.5*k1[j]),(y[j+1]+0.5*k1[j+1]),(y[j+2]+0.5*k1[j+2]),(t+0.5*d));
        else if(j==3)
                k2[j]=d*f3((y[j-2]+0.5*k1[j-2]),(y[j-1]+0.5*k1[j-1]),(y[j]+0.5*k1[j]),(y[j+1]+0.5*k1[j+1]),(t+0.5*d));
        else if(j==4)
                k2[j]=d*f4((y[j-3]+0.5*k1[j-3]),(y[j-2]+0.5*k1[j-2]),(y[j-1]+0.5*k1[j-1]),(y[j]+0.5*k1[j]),(t+0.5*d));
}
for(j=1;j<=m;j++)
{
        if(j==1)
                k3[j]=d*f1((y[j]+0.5*k2[j]),(y[j+1]+0.5*k2[j+1]),(y[j+2]+0.5*k2[j+2]),(y[j+3]+0.5*k2[j+3]),(t+0.5*d));
        else if(j==2)
                k3[j]=d*f2((y[j-1]+0.5*k2[j-1]),(y[j]+0.5*k2[j]),(y[j+1]+0.5*k2[j+1]),(y[j+2]+0.5*k2[j+2]),(t+0.5*d));
        else if(j==3)
                k3[j]=d*f3((y[j-2]+0.5*k2[j-2]),(y[j-1]+0.5*k2[j-1]),(y[j]+0.5*k2[j]),(y[j+1]+0.5*k2[j+1]),(t+0.5*d));
        else if(j==4)
                k3[j]=d*f4((y[j-3]+0.5*k2[j-3]),(y[j-2]+0.5*k2[j-2]),(y[j-1]+0.5*k2[j-1]),(y[j]+0.5*k2[j]),(t+0.5*d));
}
for(j=1;j<=m;j++)
{
        if(j==1)
                k4[j]=d*f1((y[j]+k3[j]),(y[j+1]+k3[j+1]),(y[j+2]+k3[j+2]),(y[j+3]+k3[j+3]),(t+d));
        else if(j==2)
                k4[j]=d*f2((y[j-1]+k3[j-1]),(y[j]+k3[j]),(y[j+1]+k3[j+1]),(y[j+2]+k3[j+2]),(t+d));
        else if(j==3)
                k4[j]=d*f3((y[j-2]+k3[j-2]),(y[j-1]+k3[j-1]),(y[j]+k3[j]),(y[j+1]+k3[j+1]),(t+d));
        else if(j==4)
                k4[j]=d*f4((y[j-3]+k3[j-3]),(y[j-2]+k3[j-2]),(y[j-1]+k3[j-1]),(y[j]+k3[j]),(t+d));
}
for(j=1;j<=m;j++)
        y[j]=y[j]+((k1[j]+2.0*k2[j]+2.0*k3[j]+k4[j])/6.0);
        t=i*d;
        Db=X-r;
        Dc=Y-C;//误差选择5m
        //传递t不断更新预测初值
        B[i+1]=B[0]+M[0]*t;//X(B[1])不断变化,故需要数组,按照论文2,位置变化是初始值加上速度*时间
        C[i+1]=C[0]+M[1]*t;
        G[i+1]=G[0]+M[2]*t;//目标z方向速度,
        r[i+1]=sqrt(B[i+1]*B[i+1]+G[i+1]*G[i+1]);
        R[i+1]=sqrt(r[i+1]*r[i+1]+C[i+1]*C[i+1]);
while((0<Db)&&(Db<=0.5))//只能保证一个误差,另一个相差很大,是不是步长的问题
        {
        A=atan(Y/X);//此时为弧度
        A=A*180/PI;
        F=A;
        if(i%1==0)
                POINT_COLOR=RED;
                printf("F=%.1f ",F);       
                LCD_ShowxNum(30,50,F,10,24,0);
            delay_ms(1000);       
       
        }
        //修正射角,更新迭代初值
       
                A[i+1]=asin(A);
                A[i+1]=A[i+1]+Dc/R;                                                                                                                                                                 
                A[i+1]=A[i+1]*180/PI;
                A[i+1]=cos(A[i+1]*PI/180);
                y0[1]=V*A[i+1];
                A[i+1]=asin(A);
                A[i+1]=A[i+1]+Dc/R;
                A[i+1]=A[i+1]*180/PI;
                A[i+1]=sin(A[i+1]*PI/180);
                y0[2]=V*A[i+1];
                y0[3]=0;
                y0[4]=0;
                for(j=1;j<=m;j++);
                        y[j]=y0[j];
       
}

}
上面程序在vc++上运行良好,想移植到32f407上,鼓捣好几天了,总是不行,lcd驱动应该是可以的,因为是初学32所以是在tftlcd显示程序改的,没敢改内部函数,上一个帖子是想逐块实验找问题,遇到的问题,请高手帮忙看看,试过将数组改成A[15],也是不行,用double型简单显示,也可以显示

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。