打印
[方案相关]

华大HC32F460 SPI 驱动 ST7735S LCD显示器

[复制链接]
1659|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
STM32改HC32F460 换芯片后发现SPI硬件驱动不了屏了,这个小问题搞了很久,最后用逻辑分析仪,分析时序,然后解决了,解决方案就是SPI发送一个字节数据后加硬件延时.CPU和LCD硬件连接

使用特权

评论回复
沙发
等你下课|  楼主 | 2022-11-16 23:10 | 只看该作者
ST77735S 时序

使用特权

评论回复
板凳
等你下课|  楼主 | 2022-11-16 23:17 | 只看该作者

4线SPI写入时序

使用特权

评论回复
地板
等你下课|  楼主 | 2022-11-16 23:18 | 只看该作者
GPIO模拟SPI逻辑分析仪时序数据 时序没有问题

使用特权

评论回复
5
等你下课|  楼主 | 2022-11-16 23:20 | 只看该作者
第一次测量硬件SPI出出错的时序数据 时序错误

使用特权

评论回复
6
等你下课|  楼主 | 2022-11-16 23:23 | 只看该作者
正常使用的硬件SPI时序

使用特权

评论回复
7
等你下课|  楼主 | 2022-11-16 23:25 | 只看该作者
注意事项: SPI时钟用的是Pclk1时钟,我主频是200MHz Pclk1 是100MHz ,SPI 8分频 后是12.5MHz,

和下面代码中的发送后硬件延时有很大关系.

#define  LCD_WD(dat)           SPI_SendData8(SPI_UNIT, dat);delay(50);
1
/**************头文件引用******************/
#include "inc.h"

//#include "DEV_LCDFONT.h"
//#include "DEV_PIC.h"

//模块名称
//管脚定义
/*
*                LCD_RES        PA07                                        //SPI1_MISO复位               
*                LCD_A0        PB00                                        //
*                LCD_SI        PB01 (MOSI)                SPI1_MOSI
*                LCD_SCL        PB02 (SCLK)                SPI1_SCK
*                LCD_CS        PB10                                                SPI1_SS0

1--2
SPI1_MOSI
SPI1_MISO
SPI1_SS0
SPI1_SCK
*/
//SPI1

#define LCD_SPI1_ON
//#define LCD_SPI1_OFF



//模块功能
#define USE_HORIZONTAL 2  //设置横屏或者竖屏显示 0或1为竖屏 2或3为横屏


#if USE_HORIZONTAL==0||USE_HORIZONTAL==1
#define LCD_W 128
#define LCD_H 160

#else
#define LCD_W 160
#define LCD_H 128
#endif

#ifdef LCD_SPI1_OFF       

#define SPI_LCD_SCL PortB,Pin02
#define SPI_LCD_SI         PortB,Pin01
#define SPI_LCD_CS         PortB,Pin10
#define SPI_LCD_A0  PortB,Pin00
#define SPI_LCD_RES PortA,Pin07

typedef enum
{
        LCD_RES,
        LCD_A0,
        LCD_SI,
        LCD_SCL,
        LCD_CS,
        LCD_ALL
}LCD_TYPE;

GPIO_STRUCT LCD_GPIO[LCD_ALL]=
{
        SPI_LCD_RES,Pin_Mode_Out,0,//LCD_RES
        SPI_LCD_A0,Pin_Mode_Out,0,//LCD_A0
        SPI_LCD_SI,Pin_Mode_Out,0,//LCD_SI
        SPI_LCD_SCL,Pin_Mode_Out,0,//LCD_SCL        
        SPI_LCD_CS,Pin_Mode_Out,0  //LCD_CS
};

//-----------------LCD端口定义----------------

#define LCD_SCLK_Clr() PORT_ResetBits(SPI_LCD_SCL)//SCL=SCLK
#define LCD_SCLK_Set() PORT_SetBits(SPI_LCD_SCL)

#define LCD_MOSI_Clr() PORT_ResetBits(SPI_LCD_SI)//SDA=MOSI
#define LCD_MOSI_Set() PORT_SetBits(SPI_LCD_SI)

#define LCD_RES_Clr()  PORT_ResetBits(SPI_LCD_RES)//RES
#define LCD_RES_Set()  PORT_SetBits(SPI_LCD_RES)

#define LCD_DC_Clr()   PORT_ResetBits(SPI_LCD_A0)//DC
#define LCD_DC_Set()   PORT_SetBits(SPI_LCD_A0)
                     
#define LCD_CS_Clr()   PORT_ResetBits(SPI_LCD_CS)//CS
#define LCD_CS_Set()   PORT_SetBits(SPI_LCD_CS)

#endif       



#ifdef LCD_SPI1_ON

