打印
[PIC®/AVR®/dsPIC®产品]

【CuriosityNano测评报告】+PIC18F16Q41 驱动SPI屏

[复制链接]
3739|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 pzsh 于 2021-9-13 13:24 编辑

电脑重装系统了,耽搁了好几天。重装的MAPLABX 莫名的出错,老是报错,说是啥编译器。编译器明明装了啊。又重新装了一遍,又装了些插件,然后就莫名的好了~真是让人一头雾水~
今天呢,来驱动一个SPI的小屏幕(ST7789,分辨率240X240)~到底是8位MCU,图片稍微整大些,就报错,超出范围了。

对于MCU得pack包升级到最新版本,新建工程,打开MCC配置,这里完全GPIO模拟,没什么好说的。
其中注意,LCD初始化时,要先控制的几个GPIO初始化要为高电平~否则屏幕显示不正常~
时钟:

gpio:

下面就开始程序:
lcd_init.h
/* 
* File:   lcd_init.h
* Author: Administrator
*
* Created on August 19, 2021, 3:23 PM
*/

#ifndef __LCD_INIT_H_
#define        __LCD_INIT_H_

#ifdef        __cplusplus
extern "C" {
#endif

#include "type.h"
   
#define USE_HORIZONTAL 0  //?????????? 0?1??? 2?3???


#define LCD_W 240
#define LCD_H 240


//-----------------LCD????----------------
   
#define LCD_SCLK_Clr() LCD_SCL_SetLow()//SCL=SCLK
#define LCD_SCLK_Set() LCD_SCL_SetHigh()

#define LCD_MOSI_Clr() LCD_SDA_SetLow()//SDA=MOSI
#define LCD_MOSI_Set() LCD_SDA_SetHigh()

#define LCD_RES_Clr()  LCD_RES_SetLow()//RES
#define LCD_RES_Set()  LCD_RES_SetHigh()

#define LCD_DC_Clr()   LCD_DC_SetLow()//DC
#define LCD_DC_Set()   LCD_DC_SetHigh()

#define LCD_BLK_Clr()  LCD_BLK_SetLow()//BLK
#define LCD_BLK_Set()  LCD_BLK_SetHigh()


void LCD_GPIO_Init(void);//???GPIO
void LCD_Writ_Bus(u8 dat);//??SPI??
void LCD_WR_DATA8(u8 dat);//??????
void LCD_WR_DATA(u16 dat);//??????
void LCD_WR_REG(u8 dat);//??????
void LCD_Address_Set(u16 x1,u16 y1,u16 x2,u16 y2);//??????
void LCD_Init(void);//LCD???


#ifdef        __cplusplus
}
#endif

#endif        /* LCD_INIT_H */

lcd_init.c
#include "lcd_init.h"
#include "../mcc_generated_files/mcc.h"

void LCD_GPIO_Init(void)
{
    LCD_RES_Set();
    LCD_DC_Set();
    LCD_SCLK_Set();
    LCD_MOSI_Set();
    LCD_BLK_Set();
   
    __delay_ms(1000);//ENOUGH TIME
}


/******************************************************************************
      ?????LCD????????
      ?????dat  ????????
      ????  ?
******************************************************************************/
void LCD_Writ_Bus(u8 dat)
{        
        u8 i;
        for(i=0;i<8;i++)
        {                          
                LCD_SCLK_Clr();
                if(dat&0x80)
                {
                   LCD_MOSI_Set();
                }
                else
                {
                   LCD_MOSI_Clr();
                }
                LCD_SCLK_Set();
                dat<<=1;
        }        
}


/******************************************************************************
      ?????LCD????
      ?????dat ?????
      ????  ?
******************************************************************************/
void LCD_WR_DATA8(u8 dat)
{
        LCD_Writ_Bus(dat);
}


