TLLED 发表于 2024-12-3 08:54:23

【Avnet | NXP FRDM-MCXN947试用活动】硬件SPI驱动LCD显示屏

测试SPI驱动LCD显示屏。


一、硬件部分


1.1、硬件SPI接口部分
使用FC1接口的SPI,对应的电路图部分



1.2、测试的LCD显示模块



接口定义



二、程序部分


2.1、LCD接口硬件配置


2.1.1、SPI引脚配置



2.1.2、控制引脚配置



2.2、SPI初始化部分
spi.c
#include "main.h"

void init_spi(void)
{
      uint32_t srcClock_Hz;
      lpspi_master_config_t masterConfig;
      edma_config_t userConfig = {0};
      /* attach FRO 12M to FLEXCOMM1 */
      CLOCK_SetClkDiv(kCLOCK_DivFlexcom1Clk, 1u);
      CLOCK_AttachClk(kFRO12M_to_FLEXCOMM1);
      
      init_spi1_pins();
      
      /*Master config*/
      LPSPI_MasterGetDefaultConfig(&masterConfig);
      masterConfig.baudRate = TRANSFER_BAUDRATE;
      masterConfig.whichPcs = EXAMPLE_LPSPI_MASTER_PCS_FOR_INIT;
      masterConfig.pcsToSckDelayInNanoSec      = 1000000000U / (masterConfig.baudRate * 2U);
      masterConfig.lastSckToPcsDelayInNanoSec    = 1000000000U / (masterConfig.baudRate * 2U);
      masterConfig.betweenTransferDelayInNanoSec = 1000000000U / (masterConfig.baudRate * 2U);

      srcClock_Hz = LPSPI_MASTER_CLK_FREQ;
      LPSPI_MasterInit(EXAMPLE_LPSPI_MASTER_BASEADDR, &masterConfig, srcClock_Hz);
}
uint8_t spi1_writedat(uint8_t dat)
{
      uint8_t srcBuff;
      uint8_t destBuff;
      srcBuff=dat;
      lpspi_transfer_t masterXfer;
//                /*Start master transfer*/
      masterXfer.txData   = srcBuff;//masterTxData;
      masterXfer.rxData   = destBuff;
      masterXfer.dataSize = 1;
      masterXfer.configFlags =
            EXAMPLE_LPSPI_MASTER_PCS_FOR_TRANSFER | kLPSPI_MasterPcsContinuous | kLPSPI_MasterByteSwap;
      LPSPI_MasterTransferBlocking(EXAMPLE_LPSPI_MASTER_BASEADDR, &masterXfer);
      return destBuff;
}


spi.h
#ifndef __SPI_H
#define __SPI_H

#define LPSPI_MASTER_CLK_FREQ               CLOCK_GetLPFlexCommClkFreq(1u)
#define EXAMPLE_LPSPI_MASTER_BASEADDR         (LPSPI1)
#define EXAMPLE_LPSPI_MASTER_PCS_FOR_INIT   (kLPSPI_Pcs0)
#define EXAMPLE_LPSPI_MASTER_PCS_FOR_TRANSFER (kLPSPI_MasterPcs0)
#define EXAMPLE_LPSPI_MASTER_DMA_BASE         DMA0
#define EXAMPLE_LPSPI_MASTER_DMA_RX_CHANNEL   0U
#define EXAMPLE_LPSPI_MASTER_DMA_TX_CHANNEL   1U
#define DEMO_LPSPI_TRANSMIT_EDMA_CHANNEL      kDmaRequestMuxLpFlexcomm1Tx
#define DEMO_LPSPI_RECEIVE_EDMA_CHANNEL       kDmaRequestMuxLpFlexcomm1Rx
#define TRANSFER_SIZE   64U      
#define TRANSFER_BAUDRATE 50000000U

void init_spi(void);
uint8_t spi1_writedat(uint8_t dat);

#endif


2.2、lcd驱动程序
lcd_init.c
#include "main.h"

void LCD_GPIO_Init(void)
{
      gpio_pin_config_t spilcd_config = {
                kGPIO_DigitalOutput,
                0,
};
      
      CLOCK_EnableClock(kCLOCK_Gpio1);
      init_spi_lcd_pins();
      GPIO_PinInit(LCD_RES_GPIO, LCD_RES_GPIO_PIN, &spilcd_config);
GPIO_PinInit(LCD_DC_GPIO, LCD_DC_GPIO_PIN, &spilcd_config);
GPIO_PinInit(LCD_CS_GPIO, LCD_CS_GPIO_PIN, &spilcd_config);
}