#define SPI_LCD_SCL PortB,Pin02
#define SPI_LCD_SI         PortB,Pin01
#define SPI_LCD_CS         PortB,Pin10
#define SPI_LCD_A0  PortB,Pin00
#define SPI_LCD_RES PortA,Pin07

#define SPI_SCK_PORT                    (PortB)//(PortB)
#define SPI_SCK_PIN                     (Pin02)//(Pin02)
#define SPI_SCK_FUNC                    (Func_Spi1_Sck)

/* SPI_MOSI Port/Pin definition */
#define SPI_MOSI_PORT                   (PortB)//(PortB)
#define SPI_MOSI_PIN                    (Pin01)//(Pin01)
#define SPI_MOSI_FUNC                   (Func_Spi1_Mosi)

#define SPI_UNIT                        (M4_SPI1)
#define SPI_UNIT_CLOCK                  (PWC_FCG1_PERIPH_SPI1)

#define SPI_MASTER_MODE

typedef enum
{
        LCD_RES,
        LCD_A0,
        LCD_CS,
        LCD_ALL
}LCD_TYPE;

GPIO_STRUCT LCD_GPIO[LCD_ALL]=
{
        SPI_LCD_RES,Pin_Mode_Out,0,//LCD_RES
        SPI_LCD_A0,Pin_Mode_Out,0,//LCD_A0
        SPI_LCD_CS,Pin_Mode_Out,0  //LCD_CS
};


#define LCD_RES_Clr()  PORT_ResetBits(SPI_LCD_RES)//RES
#define LCD_RES_Set()  PORT_SetBits(SPI_LCD_RES)

#define LCD_DC_Clr()   PORT_ResetBits(SPI_LCD_A0)//DC
#define LCD_DC_Set()   PORT_SetBits(SPI_LCD_A0)
                     
#define LCD_CS_Clr()   PORT_ResetBits(SPI_LCD_CS)//CS
#define LCD_CS_Set()   PORT_SetBits(SPI_LCD_CS)


static void Spi_Config(void)
{
    stc_spi_init_t stcSpiInit;

    /* configuration structure initialization */
    MEM_ZERO_STRUCT(stcSpiInit);

    /* Configuration peripheral clock */
    PWC_Fcg1PeriphClockCmd(SPI_UNIT_CLOCK, Enable);

    /* Configuration SPI pin */
    PORT_SetFunc(SPI_SCK_PORT, SPI_SCK_PIN, SPI_SCK_FUNC, Disable);
    PORT_SetFunc(SPI_MOSI_PORT, SPI_MOSI_PIN, SPI_MOSI_FUNC, Disable);

    /* Configuration SPI structure */
    stcSpiInit.enClkDiv = SpiClkDiv8;
    stcSpiInit.enFrameNumber = SpiFrameNumber1;
    stcSpiInit.enDataLength = SpiDataLengthBit8;
    stcSpiInit.enFirstBitPosition = SpiFirstBitPositionMSB;
    stcSpiInit.enSckPolarity = SpiSckIdleLevelHigh;//空闲时是高电平
    stcSpiInit.enSckPhase = SpiSckOddChangeEvenSample;
    stcSpiInit.enReadBufferObject = SpiReadReceiverBuffer;
    stcSpiInit.enWorkMode = SpiWorkMode3Line;
    stcSpiInit.enTransMode = SpiTransFullDuplex;
    stcSpiInit.enCommAutoSuspendEn = Disable;
    stcSpiInit.enModeFaultErrorDetectEn = Disable;
    stcSpiInit.enParitySelfDetectEn = Disable;
    stcSpiInit.enParityEn = Disable;
    stcSpiInit.enParity = SpiParityEven;

#ifdef SPI_MASTER_MODE
    stcSpiInit.enMasterSlaveMode = SpiModeMaster;
    stcSpiInit.stcDelayConfig.enSsSetupDelayOption = SpiSsSetupDelayCustomValue;
    stcSpiInit.stcDelayConfig.enSsSetupDelayTime = SpiSsSetupDelaySck1;
    stcSpiInit.stcDelayConfig.enSsHoldDelayOption = SpiSsHoldDelayCustomValue;
    stcSpiInit.stcDelayConfig.enSsHoldDelayTime = SpiSsHoldDelaySck1;
    stcSpiInit.stcDelayConfig.enSsIntervalTimeOption = SpiSsIntervalCustomValue;
    stcSpiInit.stcDelayConfig.enSsIntervalTime = SpiSsIntervalSck6PlusPck2;
#endif

#ifdef SPI_SLAVE_MODE
    stcSpiInit.enMasterSlaveMode = SpiModeSlave;
#endif

    SPI_Init(SPI_UNIT, &stcSpiInit);
    SPI_Cmd(SPI_UNIT, Enable);
}

#endif