/******************************************************************************
      ?????LCD????
      ?????dat ?????
      ????  ?
******************************************************************************/
void LCD_WR_DATA(u16 dat)
{
        LCD_Writ_Bus(dat>>8);
        LCD_Writ_Bus(dat);
}


/******************************************************************************
      ?????LCD????
      ?????dat ?????
      ????  ?
******************************************************************************/
void LCD_WR_REG(u8 dat)
{
        LCD_DC_Clr();//???
        LCD_Writ_Bus(dat);
        LCD_DC_Set();//???
}


/******************************************************************************
      ??????????????
      ?????x1,x2 ???????????
                y1,y2 ???????????
      ????  ?
******************************************************************************/
void LCD_Address_Set(u16 x1,u16 y1,u16 x2,u16 y2)
{
        if(USE_HORIZONTAL==0)
        {
                LCD_WR_REG(0x2a);//?????
                LCD_WR_DATA(x1);
                LCD_WR_DATA(x2);
                LCD_WR_REG(0x2b);//?????
                LCD_WR_DATA(y1);
                LCD_WR_DATA(y2);
                LCD_WR_REG(0x2c);//????
        }
        else if(USE_HORIZONTAL==1)
        {
                LCD_WR_REG(0x2a);//?????
                LCD_WR_DATA(x1);
                LCD_WR_DATA(x2);
                LCD_WR_REG(0x2b);//?????
                LCD_WR_DATA(y1+80);
                LCD_WR_DATA(y2+80);
                LCD_WR_REG(0x2c);//????
        }
        else if(USE_HORIZONTAL==2)
        {
                LCD_WR_REG(0x2a);//?????
                LCD_WR_DATA(x1);
                LCD_WR_DATA(x2);
                LCD_WR_REG(0x2b);//?????
                LCD_WR_DATA(y1);
                LCD_WR_DATA(y2);
                LCD_WR_REG(0x2c);//????
        }
        else
        {
                LCD_WR_REG(0x2a);//?????
                LCD_WR_DATA(x1+80);
                LCD_WR_DATA(x2+80);
                LCD_WR_REG(0x2b);//?????
                LCD_WR_DATA(y1);
                LCD_WR_DATA(y2);
                LCD_WR_REG(0x2c);//????
        }
}

void LCD_Init(void)
{
        LCD_GPIO_Init();//???GPIO
        
        LCD_RES_Clr();//??
        __delay_ms(100);
        LCD_RES_Set();
        __delay_ms(100);
        
        LCD_BLK_Set();//????
    __delay_ms(1000);
        
        //************* Start Initial Sequence **********//
        LCD_WR_REG(0x11); //Sleep out
        __delay_ms(120);              //Delay 120ms
        //************* Start Initial Sequence **********//
        LCD_WR_REG(0x36);
        if(USE_HORIZONTAL==0)LCD_WR_DATA8(0x00);
        else if(USE_HORIZONTAL==1)LCD_WR_DATA8(0xC0);
        else if(USE_HORIZONTAL==2)LCD_WR_DATA8(0x70);
        else LCD_WR_DATA8(0xA0);

        LCD_WR_REG(0x3A);
        LCD_WR_DATA8(0x05);

        LCD_WR_REG(0xB2);
        LCD_WR_DATA8(0x0C);
        LCD_WR_DATA8(0x0C);
        LCD_WR_DATA8(0x00);
        LCD_WR_DATA8(0x33);
        LCD_WR_DATA8(0x33);

        LCD_WR_REG(0xB7);
        LCD_WR_DATA8(0x35);  

        LCD_WR_REG(0xBB);
        LCD_WR_DATA8(0x19);

        LCD_WR_REG(0xC0);
        LCD_WR_DATA8(0x2C);

        LCD_WR_REG(0xC2);
        LCD_WR_DATA8(0x01);

        LCD_WR_REG(0xC3);
        LCD_WR_DATA8(0x12);   

        LCD_WR_REG(0xC4);
        LCD_WR_DATA8(0x20);  

        LCD_WR_REG(0xC6);
        LCD_WR_DATA8(0x0F);   

        LCD_WR_REG(0xD0);
        LCD_WR_DATA8(0xA4);
        LCD_WR_DATA8(0xA1);

        LCD_WR_REG(0xE0);
        LCD_WR_DATA8(0xD0);
        LCD_WR_DATA8(0x04);
        LCD_WR_DATA8(0x0D);
        LCD_WR_DATA8(0x11);
        LCD_WR_DATA8(0x13);
        LCD_WR_DATA8(0x2B);
        LCD_WR_DATA8(0x3F);
        LCD_WR_DATA8(0x54);
        LCD_WR_DATA8(0x4C);
        LCD_WR_DATA8(0x18);
        LCD_WR_DATA8(0x0D);
        LCD_WR_DATA8(0x0B);
        LCD_WR_DATA8(0x1F);
        LCD_WR_DATA8(0x23);

        LCD_WR_REG(0xE1);
        LCD_WR_DATA8(0xD0);
        LCD_WR_DATA8(0x04);
        LCD_WR_DATA8(0x0C);
        LCD_WR_DATA8(0x11);
        LCD_WR_DATA8(0x13);
        LCD_WR_DATA8(0x2C);
        LCD_WR_DATA8(0x3F);
        LCD_WR_DATA8(0x44);
        LCD_WR_DATA8(0x51);
        LCD_WR_DATA8(0x2F);
        LCD_WR_DATA8(0x1F);
        LCD_WR_DATA8(0x1F);
        LCD_WR_DATA8(0x20);
        LCD_WR_DATA8(0x23);
        LCD_WR_REG(0x21);

        LCD_WR_REG(0x29);
}