void LCD_Writ_Bus(uint8_t dat)
{      
      uint8_t i;
      LCD_CS_Clr();
      spi1_writedat(dat);
LCD_CS_Set();      
}

void LCD_WR_DATA8(uint8_t dat)
{
      LCD_Writ_Bus(dat);
}

void LCD_WR_DATA(uint16_t dat)
{
      LCD_Writ_Bus(dat>>8);
      LCD_Writ_Bus(dat);
}

void LCD_WR_REG(uint8_t dat)
{
      LCD_DC_Clr();//写命令
      LCD_Writ_Bus(dat);
      LCD_DC_Set();//写数据
}

void LCD_Address_Set(uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2)
{
      if(USE_HORIZONTAL==0)
      {
                LCD_WR_REG(0x2a);//列地址设置
                LCD_WR_DATA(x1+2);
                LCD_WR_DATA(x2+2);
                LCD_WR_REG(0x2b);//行地址设置
                LCD_WR_DATA(y1+1);
                LCD_WR_DATA(y2+1);
                LCD_WR_REG(0x2c);//储存器写
      }
      else if(USE_HORIZONTAL==1)
      {
                LCD_WR_REG(0x2a);//列地址设置
                LCD_WR_DATA(x1+2);
                LCD_WR_DATA(x2+2);
                LCD_WR_REG(0x2b);//行地址设置
                LCD_WR_DATA(y1+1);
                LCD_WR_DATA(y2+1);
                LCD_WR_REG(0x2c);//储存器写
      }
      else if(USE_HORIZONTAL==2)
      {
                LCD_WR_REG(0x2a);//列地址设置
                LCD_WR_DATA(x1+1);
                LCD_WR_DATA(x2+1);
                LCD_WR_REG(0x2b);//行地址设置
                LCD_WR_DATA(y1+2);
                LCD_WR_DATA(y2+2);
                LCD_WR_REG(0x2c);//储存器写
      }
      else
      {
                LCD_WR_REG(0x2a);//列地址设置
                LCD_WR_DATA(x1+1);
                LCD_WR_DATA(x2+1);
                LCD_WR_REG(0x2b);//行地址设置
                LCD_WR_DATA(y1+2);
                LCD_WR_DATA(y2+2);
                LCD_WR_REG(0x2c);//储存器写
      }
}