/******************************************************************************
      函数说明:LCD串行数据写入函数
      入口数据:dat  要写入的串行数据
      返回值:  无
******************************************************************************/
#ifdef LCD_SPI1_OFF       
void LCD_Writ_Bus(u8 dat)
{       
        u8 i;
        LCD_CS_Clr();
        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_CS_Set();       
}

#endif




#ifdef LCD_SPI1_ON

void delay(int t)
{
        while(t--);
}

#define  LCD_WD(dat)           SPI_SendData8(SPI_UNIT, dat);delay(50);

#endif


               

/******************************************************************************
      函数说明:LCD写入数据
      入口数据:dat 写入的数据
      返回值:  无
******************************************************************************/
void LCD_WR_DATA8(u8 dat)
{
        LCD_WD(dat);
}

/******************************************************************************
      函数说明:LCD写入数据
      入口数据:dat 写入的数据
      返回值:  无
******************************************************************************/
void LCD_WR_DATA(u16 dat)
{
        LCD_WD(dat>>8);
        LCD_WD(dat);
}

//功能模块初始化
void DEV_LCD_Init(void)
{
        for(int i =LCD_RES;i <= LCD_CS;i++)
        {
                rxm_w(DEV_GPIO,&LCD_GPIO[i],NULL);
        }
}

