远方Alan
2022-05-06 15:05
采纳率: 100%
浏览 17

STM32修改例程液晶屏代码

我想请教一下,我在尝试用STM32接收GPS模块的数据。例程中给的液晶屏型号是9320,但我的板子上是9341。例程烧录到板子里面之后,液晶屏没有反应。板子的型号是野火STM32F103VET6,GPS模块的型号是WTGPS-BD。我该怎么修改程序才能让板子的屏幕上显示接收到GPS的数据?
这是源程序所在网址,烦请http://wit-motion.cn/#/witmotion/literature/download?id=1510078408439394305
由于上传限制,这部分是部分需要更改的代码

#include "lcd.h"
#include "stdlib.h"
#include "font.h" 
#include "usart.h"     
#include "delay.h"       
//////////////////////////////////////////////////////////////////////////////////     
//本程序只供学习使用
//ALIENTEK STM32F103ZET6开发板    
//LCD的画笔颜色和背景色       
u16 POINT_COLOR=0x0000;    //画笔颜色
u16 BACK_COLOR=0xFFFF;  //背景色 
  
//管理LCD重要参数
//默认为竖屏
_lcd_dev lcddev;
     
//写寄存器函数
//regval:寄存器值
void LCD_WR_REG(u16 regval)
{   
    LCD->LCD_REG=regval;//写入要写的寄存器序号     
}
//写LCD数据
//data:要写入的值
void LCD_WR_DATA(u16 data)
{     
    LCD->LCD_RAM=data;         
}
//读LCD数据
//返回值:读到的值
u16 LCD_RD_DATA(void)
{
    vu16 ram;            //防止被优化
    ram=LCD->LCD_RAM;    
    return ram;     
}                       
//写寄存器
//LCD_Reg:寄存器地址
//LCD_RegValue:要写入的数据
void LCD_WriteReg(u16 LCD_Reg,u16 LCD_RegValue)
{    
    LCD->LCD_REG = LCD_Reg;        //写入要写的寄存器序号     
    LCD->LCD_RAM = LCD_RegValue;//写入数据                 
}       
//读寄存器
//LCD_Reg:寄存器地址
//返回值:读到的数据
u16 LCD_ReadReg(u16 LCD_Reg)
{                                           
    LCD_WR_REG(LCD_Reg);        //写入要读的寄存器序号
    delay_us(5);          
    return LCD_RD_DATA();        //返回读到的值
}   
//开始写GRAM
void LCD_WriteRAM_Prepare(void)
{
     LCD->LCD_REG=lcddev.wramcmd;      
}     
//LCD写GRAM
//RGB_Code:颜色值
void LCD_WriteRAM(u16 RGB_Code)
{                                
    LCD->LCD_RAM = RGB_Code;//写十六位GRAM
}
//从ILI93xx读出的数据为GBR格式,而我们写入的时候为RGB格式。
//通过该函数转换
//c:GBR格式的颜色值
//返回值:RGB格式的颜色值
u16 LCD_BGR2RGB(u16 c)
{
    u16  r,g,b,rgb;   
    b=(c>>0)&0x1f;
    g=(c>>5)&0x3f;
    r=(c>>11)&0x1f;     
    rgb=(b<<11)+(g<<5)+(r<<0);         
    return(rgb);
} 
//当mdk -O1时间优化时需要设置
//延时i
void opt_delay(u8 i)
{
    while(i--);
}
//读取个某点的颜色值     
//x,y:坐标
//返回值:此点的颜色
u16 LCD_ReadPoint(u16 x,u16 y)
{
     u16 r=0,g=0,b=0;
    if(x>=lcddev.width||y>=lcddev.height)return 0;    //超过了范围,直接返回           
    LCD_SetCursor(x,y);        
    if(lcddev.id==0X9341||lcddev.id==0X6804||lcddev.id==0X5310||lcddev.id==0X1963)LCD_WR_REG(0X2E);//9341/6804/3510/1963 发送读GRAM指令
    else if(lcddev.id==0X5510)LCD_WR_REG(0X2E00);    //5510 发送读GRAM指令
    else LCD_WR_REG(0X22);                           //其他IC发送读GRAM指令
    if(lcddev.id==0X9320)opt_delay(2);                //FOR 9320,延时2us        
     r=LCD_RD_DATA();                                //dummy Read       
    if(lcddev.id==0X1963)return r;                    //1963直接读就可以 
    opt_delay(2);      
     r=LCD_RD_DATA();                                    //实际坐标颜色
     if(lcddev.id==0X9341||lcddev.id==0X5310||lcddev.id==0X5510)        //9341/NT35310/NT35510要分2次读出
     {
        opt_delay(2);      
        b=LCD_RD_DATA(); 
        g=r&0XFF;        //对于9341/5310/5510,第一次读取的是RG的值,R在前,G在后,各占8位
        g<<=8;
    } 
    if(lcddev.id==0X9325||lcddev.id==0X4535||lcddev.id==0X4531||lcddev.id==0XB505||lcddev.id==0XC505)return r;    //这几种IC直接返回颜色值
    else if(lcddev.id==0X9341||lcddev.id==0X5310||lcddev.id==0X5510)return (((r>>11)<<11)|((g>>10)<<5)|(b>>11));//ILI9341/NT35310/NT35510需要公式转换一下
    else return LCD_BGR2RGB(r);                        //其他IC
}             
//LCD开启显示
void LCD_DisplayOn(void)
{                       
    if(lcddev.id==0X9341||lcddev.id==0X6804||lcddev.id==0X5310||lcddev.id==0X1963)LCD_WR_REG(0X29);    //开启显示
    else if(lcddev.id==0X5510)LCD_WR_REG(0X2900);    //开启显示
    else LCD_WriteReg(0X07,0x0173);                      //开启显示
}     
//LCD关闭显示
void LCD_DisplayOff(void)
{       
    if(lcddev.id==0X9341||lcddev.id==0X6804||lcddev.id==0X5310||lcddev.id==0X1963)LCD_WR_REG(0X28);    //关闭显示
    else if(lcddev.id==0X5510)LCD_WR_REG(0X2800);    //关闭显示
    else LCD_WriteReg(0X07,0x0);//关闭显示 
}   
//设置光标位置
//Xpos:横坐标
//Ypos:纵坐标
void LCD_SetCursor(u16 Xpos, u16 Ypos)
{     
     if(lcddev.id==0X9341||lcddev.id==0X5310)
    {            
        LCD_WR_REG(lcddev.setxcmd); 
        LCD_WR_DATA(Xpos>>8);LCD_WR_DATA(Xpos&0XFF);              
        LCD_WR_REG(lcddev.setycmd); 
        LCD_WR_DATA(Ypos>>8);LCD_WR_DATA(Ypos&0XFF);         
    }else if(lcddev.id==0X6804)
    {
        if(lcddev.dir==1)Xpos=lcddev.width-1-Xpos;//横屏时处理
        LCD_WR_REG(lcddev.setxcmd); 
        LCD_WR_DATA(Xpos>>8);LCD_WR_DATA(Xpos&0XFF); 
        LCD_WR_REG(lcddev.setycmd); 
        LCD_WR_DATA(Ypos>>8);LCD_WR_DATA(Ypos&0XFF); 
    }else if(lcddev.id==0X1963)
    {                       
        if(lcddev.dir==0)//x坐标需要变换
        {
            Xpos=lcddev.width-1-Xpos;
            LCD_WR_REG(lcddev.setxcmd); 
            LCD_WR_DATA(0);LCD_WR_DATA(0);         
            LCD_WR_DATA(Xpos>>8);LCD_WR_DATA(Xpos&0XFF);              
        }else
        {
            LCD_WR_REG(lcddev.setxcmd); 
            LCD_WR_DATA(Xpos>>8);LCD_WR_DATA(Xpos&0XFF);         
            LCD_WR_DATA((lcddev.width-1)>>8);LCD_WR_DATA((lcddev.width-1)&0XFF);                          
        }    
        LCD_WR_REG(lcddev.setycmd); 
        LCD_WR_DATA(Ypos>>8);LCD_WR_DATA(Ypos&0XFF);         
        LCD_WR_DATA((lcddev.height-1)>>8);LCD_WR_DATA((lcddev.height-1)&0XFF);                      
        
    }else if(lcddev.id==0X5510)
    {
        LCD_WR_REG(lcddev.setxcmd);LCD_WR_DATA(Xpos>>8);         
        LCD_WR_REG(lcddev.setxcmd+1);LCD_WR_DATA(Xpos&0XFF);             
        LCD_WR_REG(lcddev.setycmd);LCD_WR_DATA(Ypos>>8);          
        LCD_WR_REG(lcddev.setycmd+1);LCD_WR_DATA(Ypos&0XFF);            
    }else
    {
        if(lcddev.dir==1)Xpos=lcddev.width-1-Xpos;//横屏其实就是调转x,y坐标
        LCD_WriteReg(lcddev.setxcmd, Xpos);
        LCD_WriteReg(lcddev.setycmd, Ypos);
    }     
}          
//设置LCD的自动扫描方向
//注意:其他函数可能会受到此函数设置的影响(尤其是9341/6804这两个奇葩),
//所以,一般设置为L2R_U2D即可,如果设置为其他扫描方式,可能导致显示不正常.
//dir:0~7,代表8个方向(具体定义见lcd.h)
//9320/9325/9328/4531/4535/1505/b505/5408/9341/5310/5510/1963等IC已经实际测试              
void LCD_Scan_Dir(u8 dir)
{
    u16 regval=0;
    u16 dirreg=0;
    u16 temp;  
    if((lcddev.dir==1&&lcddev.id!=0X6804&&lcddev.id!=0X1963)||(lcddev.dir==0&&lcddev.id==0X1963))//横屏时,对6804和1963不改变扫描方向!竖屏时1963改变方向
    {               
        switch(dir)//方向转换
        {
            case 0:dir=6;break;
            case 1:dir=7;break;
            case 2:dir=4;break;
            case 3:dir=5;break;
            case 4:dir=1;break;
            case 5:dir=0;break;
            case 6:dir=3;break;
            case 7:dir=2;break;         
        }
    } 
    if(lcddev.id==0x9341||lcddev.id==0X6804||lcddev.id==0X5310||lcddev.id==0X5510||lcddev.id==0X1963)//9341/6804/5310/5510/1963,特殊处理
    {
        switch(dir)
        {
            case L2R_U2D://从左到右,从上到下
                regval|=(0<<7)|(0<<6)|(0<<5); 
                break;
            case L2R_D2U://从左到右,从下到上
                regval|=(1<<7)|(0<<6)|(0<<5); 
                break;
            case R2L_U2D://从右到左,从上到下
                regval|=(0<<7)|(1<<6)|(0<<5); 
                break;
            case R2L_D2U://从右到左,从下到上
                regval|=(1<<7)|(1<<6)|(0<<5); 
                break;     
            case U2D_L2R://从上到下,从左到右
                regval|=(0<<7)|(0<<6)|(1<<5); 
                break;
            case U2D_R2L://从上到下,从右到左
                regval|=(0<<7)|(1<<6)|(1<<5); 
                break;
            case D2U_L2R://从下到上,从左到右
                regval|=(1<<7)|(0<<6)|(1<<5); 
                break;
            case D2U_R2L://从下到上,从右到左
                regval|=(1<<7)|(1<<6)|(1<<5); 
                break;     
        }
        if(lcddev.id==0X5510)dirreg=0X3600;
        else dirreg=0X36;
         if((lcddev.id!=0X5310)&&(lcddev.id!=0X5510)&&(lcddev.id!=0X1963))regval|=0X08;//5310/5510/1963不需要BGR   
        if(lcddev.id==0X6804)regval|=0x02;//6804的BIT6和9341的反了       
        LCD_WriteReg(dirreg,regval);
        if(lcddev.id!=0X1963)//1963不做坐标处理
        {
            if(regval&0X20)
            {
                if(lcddev.width<lcddev.height)//交换X,Y
                {
                    temp=lcddev.width;
                    lcddev.width=lcddev.height;
                    lcddev.height=temp;
                }
            }else  
            {
                if(lcddev.width>lcddev.height)//交换X,Y
                {
                    temp=lcddev.width;
                    lcddev.width=lcddev.height;
                    lcddev.height=temp;
                }
            }  
        }
        if(lcddev.id==0X5510)
        {
            LCD_WR_REG(lcddev.setxcmd);LCD_WR_DATA(0); 
            LCD_WR_REG(lcddev.setxcmd+1);LCD_WR_DATA(0); 
            LCD_WR_REG(lcddev.setxcmd+2);LCD_WR_DATA((lcddev.width-1)>>8); 
            LCD_WR_REG(lcddev.setxcmd+3);LCD_WR_DATA((lcddev.width-1)&0XFF); 
            LCD_WR_REG(lcddev.setycmd);LCD_WR_DATA(0); 
            LCD_WR_REG(lcddev.setycmd+1);LCD_WR_DATA(0); 
            LCD_WR_REG(lcddev.setycmd+2);LCD_WR_DATA((lcddev.height-1)>>8); 
            LCD_WR_REG(lcddev.setycmd+3);LCD_WR_DATA((lcddev.height-1)&0XFF);
        }else
        {
            LCD_WR_REG(lcddev.setxcmd); 
            LCD_WR_DATA(0);LCD_WR_DATA(0);
            LCD_WR_DATA((lcddev.width-1)>>8);LCD_WR_DATA((lcddev.width-1)&0XFF);
            LCD_WR_REG(lcddev.setycmd); 
            LCD_WR_DATA(0);LCD_WR_DATA(0);
            LCD_WR_DATA((lcddev.height-1)>>8);LCD_WR_DATA((lcddev.height-1)&0XFF);  
        }
      }else 
    {
        switch(dir)
        {
            case L2R_U2D://从左到右,从上到下
                regval|=(1<<5)|(1<<4)|(0<<3); 
                break;
            case L2R_D2U://从左到右,从下到上
                regval|=(0<<5)|(1<<4)|(0<<3); 
                break;
            case R2L_U2D://从右到左,从上到下
                regval|=(1<<5)|(0<<4)|(0<<3);
                break;
            case R2L_D2U://从右到左,从下到上
                regval|=(0<<5)|(0<<4)|(0<<3); 
                break;     
            case U2D_L2R://从上到下,从左到右
                regval|=(1<<5)|(1<<4)|(1<<3); 
                break;
            case U2D_R2L://从上到下,从右到左
                regval|=(1<<5)|(0<<4)|(1<<3); 
                break;
            case D2U_L2R://从下到上,从左到右
                regval|=(0<<5)|(1<<4)|(1<<3); 
                break;
            case D2U_R2L://从下到上,从右到左
                regval|=(0<<5)|(0<<4)|(1<<3); 
                break;     
        } 
        dirreg=0X03;
        regval|=1<<12; 
        LCD_WriteReg(dirreg,regval);
    }
}     
//画点
//x,y:坐标
//POINT_COLOR:此点的颜色
void LCD_DrawPoint(u16 x,u16 y)
{
    LCD_SetCursor(x,y);        //设置光标位置 
    LCD_WriteRAM_Prepare();    //开始写入GRAM
    LCD->LCD_RAM=POINT_COLOR; 
}
//快速画点
//x,y:坐标
//color:颜色
void LCD_Fast_DrawPoint(u16 x,u16 y,u16 color)
{       
    if(lcddev.id==0X9341||lcddev.id==0X5310)
    {
        LCD_WR_REG(lcddev.setxcmd); 
        LCD_WR_DATA(x>>8);LCD_WR_DATA(x&0XFF);               
        LCD_WR_REG(lcddev.setycmd); 
        LCD_WR_DATA(y>>8);LCD_WR_DATA(y&0XFF);               
    }else if(lcddev.id==0X5510)
    {
        LCD_WR_REG(lcddev.setxcmd);LCD_WR_DATA(x>>8);  
        LCD_WR_REG(lcddev.setxcmd+1);LCD_WR_DATA(x&0XFF);      
        LCD_WR_REG(lcddev.setycmd);LCD_WR_DATA(y>>8);  
        LCD_WR_REG(lcddev.setycmd+1);LCD_WR_DATA(y&0XFF); 
    }else if(lcddev.id==0X1963)
    {
        if(lcddev.dir==0)x=lcddev.width-1-x;
        LCD_WR_REG(lcddev.setxcmd); 
        LCD_WR_DATA(x>>8);LCD_WR_DATA(x&0XFF);         
        LCD_WR_DATA(x>>8);LCD_WR_DATA(x&0XFF);         
        LCD_WR_REG(lcddev.setycmd); 
        LCD_WR_DATA(y>>8);LCD_WR_DATA(y&0XFF);         
        LCD_WR_DATA(y>>8);LCD_WR_DATA(y&0XFF);         
    }else if(lcddev.id==0X6804)
    {            
        if(lcddev.dir==1)x=lcddev.width-1-x;//横屏时处理
        LCD_WR_REG(lcddev.setxcmd); 
        LCD_WR_DATA(x>>8);LCD_WR_DATA(x&0XFF);             
        LCD_WR_REG(lcddev.setycmd); 
        LCD_WR_DATA(y>>8);LCD_WR_DATA(y&0XFF);         
    }else
    {
         if(lcddev.dir==1)x=lcddev.width-1-x;//横屏其实就是调转x,y坐标
        LCD_WriteReg(lcddev.setxcmd,x);
        LCD_WriteReg(lcddev.setycmd,y);
    }             
    LCD->LCD_REG=lcddev.wramcmd; 
    LCD->LCD_RAM=color; 
}     
//SSD1963 背光设置
//pwm:背光等级,0~100.越大越亮.
void LCD_SSD_BackLightSet(u8 pwm)
{    
    LCD_WR_REG(0xBE);    //配置PWM输出
    LCD_WR_DATA(0x05);    //1设置PWM频率
    LCD_WR_DATA(pwm*2.55);//2设置PWM占空比
    LCD_WR_DATA(0x01);    //3设置C
    LCD_WR_DATA(0xFF);    //4设置D
    LCD_WR_DATA(0x00);    //5设置E
    LCD_WR_DATA(0x00);    //6设置F
}