lcd.h
/* 
* File:   lcd.h
* Author: Administrator
*
* Created on August 19, 2021, 3:22 PM
*/

#ifndef __LCD_H_
#define        __LCD_H_

#ifdef        __cplusplus
extern "C" {
#endif
#include "type.h"

    //????
#define WHITE                  0xFFFF
#define BLACK                  0x0000         
#define BLUE                    0x001F  
#define BRED             0XF81F
#define GRED                          0XFFE0
#define GBLUE                         0X07FF
#define RED                    0xF800
#define MAGENTA                0xF81F
#define GREEN                  0x07E0
#define CYAN                   0x7FFF
#define YELLOW                 0xFFE0
#define BROWN                          0XBC40 //??
#define BRRED                          0XFC07 //???
#define GRAY                           0X8430 //??
#define DARKBLUE               0X01CF        //???
#define LIGHTBLUE               0X7D7C        //???  
#define GRAYBLUE                0X5458 //???
#define LIGHTGREEN              0X841F //???
#define LGRAY                          0XC618 //???(PANNEL),?????
#define LGRAYBLUE        0XA651 //????(?????)
#define LBBLUE           0X2B12 //????(???????)
   
void LCD_Fill(u16 xsta,u16 ysta,u16 xend,u16 yend,u16 color);//????????
void LCD_DrawPoint(u16 x,u16 y,u16 color);//?????????
void LCD_DrawLine(u16 x1,u16 y1,u16 x2,u16 y2,u16 color);//?????????
void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2,u16 color);//??????????
void Draw_Circle(u16 x0,u16 y0,u8 r,u16 color);//?????????

void LCD_ShowChinese(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode);//?????
void LCD_ShowChinese16x16(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode);//????16x16??
void LCD_ShowChinese24x24(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode);//????24x24??
void LCD_ShowChinese32x32(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode);//????32x32??

void LCD_ShowChar(u16 x,u16 y,u8 num,u16 fc,u16 bc,u8 sizey,u8 mode);//??????
void LCD_ShowString(u16 x,u16 y,const u8 *p,u16 fc,u16 bc,u8 sizey,u8 mode);//?????
u32 mypow(u8 m,u8 n);//??
void LCD_ShowIntNum(u16 x,u16 y,u16 num,u8 len,u16 fc,u16 bc,u8 sizey);//??????
void LCD_ShowFloatNum1(u16 x,u16 y,float num,u8 len,u16 fc,u16 bc,u8 sizey);//????????