void LCD_Init(void)
{
      
      
      LCD_GPIO_Init();//初始化GPIO
      
      LCD_RES_Clr();//复位
      SysTick_Delay_ms(100);
      LCD_RES_Set();
      SysTick_Delay_ms(100);
      
      //LCD_BLK_Set();//打开背光
SysTick_Delay_ms(100);
      
      //************* Start Initial Sequence **********//
      LCD_WR_REG(0x11); //Sleep out
      SysTick_Delay_ms(120);            //Delay 120ms
      //------------------------------------ST7735S Frame Rate-----------------------------------------//
      LCD_WR_REG(0xB1);
      LCD_WR_DATA8(0x05);
      LCD_WR_DATA8(0x3C);
      LCD_WR_DATA8(0x3C);
      LCD_WR_REG(0xB2);
      LCD_WR_DATA8(0x05);
      LCD_WR_DATA8(0x3C);
      LCD_WR_DATA8(0x3C);
      LCD_WR_REG(0xB3);
      LCD_WR_DATA8(0x05);
      LCD_WR_DATA8(0x3C);
      LCD_WR_DATA8(0x3C);
      LCD_WR_DATA8(0x05);
      LCD_WR_DATA8(0x3C);
      LCD_WR_DATA8(0x3C);
      //------------------------------------End ST7735S Frame Rate---------------------------------//
      LCD_WR_REG(0xB4); //Dot inversion
      LCD_WR_DATA8(0x03);
      //------------------------------------ST7735S Power Sequence---------------------------------//
      LCD_WR_REG(0xC0);
      LCD_WR_DATA8(0x28);
      LCD_WR_DATA8(0x08);
      LCD_WR_DATA8(0x04);
      LCD_WR_REG(0xC1);
      LCD_WR_DATA8(0XC0);
      LCD_WR_REG(0xC2);
      LCD_WR_DATA8(0x0D);
      LCD_WR_DATA8(0x00);
      LCD_WR_REG(0xC3);
      LCD_WR_DATA8(0x8D);
      LCD_WR_DATA8(0x2A);
      LCD_WR_REG(0xC4);
      LCD_WR_DATA8(0x8D);
      LCD_WR_DATA8(0xEE);
      //---------------------------------End ST7735S Power Sequence-------------------------------------//
      LCD_WR_REG(0xC5); //VCOM
      LCD_WR_DATA8(0x1A);
      LCD_WR_REG(0x36); //MX, MY, RGB mode
      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);
      //------------------------------------ST7735S Gamma Sequence---------------------------------//
      LCD_WR_REG(0xE0);
      LCD_WR_DATA8(0x04);
      LCD_WR_DATA8(0x22);
      LCD_WR_DATA8(0x07);
      LCD_WR_DATA8(0x0A);
      LCD_WR_DATA8(0x2E);
      LCD_WR_DATA8(0x30);
      LCD_WR_DATA8(0x25);
      LCD_WR_DATA8(0x2A);
      LCD_WR_DATA8(0x28);
      LCD_WR_DATA8(0x26);
      LCD_WR_DATA8(0x2E);
      LCD_WR_DATA8(0x3A);
      LCD_WR_DATA8(0x00);
      LCD_WR_DATA8(0x01);
      LCD_WR_DATA8(0x03);
      LCD_WR_DATA8(0x13);
      LCD_WR_REG(0xE1);
      LCD_WR_DATA8(0x04);
      LCD_WR_DATA8(0x16);
      LCD_WR_DATA8(0x06);
      LCD_WR_DATA8(0x0D);
      LCD_WR_DATA8(0x2D);
      LCD_WR_DATA8(0x26);
      LCD_WR_DATA8(0x23);
      LCD_WR_DATA8(0x27);
      LCD_WR_DATA8(0x27);
      LCD_WR_DATA8(0x25);
      LCD_WR_DATA8(0x2D);
      LCD_WR_DATA8(0x3B);
      LCD_WR_DATA8(0x00);
      LCD_WR_DATA8(0x01);
      LCD_WR_DATA8(0x04);
      LCD_WR_DATA8(0x13);
      //------------------------------------End ST7735S Gamma Sequence-----------------------------//
      LCD_WR_REG(0x3A); //65k mode
      LCD_WR_DATA8(0x05);
      LCD_WR_REG(0x29); //Display on
}



lcd.c
#include "main.h"
#include "spilcd/lcdfont.h"

void LCD_Fill(uint16_t xsta,uint16_t ysta,uint16_t xend,uint16_t yend,uint16_t color)
{         
      uint16_t 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);
                }
      }                                                      
}

void LCD_DrawPoint(uint16_t x,uint16_t y,uint16_t color)
{
      LCD_Address_Set(x,y,x,y);
      LCD_WR_DATA(color);
}

void LCD_DrawLine(uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2,uint16_t color)
{
      uint16_t 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_y;}
      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;
                }
      }
}

void LCD_DrawRectangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2,uint16_t 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);
}

void Draw_Circle(uint16_t x0,uint16_t y0,uint8_t r,uint16_t 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--;
                }
      }
}

void LCD_ShowChinese(uint16_t x,uint16_t y,uint8_t *s,uint16_t fc,uint16_t bc,uint8_t sizey,uint8_t mode)
{
      while(*s!=0)
      {
                if(sizey==12) LCD_ShowChinese12x12(x,y,s,fc,bc,sizey,mode);
                else 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;
      }
}

void LCD_ShowChinese12x12(uint16_t x,uint16_t y,uint8_t *s,uint16_t fc,uint16_t bc,uint8_t sizey,uint8_t mode)
{
      uint8_t i,j,m=0;
      uint16_t k;
      uint16_t HZnum;//汉字数目
      uint16_t TypefaceNum;//一个字符所占字节大小
      uint16_t x0=x;
      TypefaceNum=(sizey/8+((sizey%8)?1:0))*sizey;
                                 
      HZnum=sizeof(tfont12)/sizeof(typFNT_GB12);      //统计汉字数目
      for(k=0;k<HZnum;k++)
      {
                if((tfont12.Index==*(s))&&(tfont12.Index==*(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(tfont12.Msk&(0x01<<j))LCD_WR_DATA(fc);
                                                else LCD_WR_DATA(bc);
                                                m++;
                                                if(m%sizey==0)
                                                {
                                                      m=0;
                                                      break;
                                                }
                                        }
                                        else//叠加方式
                                        {
                                                if(tfont12.Msk&(0x01<<j))      LCD_DrawPoint(x,y,fc);//画一个点
                                                x++;
                                                if((x-x0)==sizey)
                                                {
                                                      x=x0;
                                                      y++;
                                                      break;
                                                }
                                        }
                              }
                        }
                }                                          
                continue;//查找到对应点阵字库立即退出,防止多个汉字重复取模带来影响
      }
}