//设置LCD显示方向
//dir:0,竖屏;1,横屏
void LCD_Display_Dir(u8 dir)
{
    if(dir==0)            //竖屏
    {
        lcddev.dir=0;    //竖屏
        lcddev.width=240;
        lcddev.height=320;
        if(lcddev.id==0X9341||lcddev.id==0X6804||lcddev.id==0X5310)
        {
            lcddev.wramcmd=0X2C;
             lcddev.setxcmd=0X2A;
            lcddev.setycmd=0X2B;       
            if(lcddev.id==0X6804||lcddev.id==0X5310)
            {
                lcddev.width=320;
                lcddev.height=480;
            }
        }else if(lcddev.id==0x5510)
        {
            lcddev.wramcmd=0X2C00;
             lcddev.setxcmd=0X2A00;
            lcddev.setycmd=0X2B00; 
            lcddev.width=480;
            lcddev.height=800;
        }else if(lcddev.id==0X1963)
        {
            lcddev.wramcmd=0X2C;    //设置写入GRAM的指令 
            lcddev.setxcmd=0X2B;    //设置写X坐标指令
            lcddev.setycmd=0X2A;    //设置写Y坐标指令
            lcddev.width=480;        //设置宽度480
            lcddev.height=800;        //设置高度800  
        }else
        {
            lcddev.wramcmd=0X22;
             lcddev.setxcmd=0X20;
            lcddev.setycmd=0X21;  
        }
    }else                 //横屏
    {                      
        lcddev.dir=1;    //横屏
        lcddev.width=320;
        lcddev.height=240;
        if(lcddev.id==0X9341||lcddev.id==0X5310)
        {
            lcddev.wramcmd=0X2C;
             lcddev.setxcmd=0X2A;
            lcddev.setycmd=0X2B;       
        }else if(lcddev.id==0X6804)     
        {
             lcddev.wramcmd=0X2C;
             lcddev.setxcmd=0X2B;
            lcddev.setycmd=0X2A; 
        }else if(lcddev.id==0x5510)
        {
            lcddev.wramcmd=0X2C00;
             lcddev.setxcmd=0X2A00;
            lcddev.setycmd=0X2B00; 
            lcddev.width=800;
            lcddev.height=480;
        }else if(lcddev.id==0X1963)
        {
            lcddev.wramcmd=0X2C;    //设置写入GRAM的指令 
            lcddev.setxcmd=0X2A;    //设置写X坐标指令
            lcddev.setycmd=0X2B;    //设置写Y坐标指令
            lcddev.width=800;        //设置宽度800
            lcddev.height=480;        //设置高度480  
        }else
        {
            lcddev.wramcmd=0X22;
             lcddev.setxcmd=0X21;
            lcddev.setycmd=0X20;  
        }
        if(lcddev.id==0X6804||lcddev.id==0X5310)
        {      
            lcddev.width=480;
            lcddev.height=320;             
        }
    } 
    LCD_Scan_Dir(DFT_SCAN_DIR);    //默认扫描方向
}     
//设置窗口,并自动设置画点坐标到窗口左上角(sx,sy).
//sx,sy:窗口起始坐标(左上角)
//width,height:窗口宽度和高度,必须大于0!!
//窗体大小:width*height. 
void LCD_Set_Window(u16 sx,u16 sy,u16 width,u16 height)
{    
    u8 hsareg,heareg,vsareg,veareg;
    u16 hsaval,heaval,vsaval,veaval; 
    u16 twidth,theight;
    twidth=sx+width-1;
    theight=sy+height-1;
    if(lcddev.id==0X9341||lcddev.id==0X5310||lcddev.id==0X6804||(lcddev.dir==1&&lcddev.id==0X1963))
    {
        LCD_WR_REG(lcddev.setxcmd); 
        LCD_WR_DATA(sx>>8); 
        LCD_WR_DATA(sx&0XFF);     
        LCD_WR_DATA(twidth>>8); 
        LCD_WR_DATA(twidth&0XFF);  
        LCD_WR_REG(lcddev.setycmd); 
        LCD_WR_DATA(sy>>8); 
        LCD_WR_DATA(sy&0XFF); 
        LCD_WR_DATA(theight>>8); 
        LCD_WR_DATA(theight&0XFF); 
    }else if(lcddev.id==0X1963)//1963竖屏特殊处理
    {
        sx=lcddev.width-width-sx; 
        height=sy+height-1; 
        LCD_WR_REG(lcddev.setxcmd); 
        LCD_WR_DATA(sx>>8); 
        LCD_WR_DATA(sx&0XFF);     
        LCD_WR_DATA((sx+width-1)>>8); 
        LCD_WR_DATA((sx+width-1)&0XFF);  
        LCD_WR_REG(lcddev.setycmd); 
        LCD_WR_DATA(sy>>8); 
        LCD_WR_DATA(sy&0XFF); 
        LCD_WR_DATA(height>>8); 
        LCD_WR_DATA(height&0XFF);         
    }else if(lcddev.id==0X5510)
    {
        LCD_WR_REG(lcddev.setxcmd);LCD_WR_DATA(sx>>8);  
        LCD_WR_REG(lcddev.setxcmd+1);LCD_WR_DATA(sx&0XFF);      
        LCD_WR_REG(lcddev.setxcmd+2);LCD_WR_DATA(twidth>>8);   
        LCD_WR_REG(lcddev.setxcmd+3);LCD_WR_DATA(twidth&0XFF);   
        LCD_WR_REG(lcddev.setycmd);LCD_WR_DATA(sy>>8);   
        LCD_WR_REG(lcddev.setycmd+1);LCD_WR_DATA(sy&0XFF);  
        LCD_WR_REG(lcddev.setycmd+2);LCD_WR_DATA(theight>>8);   
        LCD_WR_REG(lcddev.setycmd+3);LCD_WR_DATA(theight&0XFF);  
    }else    //其他驱动IC
    {
        if(lcddev.dir==1)//横屏
        {
            //窗口值
            hsaval=sy;                
            heaval=theight;
            vsaval=lcddev.width-twidth-1;
            veaval=lcddev.width-sx-1;                
        }else
        { 
            hsaval=sx;                
            heaval=twidth;
            vsaval=sy;
            veaval=theight;
        } 
        hsareg=0X50;heareg=0X51;//水平方向窗口寄存器
        vsareg=0X52;veareg=0X53;//垂直方向窗口寄存器                                     
        //设置寄存器值
        LCD_WriteReg(hsareg,hsaval);
        LCD_WriteReg(heareg,heaval);
        LCD_WriteReg(vsareg,vsaval);
        LCD_WriteReg(veareg,veaval);        
        LCD_SetCursor(sx,sy);    //设置光标位置
    }
}
//初始化lcd
//该初始化函数可以初始化各种ILI93XX液晶,但是其他函数是基于ILI9320的!!!
//在其他型号的驱动芯片上没有测试! 


  • 写回答
  • 好问题 提建议
  • 追加酬金
  • 关注问题
  • 邀请回答

1条回答 默认 最新

相关推荐 更多相似问题