void LCD_ShowPicture(u16 x,u16 y,u16 length,u16 width,const u8 pic[]);//????




#ifdef        __cplusplus
}
#endif

#endif        /* LCD_H */

lcd.c

#include "lcd.h"
#include "lcd_init.h"
#include "lcdfont.h"



/******************************************************************************
      ??????????????
      ?????xsta,ysta   ????
                xend,yend   ????
                                                                color       ??????
      ????  ?
******************************************************************************/
void LCD_Fill(u16 xsta,u16 ysta,u16 xend,u16 yend,u16 color)
{         
        u16 i,j;
        LCD_Address_Set(xsta,ysta,xend-1,yend-1);//??????
        for(i=ysta;i<yend;i++)
        {                                                                                                                           
                for(j=xsta;j<xend;j++)
                {
                        LCD_WR_DATA(color);
                }
        }                                                      
}

/******************************************************************************
      ????????????
      ?????x,y ????
                color ????
      ????  ?
******************************************************************************/
void LCD_DrawPoint(u16 x,u16 y,u16 color)
{
        LCD_Address_Set(x,y,x,y);//??????
        LCD_WR_DATA(color);
}


/******************************************************************************
      ???????
      ?????x1,y1   ????
                x2,y2   ????
                color   ????
      ????  ?
******************************************************************************/
void LCD_DrawLine(u16 x1,u16 y1,u16 x2,u16 y2,u16 color)
{
        u16 t;
        int xerr=0,yerr=0,delta_x,delta_y,distance;
        int incx,incy,uRow,uCol;
        delta_x=x2-x1; //??????
        delta_y=y2-y1;
        uRow=x1;//??????
        uCol=y1;
        if(delta_x>0)incx=1; //??????
        else if (delta_x==0)incx=0;//???
        else {incx=-1;delta_x=-delta_x;}
        if(delta_y>0)incy=1;
        else if (delta_y==0)incy=0;//???
        else {incy=-1;delta_y=-delta_x;}
        if(delta_x>delta_y)distance=delta_x; //?????????
        else distance=delta_y;
        for(t=0;t<distance+1;t++)
        {
                LCD_DrawPoint(uRow,uCol,color);//??
                xerr+=delta_x;
                yerr+=delta_y;
                if(xerr>distance)
                {
                        xerr-=distance;
                        uRow+=incx;
                }
                if(yerr>distance)
                {
                        yerr-=distance;
                        uCol+=incy;
                }
        }
}


/******************************************************************************
      ????????
      ?????x1,y1   ????
                x2,y2   ????
                color   ?????
      ????  ?
******************************************************************************/
void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2,u16 color)
{
        LCD_DrawLine(x1,y1,x2,y1,color);
        LCD_DrawLine(x1,y1,x1,y2,color);
        LCD_DrawLine(x1,y2,x2,y2,color);
        LCD_DrawLine(x2,y1,x2,y2,color);
}


/******************************************************************************
      ???????
      ?????x0,y0   ????
                r       ??
                color   ????
      ????  ?
******************************************************************************/
void Draw_Circle(u16 x0,u16 y0,u8 r,u16 color)
{
        int a,b;
        a=0;b=r;         
        while(a<=b)
        {
                LCD_DrawPoint(x0-b,y0-a,color);             //3           
                LCD_DrawPoint(x0+b,y0-a,color);             //0           
                LCD_DrawPoint(x0-a,y0+b,color);             //1               
                LCD_DrawPoint(x0-a,y0-b,color);             //2            
                LCD_DrawPoint(x0+b,y0+a,color);             //4               
                LCD_DrawPoint(x0+a,y0-b,color);             //5
                LCD_DrawPoint(x0+a,y0+b,color);             //6
                LCD_DrawPoint(x0-b,y0+a,color);             //7
                a++;
                if((a*a+b*b)>(r*r))//??????????
                {
                        b--;
                }
        }
}