void LCD_ShowChinese16x16(uint16_t x,uint16_t y,uint8_t *s,uint16_t fc,uint16_t bc,uint8_t sizey,uint8_t mode)
{
      uint8_t i,j,m=0;
      uint16_t k;
      uint16_t HZnum;//汉字数目
      uint16_t TypefaceNum;//一个字符所占字节大小
      uint16_t x0=x;
TypefaceNum=(sizey/8+((sizey%8)?1:0))*sizey;
      HZnum=sizeof(tfont16)/sizeof(typFNT_GB16);      //统计汉字数目
      for(k=0;k<HZnum;k++)
      {
                if ((tfont16.Index==*(s))&&(tfont16.Index==*(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.Msk&(0x01<<j))LCD_WR_DATA(fc);
                                                else LCD_WR_DATA(bc);
                                                m++;
                                                if(m%sizey==0)
                                                {
                                                      m=0;
                                                      break;
                                                }
                                        }
                                        else//叠加方式
                                        {
                                                if(tfont16.Msk&(0x01<<j))      LCD_DrawPoint(x,y,fc);//画一个点
                                                x++;
                                                if((x-x0)==sizey)
                                                {
                                                      x=x0;
                                                      y++;
                                                      break;
                                                }
                                        }
                              }
                        }
                }                                          
                continue;//查找到对应点阵字库立即退出,防止多个汉字重复取模带来影响
      }
}

void LCD_ShowChinese24x24(uint16_t x,uint16_t y,uint8_t *s,uint16_t fc,uint16_t bc,uint8_t sizey,uint8_t mode)
{
      uint8_t i,j,m=0;
      uint16_t k;
      uint16_t HZnum;//汉字数目
      uint16_t TypefaceNum;//一个字符所占字节大小
      uint16_t x0=x;
      TypefaceNum=(sizey/8+((sizey%8)?1:0))*sizey;
      HZnum=sizeof(tfont24)/sizeof(typFNT_GB24);      //统计汉字数目
      for(k=0;k<HZnum;k++)
      {
                if ((tfont24.Index==*(s))&&(tfont24.Index==*(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.Msk&(0x01<<j))LCD_WR_DATA(fc);
                                                else LCD_WR_DATA(bc);
                                                m++;
                                                if(m%sizey==0)
                                                {
                                                      m=0;
                                                      break;
                                                }
                                        }
                                        else//叠加方式
                                        {
                                                if(tfont24.Msk&(0x01<<j))      LCD_DrawPoint(x,y,fc);//画一个点
                                                x++;
                                                if((x-x0)==sizey)
                                                {
                                                      x=x0;
                                                      y++;
                                                      break;
                                                }
                                        }
                              }
                        }
                }                                          
                continue;//查找到对应点阵字库立即退出,防止多个汉字重复取模带来影响
      }
}

void LCD_ShowChinese32x32(uint16_t x,uint16_t y,uint8_t *s,uint16_t fc,uint16_t bc,uint8_t sizey,uint8_t mode)
{
      uint8_t i,j,m=0;
      uint16_t k;
      uint16_t HZnum;//汉字数目
      uint16_t TypefaceNum;//一个字符所占字节大小
      uint16_t x0=x;
      TypefaceNum=(sizey/8+((sizey%8)?1:0))*sizey;
      HZnum=sizeof(tfont32)/sizeof(typFNT_GB32);      //统计汉字数目
      for(k=0;k<HZnum;k++)
      {
                if ((tfont32.Index==*(s))&&(tfont32.Index==*(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.Msk&(0x01<<j))LCD_WR_DATA(fc);
                                                else LCD_WR_DATA(bc);
                                                m++;
                                                if(m%sizey==0)
                                                {
                                                      m=0;
                                                      break;
                                                }
                                        }
                                        else//叠加方式
                                        {
                                                if(tfont32.Msk&(0x01<<j))      LCD_DrawPoint(x,y,fc);//画一个点
                                                x++;
                                                if((x-x0)==sizey)
                                                {
                                                      x=x0;
                                                      y++;
                                                      break;
                                                }
                                        }
                              }
                        }
                }                                          
                continue;//查找到对应点阵字库立即退出,防止多个汉字重复取模带来影响
      }
}

