求解stm32通过模拟spi驱动st7735,但是还是白屏,求解程序那里有问题
#define SPILCD_BASE GPIO_PORTD_BASE
#define SPILCD_CS GPIO_PIN_4 //PD4
#define SPILCD_SDA GPIO_PIN_6 //PD6
#define SPILCD_SCL GPIO_PIN_5 //PD5
#define SPILCD_RS GPIO_PIN_7 //PD7
//片选使能
#define LCD_CS_L() GPIOPinWrite(SPILCD_BASE, SPILCD_CS, 0)
#define LCD_CS_H() GPIOPinWrite(SPILCD_BASE, SPILCD_CS, SPILCD_CS)
//命令片选
#define LCD_CMD_RS_L() GPIOPinWrite(SPILCD_BASE, SPILCD_RS, 0)
//数据片选
#define LCD_DATA_RS_H() GPIOPinWrite(SPILCD_BASE, SPILCD_RS, SPILCD_RS)
//SCL时钟
#define LCD_SCL_L() GPIOPinWrite(SPILCD_BASE, SPILCD_SCL, 0)
#define LCD_SCL_H() GPIOPinWrite(SPILCD_BASE, SPILCD_SCL, SPILCD_SCL)
//SDA
#define LCD_SDA_L() GPIOPinWrite(SPILCD_BASE, SPILCD_SDA, 0)
#define LCD_SDA_H() GPIOPinWrite(SPILCD_BASE, SPILCD_SDA, SPILCD_SDA)
//液晶屏尺寸定义
#if (SPILCD_TYPE == 1) //1.8寸
#define SPILCD_W 128
#define SPILCD_H 160
#elif (SPILCD_TYPE == 2) //2.2寸
#define SPILCD_W 176
#define SPILCD_H 220
#endif
//TFTLCD部分外要调用的函数
//u16 POINT_COLOR;//前景色
//u16 BACK_COLOR; //背景色
//////////////////////////////////////////////////////////////////////
//字体
#define ASCII1206 0
#define ASCII1608 1
#define ASCII1608C 2
//////////////////////////////////////////////////////////////////////
//画笔颜色
#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 //灰色
//GUI颜色
#define DARKBLUE 0X01CF //深蓝色
#define LIGHTBLUE 0X7D7C //浅蓝色
#define GRAYBLUE 0X5458 //灰蓝色
//以上三色为PANEL的颜色
#define LIGHTGREEN 0X841F //浅绿色
#define LIGHTGRAY 0XEF5B //浅灰色(PANNEL)
#define LGRAY 0XC618 //浅灰色(PANNEL),窗体背景色
#define LGRAYBLUE 0XA651 //浅灰蓝色(中间层颜色)
#define LBBLUE 0X2B12 //浅棕蓝色(选择条目的反色)
////////////////////////////
//前景色 背景色
unsigned short POINT_COLOR = 0xffff,BACK_COLOR = 0x0000;
//函数名:SPILCD_WR_REG
//参 数:无
// 实现写入一字节命令
void SPILCD_WR_REG(unsigned char ucData)
{
unsigned char i = 8;
LCD_CS_L();
LCD_CMD_RS_L();
while(i--)
{
LCD_SCL_L();
if(ucData & 0x80)
{
LCD_SDA_H();
}
else
{
LCD_SDA_L();
}
LCD_SCL_H();
ucData <<=1; /* 左移一位,准备发送下一位数据 */
}
LCD_CS_H();
}
//函数名:LCD_WR_REG
//参 数:无
// 实现写入一字节数据
void SPILCD_WR_DATA(unsigned char ucData)
{
unsigned char i = 8;
LCD_CS_L();
LCD_DATA_RS_H();
while(i--)
{
LCD_SCL_L();
if(ucData & 0x80)
{
LCD_SDA_H();
}
else
{
LCD_SDA_L();
}
LCD_SCL_H();
ucData <<=1; /* 左移一位,准备发送下一位数据 */
}
LCD_CS_H();
}
//函数名:LCD_WR_REG
//参 数:无
// 准备开始写入GRAM
void SPILCD_WriteRAM_Prepare(void)
{
SPILCD_WR_REG(0x2c); //写RAM
}
//函数名:LCD_WR_REG
//参 数:无
// 写GRAM数据
void SPILCD_WriteRAM(unsigned short RGB_Code)
{
SPILCD_WR_DATA(RGB_Code>>8);
SPILCD_WR_DATA(RGB_Code);
}
//函数名:LCD_DisplayOn
//参 数:无
// 开启显示
void LCD_DisplayOn(void)
{
SPILCD_WR_REG(0x29); //
}
//函数名:LCD_DisplayOff
//参 数:无
// 关闭显示
void LCD_DisplayOff(void)
{
SPILCD_WR_REG(0x28); //
}
//函数名:LCD_SetWindow
//参 数:Xpos:横坐标
// Ypos:纵坐标
void SPILCD_SetWindow(unsigned short xstat,unsigned short xend,unsigned short ystat,unsigned short yend)
{
SPILCD_WR_REG(0x2A);
SPILCD_WR_DATA(xstat>>8);
SPILCD_WR_DATA(xstat);
SPILCD_WR_DATA(xend>>8);
SPILCD_WR_DATA(xend);
SPILCD_WR_REG(0x2B);
SPILCD_WR_DATA(ystat>>8);
SPILCD_WR_DATA(ystat);
SPILCD_WR_DATA(yend>>8);
SPILCD_WR_DATA(yend);
}
//开启反色显示
void LCD_InvDisplayOn()
{
SPILCD_WR_REG(0x21);
}
//关闭反色显示
void LCD_InvDisplayOff()
{
SPILCD_WR_REG(0x20);
}
//函数名:SPILCD_Init
//参 数:无
// LCD 硬件初始化
void SPILCD_Init()
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
// GPIODirModeSet(SPILCD_BASE,LCD_PIN_D,GPIO_DIR_MODE_OUT);
// GPIOPadConfigSet(SPILCD_BASE, LCD_PIN_D, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU);
GPIOPinTypeGPIOOutput(SPILCD_BASE,SPILCD_CS);
GPIOPadConfigSet(SPILCD_BASE,SPILCD_CS, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD);
GPIOPinTypeGPIOOutput(SPILCD_BASE,SPILCD_SCL);
GPIOPadConfigSet(SPILCD_BASE,SPILCD_SCL, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD);
GPIOPinTypeGPIOOutput(SPILCD_BASE,SPILCD_SDA);
GPIOPadConfigSet(SPILCD_BASE,SPILCD_SDA, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD);
GPIOPinTypeGPIOOutput(SPILCD_BASE,SPILCD_RS);
GPIOPadConfigSet(SPILCD_BASE,SPILCD_RS, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD);
GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE,GPIO_PIN_2);
GPIOPadConfigSet(GPIO_PORTF_BASE,GPIO_PIN_2, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU);
/* SPILCD_RST=1;
DelayMs (1); //Delay 1ms
SPILCD_RST=0;
DelayMs (1); //Delay 1ms
SPILCD_RST=1;
DelayMs (120); //Delay 120ms
PreciseDelay_ms(120);
*/
SPILCD_WR_REG(0x11);//Sleep out
PreciseDelay_ms(120);
//ST7735R Frame Rate
SPILCD_WR_REG(0xB1);
SPILCD_WR_DATA(0x01);
SPILCD_WR_DATA(0x2C);
SPILCD_WR_DATA(0x2D);
SPILCD_WR_REG(0xB2);
SPILCD_WR_DATA(0x01);
SPILCD_WR_DATA(0x2C);
SPILCD_WR_DATA(0x2D);
SPILCD_WR_REG(0xB3);
SPILCD_WR_DATA(0x01);
SPILCD_WR_DATA(0x2C);
SPILCD_WR_DATA(0x2D);
SPILCD_WR_DATA(0x01);
SPILCD_WR_DATA(0x2C);
SPILCD_WR_DATA(0x2D);
//------------------------------------End ST7735R Frame Rate-----------------------------------------//
SPILCD_WR_REG(0xB4);//Column inversion
SPILCD_WR_DATA(0x07);
//------------------------------------ST7735R Power Sequence-----------------------------------------//
SPILCD_WR_REG(0xC0);
SPILCD_WR_DATA(0xA2);
SPILCD_WR_DATA(0x02);
SPILCD_WR_DATA(0x84);
SPILCD_WR_REG(0xC1);
SPILCD_WR_DATA(0xC5);
SPILCD_WR_REG(0xC2);
SPILCD_WR_DATA(0x0A);
SPILCD_WR_DATA(0x00);
SPILCD_WR_REG(0xC3);
SPILCD_WR_DATA(0x8A);
SPILCD_WR_DATA(0x2A);
SPILCD_WR_REG(0xC4);
SPILCD_WR_DATA(0x8A);
SPILCD_WR_DATA(0xEE);
//---------------------------------End ST7735R Power Sequence-------------------------------------//
SPILCD_WR_REG(0xC5);//VCOM
SPILCD_WR_DATA(0x0E);
SPILCD_WR_REG(0x36);//MX, MY, RGB mode
SPILCD_WR_DATA(0xC8);
//------------------------------------ST7735R Gamma Sequence-----------------------------------------//
SPILCD_WR_REG(0xe0);
SPILCD_WR_DATA(0x02);
SPILCD_WR_DATA(0x1c);
SPILCD_WR_DATA(0x07);
SPILCD_WR_DATA(0x12);
SPILCD_WR_DATA(0x37);
SPILCD_WR_DATA(0x32);
SPILCD_WR_DATA(0x29);
SPILCD_WR_DATA(0x2d);
SPILCD_WR_DATA(0x29);
SPILCD_WR_DATA(0x25);
SPILCD_WR_DATA(0x2b);
SPILCD_WR_DATA(0x39);
SPILCD_WR_DATA(0x00);
SPILCD_WR_DATA(0x01);
SPILCD_WR_DATA(0x03);
SPILCD_WR_DATA(0x10);
SPILCD_WR_REG(0xe1);
SPILCD_WR_DATA(0x03);
SPILCD_WR_DATA(0x1d);
SPILCD_WR_DATA(0x07);
SPILCD_WR_DATA(0x06);
SPILCD_WR_DATA(0x2e);
SPILCD_WR_DATA(0x2c);
SPILCD_WR_DATA(0x29);
SPILCD_WR_DATA(0x2d);
SPILCD_WR_DATA(0x2e);
SPILCD_WR_DATA(0x2e);
SPILCD_WR_DATA(0x37);
SPILCD_WR_DATA(0x3f);
SPILCD_WR_DATA(0x00);
SPILCD_WR_DATA(0x00);
SPILCD_WR_DATA(0x02);
SPILCD_WR_DATA(0x10);
SPILCD_WR_REG(0x2A);
SPILCD_WR_DATA(0x00);
SPILCD_WR_DATA(0x02);
SPILCD_WR_DATA(0x00);
SPILCD_WR_DATA(0x81);
SPILCD_WR_REG(0x2B);
SPILCD_WR_DATA(0x00);
SPILCD_WR_DATA(0x01);
SPILCD_WR_DATA(0x00);
SPILCD_WR_DATA(0xA0);
//------------------------------------End ST7735R Gamma Sequence-----------------------------------------//
SPILCD_WR_REG(0x3A);
SPILCD_WR_DATA(0x05);
//SPILCD_WR_REG(0x3A);//65k mode
//LCD_WR_DATA(0x05);
SPILCD_WR_REG(0x29);//Display on
PreciseDelay_ms(10);
SPILCD_Clear(BACK_COLOR);
SPILCD_Clear(RED);
SPILCD_DrawLine(20,20,60,60);
}
//------------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------------
//SPILCD DRIVER LV1层 ---- LV1 在LV0的基础上实现
//打点
//清屏
//填充
//画线
//矩形边框
//画园
//函数名:SPILCD_Init
//参 数:X Y 坐标
// 在X Y上打点
void SPILCD_DrawPoint(unsigned short x,unsigned short y)
{
SPILCD_SetWindow(x,x+1,y,y+1);//设置光标位置
SPILCD_WriteRAM_Prepare(); //开始写入GRAM
SPILCD_WriteRAM(POINT_COLOR);
}
//函数名:SPILCD_Clear
//参 数:Color 颜色
void SPILCD_Clear(unsigned short Color)
{
unsigned long index=0;
SPILCD_SetWindow(0,SPILCD_W-1,0,SPILCD_H-1);
SPILCD_WriteRAM_Prepare(); //开始写入GRAM
for(index=0;index<SPILCD_W*SPILCD_H;index++)
{
SPILCD_WriteRAM(Color);//显示所填充的颜色.
}
}
//函数名:SPILCD_Fill
//参 数:起始终点坐标
void SPILCD_Fill(unsigned short xsta,unsigned short ysta,unsigned short xend,unsigned short yend,unsigned short color)
{
unsigned long n;
//设置窗口
SPILCD_SetWindow(xsta,xend,ysta,yend);
SPILCD_WriteRAM_Prepare(); //开始写入GRAM
n=(unsigned long)(yend-ysta+1)*(xend-xsta+1);
while(n--){SPILCD_WriteRAM(color);}//显示所填充的颜色.
//恢复设置
SPILCD_SetWindow(0,SPILCD_W-1,0,SPILCD_H-1);
}
//函数名:SPILCD_DrawLine
//参 数:起始终点坐标
void SPILCD_DrawLine(unsigned short x1,unsigned short y1,unsigned short x2,unsigned short y2)
{
unsigned short 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++ )//画线输出
{
SPILCD_DrawPoint(uRow,uCol);//画点
xerr+=delta_x ;
yerr+=delta_y ;
if(xerr>distance)
{
xerr-=distance;
uRow+=incx;
}
if(yerr>distance)
{
yerr-=distance;
uCol+=incy;
}
}
}
相关推荐
ST7735S init 横竖屏设置
代码转载自:https://pan.quark.cn/s/82434126b4ff 初始化过程完全基于注释编写,每一个含义都表述得非常明确。若有不明之处,欢迎通过私信进行咨询。
STM32用GPIO模拟SPI驱动ST7735彩屏:从时序到显示的完整实践
在嵌入式系统开发中,屏幕显示往往比想象中更依赖底层通信协议的理解。SPI作为一种高速同步串行接口,常被用于连接TFT-LCD液晶屏等外设,但当硬件SPI引脚被占用时,GPIO模拟SPI便成了灵活可靠的替代方案。通过软件时序控制时钟极性和相位,即可实现与硬件等效的通信效果,同时还能更直观地掌握数据传输原理。STM32F103作为主流MCU,配合ST7735驱动的1.8寸彩屏,是学习显示驱动与接口封装的经典组合。本文从引脚接线、时序模拟到初始化流程、窗口机制与字模显示,逐步讲解如何用软件SPI完成从点亮屏幕到显
STM32硬件SPI驱动ST7735彩屏:从初始化到Proteus仿真全攻略
在嵌入式显示开发中,SPI总线是连接主控与TFT-LCD屏最常用的通信方式之一。相比软件模拟SPI逐位翻转GPIO的笨拙方式,硬件SPI由外设自动管理时钟与数据移位,能显著提升屏幕刷新率并降低CPU占用,为后续GUI或RTOS集成留出充足资源。ST7735作为小尺寸彩屏的典型驱动芯片,其初始化序列、RGB565像素格式、命令/数据切换等细节直接影响显示效果。本文以STM32F103为例,系统梳理硬件SPI外设配置、ST7735关键寄存器设置、显示驱动分层设计等通用原理,并结合Proteus仿真与实物调试的差
STM32 HAL库软件SPI驱动ST7735彩屏方案详解
嵌入式系统开发中,驱动小型TFT屏幕常涉及SPI通信协议。硬件SPI虽然速率高,但存在引脚复用冲突与配置限制;软件SPI通过GPIO模拟时序,具备引脚选择灵活、调试直观等优势。以STM32F103C8T6最小系统板搭配1.8寸ST7735屏幕为例,介绍基于HAL库的软件SPI驱动方法,涵盖引脚分配、CubeMX配置、初始化序列、窗口刷新机制及RGB565数据格式。针对实际工程中常见的颜色颠倒、画面偏移、白屏闪烁等问题,从时序、供电、复位及像素字节序等维度给出排查思路。该方案既适合初学者理解LCD工作原理,也
给STM32G030F6P6找个‘眼睛’:手把手教你用HAL库模拟SPI点亮1.8寸ST7735屏
本文详细介绍了如何使用HAL库模拟SPI驱动1.8寸ST7735 TFT LCD屏,特别针对STM32G030F6P6微控制器。从硬件连接到软件配置,包括CubeMX工程搭建、GPIO设置、模拟SPI时序实现及优化技巧,提供了完整的驱动方案和调试指南,帮助开发者快速实现显示功能。


单片机/工控