/******************************************************************************
      ??????????
      ?????x,y????
                *s ???????
                fc ????
                bc ?????
                sizey ?? ?? 16 24 32
                mode:  0?????  1????
      ????  ?
******************************************************************************/
void LCD_ShowChinese(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode)
{
        while(*s!=0)
        {
                if(sizey==16) LCD_ShowChinese16x16(x,y,s,fc,bc,sizey,mode);
                else if(sizey==24) LCD_ShowChinese24x24(x,y,s,fc,bc,sizey,mode);
                else if(sizey==32) LCD_ShowChinese32x32(x,y,s,fc,bc,sizey,mode);
                else return;
                s+=2;
                x+=sizey;
        }
}

/******************************************************************************
      ?????????16x16??
      ?????x,y????
                *s ??????
                fc ????
                bc ?????
                sizey ??
                mode:  0?????  1????
      ????  ?
******************************************************************************/
void LCD_ShowChinese16x16(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode)
{
        u8 i,j;
        u16 k;
        u16 HZnum;//????
        u16 TypefaceNum;//??????????
        u16 x0=x;
        TypefaceNum=sizey/8*sizey;//??????????????????8??????
                                  //?????????????,??????????
        HZnum=sizeof(tfont16)/sizeof(typFNT_GB16);        //??????
        for(k=0;k<HZnum;k++)
        {
                if ((tfont16[k].Index[0]==*(s))&&(tfont16[k].Index[1]==*(s+1)))
                {         
                        LCD_Address_Set(x,y,x+sizey-1,y+sizey-1);
                        for(i=0;i<TypefaceNum;i++)
                        {
                                for(j=0;j<8;j++)
                                {        
                                        if(!mode)//?????
                                        {
                                                if(tfont16[k].Msk[i]&(0x01<<j))LCD_WR_DATA(fc);
                                                else LCD_WR_DATA(bc);
                                        }
                                        else//????
                                        {
                                                if(tfont16[k].Msk[i]&(0x01<<j))        LCD_DrawPoint(x,y,fc);//????
                                                x++;
                                                if((x-x0)==sizey)
                                                {
                                                        x=x0;
                                                        y++;
                                                        break;
                                                }
                                        }
                                }
                        }
                }                                          
                continue;  //????????????????????????????
        }
}


/******************************************************************************
      ?????????24x24??
      ?????x,y????
                *s ??????
                fc ????
                bc ?????
                sizey ??
                mode:  0?????  1????
      ????  ?
******************************************************************************/
void LCD_ShowChinese24x24(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode)
{
        u8 i,j;
        u16 k;
        u16 HZnum;//????
        u16 TypefaceNum;//??????????
        u16 x0=x;
        TypefaceNum=sizey/8*sizey;//??????????????????8??????
                                  //?????????????,??????????
        HZnum=sizeof(tfont24)/sizeof(typFNT_GB24);        //??????
        for(k=0;k<HZnum;k++)
        {
                if ((tfont24[k].Index[0]==*(s))&&(tfont24[k].Index[1]==*(s+1)))
                {         
                        LCD_Address_Set(x,y,x+sizey-1,y+sizey-1);
                        for(i=0;i<TypefaceNum;i++)
                        {
                                for(j=0;j<8;j++)
                                {        
                                        if(!mode)//?????
                                        {
                                                if(tfont24[k].Msk[i]&(0x01<<j))LCD_WR_DATA(fc);
                                                else LCD_WR_DATA(bc);
                                        }
                                        else//????
                                        {
                                                if(tfont24[k].Msk[i]&(0x01<<j))        LCD_DrawPoint(x,y,fc);//????
                                                x++;
                                                if((x-x0)==sizey)
                                                {
                                                        x=x0;
                                                        y++;
                                                        break;
                                                }
                                        }
                                }
                        }
                }                                          
                continue;  //????????????????????????????
        }
}