void LCD_ShowChar(uint16_t x,uint16_t y,uint8_t num,uint16_t fc,uint16_t bc,uint8_t sizey,uint8_t mode)
{
      uint8_t temp,sizex,t,m=0;
      uint16_t i,TypefaceNum;//一个字符所占字节大小
      uint16_t x0=x;
      sizex=sizey/2;
      TypefaceNum=(sizex/8+((sizex%8)?1:0))*sizey;
      num=num-' ';    //得到偏移后的值
      LCD_Address_Set(x,y,x+sizex-1,y+sizey-1);//设置光标位置
      for(i=0;i<TypefaceNum;i++)
      {
                if(sizey==12)temp=ascii_1206;                     //调用6x12字体
                else if(sizey==16)temp=ascii_1608;               //调用8x16字体
                else if(sizey==24)temp=ascii_2412;               //调用12x24字体
                else if(sizey==32)temp=ascii_3216;               //调用16x32字体
                else return;
                for(t=0;t<8;t++)
                {
                        if(!mode)//非叠加模式
                        {
                              if(temp&(0x01<<t))LCD_WR_DATA(fc);
                              else LCD_WR_DATA(bc);
                              m++;
                              if(m%sizex==0)
                              {
                                        m=0;
                                        break;
                              }
                        }
                        else//叠加模式
                        {
                              if(temp&(0x01<<t))LCD_DrawPoint(x,y,fc);//画一个点
                              x++;
                              if((x-x0)==sizex)
                              {
                                        x=x0;
                                        y++;
                                        break;
                              }
                        }
                }
      }                     
}

void LCD_ShowString(uint16_t x,uint16_t y,const uint8_t *p,uint16_t fc,uint16_t bc,uint8_t sizey,uint8_t mode)
{         
      while(*p!='\0')
      {      
                LCD_ShowChar(x,y,*p,fc,bc,sizey,mode);
                x+=sizey/2;
                p++;
      }
}

uint32_t mypow(uint8_t m,uint8_t n)
{
      uint32_t result=1;         
      while(n--)result*=m;
      return result;
}

void LCD_ShowIntNum(uint16_t x,uint16_t y,uint16_t num,uint8_t len,uint16_t fc,uint16_t bc,uint8_t sizey)
{               
      uint8_t t,temp;
      uint8_t enshow=0;
      uint8_t 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);
      }
}

void LCD_ShowFloatNum1(uint16_t x,uint16_t y,float num,uint8_t len,uint16_t fc,uint16_t bc,uint8_t sizey)
{               
      uint8_t t,temp,sizex;
      uint16_t 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);
      }
}

void LCD_ShowPicture(uint16_t x,uint16_t y,uint16_t length,uint16_t width,const uint8_t pic[])
{
      uint16_t i,j;
      uint32_t 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);
                        LCD_WR_DATA8(pic);
                        k++;
                }
      }                        
}




2.3、main.c
#include "main.h"

int main(void)
{
      uint8_t i;

CLOCK_EnableClock(kCLOCK_Gpio0);

      BOARD_InitDEBUG_UARTPins();
      BOARD_PowerMode_OD();
      BOARD_InitBootClocks();
      BOARD_InitDebugConsole();

      SysTick_Init();
      init_led();
      init_spi();
      LCD_Init();//LCD初始化
      
      LCD_Fill(0,0,LCD_W,LCD_H,WHITE);
      
      LCD_ShowChinese(16,1,"与非网论坛",RED,WHITE,16,0);
      LCD_DrawLine(0,18,128,18,BLUE);
      LCD_ShowString(0,19,"IC:MCXN947",RED,WHITE,16,0);
      LCD_ShowString(0,36,"LCD:ST7735",GREEN,WHITE,16,0);
      LCD_ShowString(0,52,"MODE:SPI",BLUE,WHITE,16,0);

      while (1)
      {
                i++;
                SysTick_Delay_ms(100);
                LCD_ShowIntNum(0,78,i,3,BLUE,WHITE,16);
                led_green_tog();
      }
}


三、程序运行

程序运行结果


stm1024 发表于 2024-12-3 20:45:23

支持一下大佬~~
页: [1]
查看完整版本: 【Avnet | NXP FRDM-MCXN947试用活动】硬件SPI驱动LCD显示屏