/******************************************************************************
      函数说明:LCD写入命令
      入口数据:dat 写入的命令
      返回值:  无
******************************************************************************/
void LCD_WR_REG(u8 dat)
{
        LCD_DC_Clr();//写命令
        LCD_WR_DATA8(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+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 delay_ms(u16 time)
{
        Ddl_Delay1ms(time);
}

void LCD_BLK_Set(void)
{
        rxm_io(DEV_OUTPUT,BLED,1);
}


void LCD_Init(void)
{
        DEV_LCD_Init();//初始化GPIO
       
#ifdef LCD_SPI1_ON
                        Spi_Config();                //SPI初始化
#endif       

       
        LCD_RES_Clr();//复位
        delay_ms(100);
        LCD_RES_Set();
        delay_ms(100);
        LCD_BLK_Set();        //打开背光
  delay_ms(100);
        LCD_CS_Clr();
       
        //************* Start Initial Sequence **********//
        LCD_WR_REG(0x11); //Sleep out
        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
}

///******************************************************************************
//      函数说明:在指定区域填充颜色
//      入口数据: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_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;
//                }
//        }
//}

///******************************************************************************
//      函数说明:画矩形
//      入口数据: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--;
//                }
//        }
//}

//void LCD_ShowChinese12x12(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode);//显示单个12x12汉字
//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汉字

///******************************************************************************
//      函数说明:显示汉字串
//      入口数据: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==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;
//        }
//}

///******************************************************************************
//      函数说明:显示单个12x12汉字
//      入口数据:x,y显示坐标
//                *s 要显示的汉字
//                fc 字的颜色
//                bc 字的背景色
//                sizey 字号
//                mode:  0非叠加模式  1叠加模式
//      返回值:  无
//******************************************************************************/
//void LCD_ShowChinese12x12(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode)
//{
//        u8 i,j,m=0;
//        u16 k;
//        u16 HZnum;//汉字数目
//        u16 TypefaceNum;//一个字符所占字节大小
//        u16 x0=x;
//        TypefaceNum=(sizey/8+((sizey%8)?1:0))*sizey;
//                                 
//        HZnum=sizeof(tfont12)/sizeof(typFNT_GB12);        //统计汉字数目
//        for(k=0;k<HZnum;k++)
//        {
//                if((tfont12[k].Index[0]==*(s))&&(tfont12[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(tfont12[k].Msk[i]&(0x01<<j))LCD_WR_DATA(fc);
//                                                else LCD_WR_DATA(bc);
//                                                m++;
//                                                if(m%sizey==0)
//                                                {
//                                                        m=0;
//                                                        break;
//                                                }
//                                        }
//                                        else//叠加方式
//                                        {
//                                                if(tfont12[k].Msk[i]&(0x01<<j))        LCD_DrawPoint(x,y,fc);//画一个点
//                                                x++;
//                                                if((x-x0)==sizey)
//                                                {
//                                                        x=x0;
//                                                        y++;
//                                                        break;
//                                                }
//                                        }
//                                }
//                        }
//                }                                         
//                continue;  //查找到对应点阵字库立即退出,防止多个汉字重复取模带来影响
//        }
//}

///******************************************************************************
//      函数说明:显示单个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,m=0;
//        u16 k;
//        u16 HZnum;//汉字数目
//        u16 TypefaceNum;//一个字符所占字节大小
//        u16 x0=x;
//  TypefaceNum=(sizey/8+((sizey%8)?1:0))*sizey;
//        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);
//                                                m++;
//                                                if(m%sizey==0)
//                                                {
//                                                        m=0;
//                                                        break;
//                                                }
//                                        }
//                                        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,m=0;
//        u16 k;
//        u16 HZnum;//汉字数目
//        u16 TypefaceNum;//一个字符所占字节大小
//        u16 x0=x;
//        TypefaceNum=(sizey/8+((sizey%8)?1:0))*sizey;
//        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);
//                                                m++;
//                                                if(m%sizey==0)
//                                                {
//                                                        m=0;
//                                                        break;
//                                                }
//                                        }
//                                        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,m=0;
//        u16 k;
//        u16 HZnum;//汉字数目
//        u16 TypefaceNum;//一个字符所占字节大小
//        u16 x0=x;
//        TypefaceNum=(sizey/8+((sizey%8)?1:0))*sizey;
//        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);
//                                                m++;
//                                                if(m%sizey==0)
//                                                {
//                                                        m=0;
//                                                        break;
//                                                }
//                                        }
//                                        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,m=0;
//        u16 i,TypefaceNum;//一个字符所占字节大小
//        u16 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[num][i];                       //调用6x12字体
//                else if(sizey==16)temp=ascii_1608[num][i];                 //调用8x16字体
//                else if(sizey==24)temp=ascii_2412[num][i];                 //调用12x24字体
//                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);
//                                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;
//                                }
//                        }
//                }
//        }                      
//}


///******************************************************************************
//      函数说明:显示字符串
//      入口数据: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;
//        u32 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++;
//                }
//        }                       
//}

//读一个字节
int DEV_LCD_r1(int fd)
{
        return 0;
}
//写一个字节
int DEV_LCD_w1(int fd,int buf)
{
        return 0;
}
//读数据
int DEV_LCD_r(int fd,void *buf,int len)
{
        return 0;       
}
//写数据
int DEV_LCD_w(int fd,void *buf,int len)
{
        return 0;
}
//IO驱动
int DEV_LCD_io(int fd,int mode,int value)
{
        return 0;
}

_DRV{
//        DEV_LCD_Init();
        LCD_Init();
//        LCD_DrawPoint(10,10,BLACK);
//        rxm_reg_r1(DEV_LCD,&DEV_LCD_r1);        //注册读一个字节驱动
//        rxm_reg_w1(DEV_LCD,&DEV_LCD_w1);        //注册写一个字节驱动
//        rxm_reg_r(DEV_LCD,&DEV_LCD_r);        //注册读数据
//        rxm_reg_w(DEV_LCD,&DEV_LCD_w);        //注册写数据
//        rxm_reg_io(DEV_LCD,&DEV_LCD_io);        //注册IO驱动
//  LCD_Fill(0,0,160,128,BLACK);
//        LCD_ShowPicture(65,80,40,40,gImage_1);

};

使用特权

评论回复
8
等你下课|  楼主 | 2022-11-16 23:30 | 只看该作者
总结: SPI硬件驱动LCD,充分了解时序,用逻辑分析仪分析数据,找出出错点在哪里

使用特权

评论回复
9
tpgf| | 2022-12-6 08:59 | 只看该作者
这个硬件延时的合理范围是多少呢

使用特权

评论回复
10
qcliu| | 2022-12-6 10:15 | 只看该作者
请问 在没有更换芯片的时候不需要进行延时吗

使用特权

评论回复
11
drer| | 2022-12-6 10:27 | 只看该作者
每个字节之间都需要加延时吗 那也太影响速度了

使用特权

评论回复
12
coshi| | 2022-12-6 10:46 | 只看该作者
此处的延时是通过硬件来实现还是需要在软件中进行处理呢

使用特权

评论回复
13
kxsi| | 2022-12-6 10:58 | 只看该作者
coshi 发表于 2022-12-6 10:46
此处的延时是通过硬件来实现还是需要在软件中进行处理呢

我感觉是纯硬件自己适应 就是需要合理配置spi了

使用特权

评论回复
14
wiba| | 2022-12-6 11:30 | 只看该作者
读写函数里边为什么要返回值为0呢 如果失败怎么处理呀

使用特权

评论回复
15
wilhelmina2| | 2023-1-5 11:40 | 只看该作者
可以实现汉字和英文的混合显示?              

使用特权

评论回复
16
pmp| | 2023-1-5 12:34 | 只看该作者
最大的写入速度是多少?              

使用特权

评论回复
17
usysm| | 2023-1-5 15:29 | 只看该作者
这个是彩色的屏幕驱动芯片吗?              

使用特权

评论回复
18
tifmill| | 2023-1-5 17:22 | 只看该作者
搞得竟然是硬件SPI呢?              

使用特权

评论回复
19
updownq| | 2023-1-6 14:50 | 只看该作者
spi的驱动速度太快了              

使用特权

评论回复
20
abotomson| | 2023-1-6 16:02 | 只看该作者
怎么动态显示图片呢?              

使用特权

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

本版积分规则

34

主题

389

帖子

0

粉丝