/******************************************************************************
      ?????????32x32??
      ?????x,y????
                *s ??????
                fc ????
                bc ?????
                sizey ??
                mode:  0?????  1????
      ????  ?
******************************************************************************/
void LCD_ShowChinese32x32(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode)
{
        u8 i,j;
        u16 k;
        u16 HZnum;//????
        u16 TypefaceNum;//??????????
        u16 x0=x;
        TypefaceNum=sizey/8*sizey;//??????????????????8??????
                                  //?????????????,??????????
        HZnum=sizeof(tfont32)/sizeof(typFNT_GB32);        //??????
        for(k=0;k<HZnum;k++)
        {
                if ((tfont32[k].Index[0]==*(s))&&(tfont32[k].Index[1]==*(s+1)))
                {         
                        LCD_Address_Set(x,y,x+sizey-1,y+sizey-1);
                        for(i=0;i<TypefaceNum;i++)
                        {
                                for(j=0;j<8;j++)
                                {        
                                        if(!mode)//?????
                                        {
                                                if(tfont32[k].Msk[i]&(0x01<<j))LCD_WR_DATA(fc);
                                                else LCD_WR_DATA(bc);
                                        }
                                        else//????
                                        {
                                                if(tfont32[k].Msk[i]&(0x01<<j))        LCD_DrawPoint(x,y,fc);//????
                                                x++;
                                                if((x-x0)==sizey)
                                                {
                                                        x=x0;
                                                        y++;
                                                        break;
                                                }
                                        }
                                }
                        }
                }                                          
                continue;  //????????????????????????????
        }
}


/******************************************************************************
      ???????????
      ?????x,y????
                num ??????
                fc ????
                bc ?????
                sizey ??
                mode:  0?????  1????
      ????  ?
******************************************************************************/
void LCD_ShowChar(u16 x,u16 y,u8 num,u16 fc,u16 bc,u8 sizey,u8 mode)
{
        u8 temp,sizex,t;
        u16 i,TypefaceNum;//??????????
        u16 x0=x;
        sizex=sizey/2;
        TypefaceNum=sizex/8*sizey;
        num=num-' ';    //???????
        LCD_Address_Set(x,y,x+sizex-1,y+sizey-1);  //??????
        for(i=0;i<TypefaceNum;i++)
        {
                if(sizey==16)temp=ascii_1608[num][i];                       //??8x16??
                else if(sizey==32)temp=ascii_3216[num][i];                 //??16x32??
                else return;
                for(t=0;t<8;t++)
                {
                        if(!mode)//?????
                        {
                                if(temp&(0x01<<t))LCD_WR_DATA(fc);
                                else LCD_WR_DATA(bc);
                        }
                        else//????
                        {
                                if(temp&(0x01<<t))LCD_DrawPoint(x,y,fc);//????
                                x++;
                                if((x-x0)==sizex)
                                {
                                        x=x0;
                                        y++;
                                        break;
                                }
                        }
                }
        }                     
}


/******************************************************************************
      ??????????
      ?????x,y????
                *p ???????
                fc ????
                bc ?????
                sizey ??
                mode:  0?????  1????
      ????  ?
******************************************************************************/
void LCD_ShowString(u16 x,u16 y,const u8 *p,u16 fc,u16 bc,u8 sizey,u8 mode)
{         
        while(*p!='\0')
        {      
                LCD_ShowChar(x,y,*p,fc,bc,sizey,mode);
                x+=sizey/2;
                p++;
        }  
}


/******************************************************************************
      ?????????
      ?????m???n??
      ????  ?
******************************************************************************/
u32 mypow(u8 m,u8 n)
{
        u32 result=1;         
        while(n--)result*=m;
        return result;
}


/******************************************************************************
      ???????????
      ?????x,y????
                num ???????
                len ??????
                fc ????
                bc ?????
                sizey ??
      ????  ?
******************************************************************************/
void LCD_ShowIntNum(u16 x,u16 y,u16 num,u8 len,u16 fc,u16 bc,u8 sizey)
{                 
        u8 t,temp;
        u8 enshow=0;
        u8 sizex=sizey/2;
        for(t=0;t<len;t++)
        {
                temp=(num/mypow(10,len-t-1))%10;
                if(enshow==0&&t<(len-1))
                {
                        if(temp==0)
                        {
                                LCD_ShowChar(x+t*sizex,y,' ',fc,bc,sizey,0);
                                continue;
                        }else enshow=1;
                          
                }
                 LCD_ShowChar(x+t*sizex,y,temp+48,fc,bc,sizey,0);
        }
}


/******************************************************************************
      ?????????????
      ?????x,y????
                num ???????
                len ??????
                fc ????
                bc ?????
                sizey ??
      ????  ?
******************************************************************************/
void LCD_ShowFloatNum1(u16 x,u16 y,float num,u8 len,u16 fc,u16 bc,u8 sizey)
{                 
        u8 t,temp,sizex;
        u16 num1;
        sizex=sizey/2;
        num1=num*100;
        for(t=0;t<len;t++)
        {
                temp=(num1/mypow(10,len-t-1))%10;
                if(t==(len-2))
                {
                        LCD_ShowChar(x+(len-2)*sizex,y,'.',fc,bc,sizey,0);
                        t++;
                        len+=1;
                }
                 LCD_ShowChar(x+t*sizex,y,temp+48,fc,bc,sizey,0);
        }
}


/******************************************************************************
      ?????????
      ?????x,y????
                length ????
                width  ????
                pic[]  ????   
      ????  ?
******************************************************************************/
void LCD_ShowPicture(u16 x,u16 y,u16 length,u16 width,const u8 pic[])
{
        u16 i,j,k=0;
        LCD_Address_Set(x,y,x+length-1,y+width-1);
        for(i=0;i<length;i++)
        {
                for(j=0;j<width;j++)
                {
                        LCD_WR_DATA8(pic[k*2]);
                        LCD_WR_DATA8(pic[k*2+1]);
                        k++;
                }
        }                        
}



数据类型的通用定义:
type.h
/* 
* File:   type.h
* Author: Administrator
*
* Created on August 19, 2021, 3:25 PM
*/

#ifndef TYPE_H
#define        TYPE_H

#ifdef        __cplusplus
extern "C" {
#endif

#include "stdint.h"

typedef int32_t  s32;
typedef int16_t s16;
typedef int8_t  s8;

typedef const int32_t sc32;  /*!< Read Only */
typedef const int16_t sc16;  /*!< Read Only */
typedef const int8_t sc8;   /*!< Read Only */

typedef uint32_t  u32;
typedef uint16_t u16;
typedef uint8_t  u8;

typedef const uint32_t uc32;  /*!< Read Only */
typedef const uint16_t uc16;  /*!< Read Only */
typedef const uint8_t uc8;   /*!< Read Only */




#ifdef        __cplusplus
}
#endif

#endif        /* TYPE_H */

在main函数里面调用:

#include "mcc_generated_files/mcc.h"
#include "LCD/lcd_init.h"
#include "LCD/lcd.h"
#include "LCD/picture.h"
/*
                         Main application
*/
void main(void)
{
    //u8 i,j;
        float t=0;//22DAY  S
    // Initialize the device
    SYSTEM_Initialize();

    // If using interrupts in PIC18 High/Low Priority Mode you need to enable the Global High and Low Interrupts
    // If using interrupts in PIC Mid-Range Compatibility Mode you need to enable the Global Interrupts
    // Use the following macros to:

    // Enable the Global Interrupts
    //INTERRUPT_GlobalInterruptEnable();

    // Disable the Global Interrupts
    //INTERRUPT_GlobalInterruptDisable();
        LCD_Init();//LCD???
        LCD_Fill(0,0,LCD_W,LCD_H,WHITE);
    //LCD_ShowPicture(0,0,89,80,gImage_ZQ3);//89*80
    //while(1){}
    while (1)
    {
        // Add your application code
        LCD_ShowChinese(50,0,"中秋快乐",RED,WHITE,32,0);
        LCD_ShowString(0,40,"HappyMid-Autumn",RED,WHITE,32,0);
        
        LCD_ShowString(0,80+16,"Increaseing Nun:",RED,WHITE,16,0);
                LCD_ShowFloatNum1(128,80+16,t,5,RED,WHITE,16);
        t+=0.1;

        LCD_ShowPicture(31,120+16,89,80,gImage_ZQ3);//89*80
        LCD_ShowPicture(121,120+16,89,80,gImage_ZQ3);//89*80
    }
}
/**
End of File
*/
这里载入了一个很小的“中秋快乐”的小图片~

下载,查看:


好了,驱动SPI屏幕就到这了~




使用特权

评论回复
沙发
kkzz| | 2021-9-1 16:33 | 只看该作者
ST7789V初始化代码真复杂。   

使用特权

评论回复
板凳
hudi008| | 2021-9-1 16:34 | 只看该作者
SPI接口的TFT屏ILI9341代码有吗   

使用特权

评论回复
地板
lzmm| | 2021-9-1 16:34 | 只看该作者
LCD尺寸有比较大的吗

使用特权

评论回复
5
minzisc| | 2021-9-1 16:35 | 只看该作者
通过SPI接口实现对屏幕的驱动

使用特权

评论回复
6
selongli| | 2021-9-1 16:35 | 只看该作者
ILI9341 SPI接口的屏幕很好用,有30帧/s

使用特权

评论回复
7
fentianyou| | 2021-9-1 16:35 | 只看该作者
显示屏的驱动代码一般商家会提供一个Demo  

使用特权

评论回复
8
xiaoyaodz| | 2021-9-1 16:36 | 只看该作者
用过4线SPI模式点OLED   

使用特权

评论回复
9
febgxu| | 2021-9-1 16:36 | 只看该作者
现在是采用IO口来模拟SPI

使用特权

评论回复
10
sdlls| | 2021-9-1 16:37 | 只看该作者
大多数还是TFT屏幕。  

使用特权

评论回复
11
pixhw| | 2021-9-1 16:37 | 只看该作者
分享一点spi屏幕相关软件和工具吧   

使用特权

评论回复
12
febgxu| | 2021-9-1 16:38 | 只看该作者
可以硬件spi驱动吗?   

使用特权

评论回复
13
hudi008| | 2021-9-1 16:38 | 只看该作者
如何 连接SPI接口TFT屏幕  

使用特权

评论回复
14
xiaoyaodz| | 2021-9-1 16:38 | 只看该作者
这个多彩的oled没有用过呢。   

使用特权

评论回复
15
lzmm| | 2021-9-1 16:38 | 只看该作者
可以支持多大的lcd呢   

使用特权

评论回复
16
fentianyou| | 2021-9-1 16:38 | 只看该作者
在开发板上驱动液晶屏  

使用特权

评论回复
17
minzisc| | 2021-9-1 16:38 | 只看该作者
内存是多大呢?   

使用特权

评论回复
18
selongli| | 2021-9-1 16:38 | 只看该作者
ST7789可以到多少帧呢?   

使用特权

评论回复
19
kkzz| | 2021-9-1 16:38 | 只看该作者
ST7789V控制器的LCD屏

使用特权

评论回复
20
pixhw| | 2021-9-1 16:38 | 只看该作者
最近在做lcd的选型呢。   

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

111

主题

627

帖子

2

粉丝