【嵌入式】STM32芯片使用12864串口屏(驱动为ST7567)

目录

一 背景说明

二 驱动原理

三 LCD接线

四 屏幕初始化

五 显示字符/汉字

六 实际效果

七 附录


一 背景说明

        拿到一款由ST7567驱动的128×64点阵液晶屏,准备连接STM32主控连接它并点亮屏幕。

二 驱动原理

        我用的这款LCD屏幕,驱动IC是ST7567。其原理是通过驱动芯片与128×64的液晶模组进行交互,结合背光板,就能指定哪些点阵被点亮,从而得到想要的图形。驱动芯片与屏幕、背光的原理图如下:

       

【1】驱动IC——ST7567

        (i)驱动引脚

        驱动引脚如下,其中主要用到了SDA/SCL/RS/RES/CS这5个引脚进行屏幕配置和数据交互:

         

        (ii)驱动时序

        驱动时序如下,其中:

        CSB即引脚CS,片选引脚,为低电平的时候,才能写入数据或命令;
        A0即引脚RS,数据或命令选择引脚;
        SCL时钟引脚,为低电平期间,写入数据,
        SDA数据引脚,数据低位在前,高位在后;

        复位时序如下,其中:

RSTB也就是RES,复位引脚,拉低即可复位,但是要注意拉低再拉高后要延时一段时间才能操作LCD。

        

        (iii)驱动命令

         驱动命令如下,通过RS脚来实现数据与命令的切换

【2】128×64液晶模组

        一共128列,64行(其中每8行作为一页,共8页):

【3】BL背光模块

        背光正极性端LED+(LEDA)背光负极性端LED-(LEDK)控制背光亮灭。

三 LCD接线

        驱动芯片的引脚加上背光的引脚则形成了用户需要外接的所有引脚,其中主要关注CS0/RST/A0/SCK/SDA几个引脚,另外V0和XV0之间接1uf电容   VG和VSS之间接1uF电容

四 屏幕初始化

【1】IO口初始化:

//12864点阵屏引脚定义
#define LDZ_CS_PORT     (GPIOC)
#define LDZ_CS_PIN      (GPIO_Pin_5)
#define LDZ_RE_PORT     (GPIOB)
#define LDZ_RE_PIN      (GPIO_Pin_0)
#define LDZ_DC_PORT     (GPIOB)
#define LDZ_DC_PIN      (GPIO_Pin_1)
#define LDZ_SCK_PORT    (GPIOB)
#define LDZ_SCK_PIN     (GPIO_Pin_2)
#define LDZ_SDA_PORT    (GPIOC)
#define LDZ_SDA_PIN     (GPIO_Pin_7)

#define LDZ_CS_L()      GPIO_ResetBits(LDZ_CS_PORT, LDZ_CS_PIN)
#define LDZ_CS_H()      GPIO_SetBits(LDZ_CS_PORT, LDZ_CS_PIN)
#define LDZ_RE_L()      GPIO_ResetBits(LDZ_RE_PORT, LDZ_RE_PIN)
#define LDZ_RE_H()      GPIO_SetBits(LDZ_RE_PORT, LDZ_RE_PIN)
#define LDZ_DC_L()      GPIO_ResetBits(LDZ_DC_PORT, LDZ_DC_PIN)
#define LDZ_DC_H()      GPIO_SetBits(LDZ_DC_PORT, LDZ_DC_PIN)
#define LDZ_SCK_L()     GPIO_ResetBits(LDZ_SCK_PORT, LDZ_SCK_PIN)
#define LDZ_SCK_H()     GPIO_SetBits(LDZ_SCK_PORT, LDZ_SCK_PIN)
#define LDZ_SDA_L()     GPIO_ResetBits(LDZ_SDA_PORT, LDZ_SDA_PIN)
#define LDZ_SDA_H()     GPIO_SetBits(LDZ_SDA_PORT, LDZ_SDA_PIN)


/**************************************************************************
* 函数名称: LDZ_Init
* 功能描述: LDZ初始化
**************************************************************************/
void LDZ_Init(void)
{
    GPIO_InitTypeDef  GPIO_InitStructure;

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB | RCC_AHBPeriph_GPIOC, ENABLE);

    GPIO_InitStructure.GPIO_Pin  =  LDZ_CS_PIN;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(LDZ_CS_PORT, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin  =  LDZ_RE_PIN;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(LDZ_RE_PORT, &GPIO_InitStructure);
    
    GPIO_InitStructure.GPIO_Pin  =  LDZ_DC_PIN;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(LDZ_DC_PORT, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin  =  LDZ_SCK_PIN;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(LDZ_SCK_PORT, &GPIO_InitStructure);
    
    GPIO_InitStructure.GPIO_Pin  =  LDZ_SDA_PIN;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(LDZ_SDA_PORT, &GPIO_InitStructure);
    
    LDZ_CS_H();
    LDZ_SCK_H();
    LDZ_SDA_H();
    
    LDZ_RE_H(); Ddl_Delay1ms(10);
    LDZ_RE_L(); Ddl_Delay1ms(10);
    LDZ_RE_H(); Ddl_Delay1ms(50);
}

【2】写命令/写数据(通过DC口即上面的A0引脚来控制,其中高电平为写数据,低电平为写命令):

void LDZ_SendBit(u8 bit)
{	
	u8 i;
	for(i = 0;i < 8;i ++)
	{
		LDZ_SCK_L();
		if(bit & 0x80)
		   LDZ_SDA_H();
		else
		   LDZ_SDA_L();
		LDZ_SCK_H();
		bit <<= 1;
	}
} 

/**************************************************************************
* 函数名称: LDZ_WriteCMD/LDZ_WriteDAT
* 功能描述: 写命令/写数据
**************************************************************************/
void LDZ_WriteCMD(u8 cmd)
{
    LDZ_CS_L();
    LDZ_DC_L();
    LDZ_SendBit(cmd);
    LDZ_CS_H();
}
    
void LDZ_WriteDAT(u8 dat)
{
    LDZ_CS_L();
    LDZ_DC_H();
    LDZ_SendBit(dat);
    LDZ_CS_H();
}

【3】配置屏幕

/**************************************************************************
* 函数名称: LDZ_Cfg
* 功能描述: 配置屏幕
**************************************************************************/
void LDZ_Cfg(void)
{
    LDZ_WriteCMD(0xE2); //reset
    Ddl_Delay1ms(10);
    LDZ_WriteCMD(0xA2); //设置偏压比为1/9
    LDZ_WriteCMD(0xA0); //设置seg扫描正向seg0~seg131
    LDZ_WriteCMD(0xC8); //设置com扫描反向com63~com0
    LDZ_WriteCMD(0x24); //对比度粗调
    LDZ_WriteCMD(0x81); //对比度双指令
    LDZ_WriteCMD(0x2B); //对比度微调
    LDZ_WriteCMD(0x2F); //电源控制
    LDZ_WriteCMD(0xB0); //设置页地址
    LDZ_WriteCMD(0xAF); //显示打开
    LDZ_WriteCMD(0xA6); //正常显示不反转
}

【4】几个功能接口,包括设置地址/清整屏/清整页:

/**************************************************************************
* 函数名称: LDZ_SetAddr/LDZ_ClearPage/LDZ_Clear
* 功能描述: 设置地址/清整页/清全屏
**************************************************************************/
void LDZ_SetAddr(u8 page, u8 col)
{
    LDZ_WriteCMD(0xB0|page);
    LDZ_WriteCMD((col >> 4)| 0x10);
    LDZ_WriteCMD(col & 0x0F);
}

void LDZ_ClearPage(u8 page)
{
    u8 i;
    LDZ_SetAddr(page, 0);
    for(i = 0;i < 128;i ++)
        LDZ_WriteDAT(0x00);
}

void LDZ_Clear(void)
{
    u8 i;
    for(i = 0;i < 8;i ++)
        LDZ_ClearPage(i);
}

        至此,屏幕初始化便完成了,下面准备显示内容。

五 显示字符/汉字

        需要用到16和32两种大小的字体,根据ASC字符与汉字的差异可以分别放在如下的数组中

        (i)小字符(8×16)放到数组ASC16[ ];

        (ii)小汉字(16×16)放到数组CHN16[ ];

        (iii)大字符(16×32)放到数组ASC32[ ];

        (iv)大汉字(32×32)放到数组CHN32[ ];

【1】字体取模:

        要想显示字符/汉字,需要预先进行字体取模。我这边用到了 PCtoLCD2002 这款软件。软件的具体使用不再赘述,我这边设置是这样的:

        生成的字库如下:

const unsigned char ASC16[]={
0x00,0xE0,0x18,0x08,0x08,0x08,0x18,0xE0,0x00,0x07,0x18,0x10,0x10,0x10,0x18,0x07,/*"0",0*/
0x00,0x00,0x20,0x20,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x00,/*"1",1*/
0x00,0x10,0x08,0x08,0x08,0x08,0x98,0x70,0x00,0x10,0x18,0x18,0x14,0x12,0x11,0x10,/*"2",2*/
0x00,0x10,0x08,0x88,0x88,0x88,0x70,0x00,0x00,0x08,0x10,0x10,0x10,0x10,0x09,0x07,/*"3",3*/
0x00,0x00,0x80,0x40,0x20,0x10,0xF8,0x00,0x06,0x05,0x04,0x04,0x04,0x04,0x1F,0x04,/*"4",4*/
0x00,0xC0,0xB8,0x88,0x88,0x88,0x88,0x08,0x00,0x09,0x10,0x10,0x10,0x10,0x10,0x0F,/*"5",5*/
0x00,0xE0,0x10,0x88,0x88,0x88,0x88,0x10,0x00,0x07,0x09,0x10,0x10,0x10,0x10,0x0F,/*"6",6*/
0x00,0x08,0x08,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x1C,0x03,0x00,0x00,0x00,/*"7",7*/
0x00,0x70,0x90,0x88,0x88,0x88,0x98,0x60,0x00,0x0F,0x11,0x10,0x10,0x10,0x19,0x0F,/*"8",8*/
0x00,0xF0,0x98,0x08,0x08,0x08,0x90,0xE0,0x00,0x08,0x11,0x11,0x11,0x11,0x08,0x07,/*"9",9*/

};

const unsigned char CHN16[]={
0x40,0x40,0x42,0xCC,0x00,0x40,0xA0,0x9E,0x82,0x82,0x82,0x9E,0xA0,0x20,0x20,0x00,
0x00,0x00,0x00,0x3F,0x90,0x88,0x40,0x43,0x2C,0x10,0x28,0x46,0x41,0x80,0x80,0x00,/*"设",0*/
0x00,0x17,0x15,0xD5,0x55,0x57,0x55,0x7D,0x55,0x57,0x55,0xD5,0x15,0x17,0x00,0x00,
0x40,0x40,0x40,0x7F,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x7F,0x40,0x40,0x40,0x00,/*"置",1*/

};

const unsigned char ASC32[]={
0x00,0x00,0x00,0x00,0x80,0x80,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x80,0x80,0x00,
0x00,0xF0,0xFE,0xFF,0x07,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x07,0xFF,
0x00,0x0F,0x7F,0xFF,0xE0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0xE0,0xFF,
0x00,0x00,0x00,0x00,0x01,0x01,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x01,0x01,0x00,/*"0",0*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xC0,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x18,0x1C,0x0C,0x0E,0x06,0x07,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x03,0x03,0x00,0x00,0x00,0x00,/*"1",1*/
0x00,0x00,0x00,0x80,0x80,0x80,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x80,0x80,0x80,
0x00,0x06,0x07,0x07,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x81,0xE3,0xFF,
0x00,0x00,0x80,0xC0,0xE0,0x60,0x70,0x38,0x18,0x1C,0x0E,0x07,0x07,0x03,0x01,0x00,
0x00,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,/*"2",2*/
0x00,0x00,0x00,0x80,0x80,0x80,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x80,0x80,0x00,
0x00,0x04,0x07,0x07,0x03,0x01,0x00,0x80,0xC0,0xC0,0xC0,0xC0,0xE1,0xF3,0xBF,0xBF,
0x00,0x60,0xE0,0xE0,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x81,0xC3,0xFF,
0x00,0x00,0x00,0x01,0x01,0x01,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x01,0x01,0x00,/*"3",3*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xC0,0x00,
0x00,0x00,0x00,0x00,0x80,0xC0,0xE0,0xF0,0x78,0x3C,0x1E,0x0F,0xFF,0xFF,0xFF,0x00,
0x00,0x1C,0x1E,0x1F,0x1F,0x1B,0x19,0x18,0x18,0x18,0x18,0x18,0xFF,0xFF,0xFF,0x18,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x03,0x03,0x00,/*"4",4*/
0x00,0x00,0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,
0x00,0xE0,0xFF,0xFF,0x6F,0x61,0x30,0x30,0x30,0x30,0x30,0x30,0x70,0x60,0xE0,0xC0,
0x00,0x60,0xE0,0xE0,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0xE0,0xFF,
0x00,0x00,0x00,0x01,0x01,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x01,0x01,0x00,/*"5",5*/
0x00,0x00,0x00,0x00,0x00,0x80,0x80,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x80,0x80,
0x00,0xF0,0xFC,0xFE,0x8F,0xC3,0xC1,0x60,0x60,0x60,0x60,0x60,0x60,0xC1,0xC3,0x87,
0x00,0x0F,0x7F,0xFF,0xE1,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC1,0xFF,
0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x03,0x03,0x03,0x03,0x03,0x03,0x01,0x01,0x00,/*"6",6*/
0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xE0,0xF8,0x3C,0x0E,0x07,0x03,
0x00,0x00,0x00,0x00,0x00,0x80,0xF0,0xFE,0x7F,0x0F,0x01,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x03,0x03,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"7",7*/
0x00,0x00,0x00,0x00,0x80,0x80,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x80,0x80,0x00,
0x00,0x00,0x1E,0x3F,0xFF,0xE1,0xE1,0xC0,0xC0,0xC0,0xC0,0xC0,0xE1,0xE1,0xFF,0x3F,
0x00,0x3C,0xFF,0xFF,0xC3,0x81,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x81,0xC3,0xFF,
0x00,0x00,0x00,0x00,0x01,0x01,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x01,0x01,0x00,/*"8",8*/
0x00,0x00,0x00,0x00,0x80,0x80,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x80,0x80,0x80,0x00,
0x00,0x7C,0xFE,0xFF,0x87,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x83,0xFF,
0x00,0x60,0xE1,0xE1,0xC3,0x83,0x06,0x06,0x06,0x06,0x06,0x06,0x83,0xC3,0xF1,0x7F,
0x00,0x00,0x00,0x01,0x01,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x01,0x01,0x00,0x00,/*"9",9*/
};

const unsigned char CHN32[]={
0x00,0x00,0x00,0x00,0x00,0x04,0x18,0xF8,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,
0xF8,0x08,0x08,0x08,0x08,0x08,0xF8,0xFC,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x10,0x10,0x10,0x10,0x10,0xF8,0xF0,0x10,0x40,0x40,0x20,0x58,0x4E,0xC7,
0x40,0x40,0x40,0x40,0x40,0x40,0x47,0x4F,0xEC,0xCC,0x4C,0x0C,0x0C,0x0C,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x80,0x40,0x20,0x10,0x00,0x00,
0x07,0x18,0x60,0xC0,0xC0,0xE0,0x78,0x1F,0x07,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x47,0x43,0x41,0x20,0x20,0x30,0x10,0x18,
0x08,0x0C,0x06,0x03,0x03,0x06,0x0E,0x0C,0x1C,0x18,0x38,0x30,0x10,0x10,0x00,0x00,/*"设",0*/
0x00,0x00,0x00,0x00,0x00,0xFC,0xF8,0x08,0x08,0x08,0x08,0x08,0xF8,0xF8,0x08,0x08,
0x08,0x08,0xF8,0xF8,0x08,0x08,0x08,0x08,0x08,0xFC,0xFC,0x08,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x10,0x13,0x13,0x51,0x91,0x91,0x91,0x91,0x91,0x91,0xF3,0xFD,
0x95,0x95,0x91,0x91,0x91,0x91,0xD1,0xD1,0x91,0x1B,0x1B,0x10,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x44,0x44,0x44,0x44,0x44,0x44,
0x44,0x44,0x44,0x44,0x44,0x44,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3F,0x3F,0x22,0x22,0x22,0x22,0x22,0x22,
0x22,0x22,0x22,0x22,0x22,0x22,0x3F,0x3F,0x20,0x20,0x20,0x30,0x30,0x20,0x00,0x00,/*"置",1*/
};

【2】显示字符/汉字接口:

        用四个定制化的接口,来显示上面不同字体的字库内容:

/**************************************************************************
* 函数名称: LDZ_ShowASC16/LDZ_ShowASC32/LDZ_ShowCHN16/LDZ_ShowCHN32
* 功能描述: 显示字符
* 参数说明: [1]页地址 / [2]列地址 / [3]字符位于对应数组中的序号
**************************************************************************/
void LDZ_ShowASC16(u8 page, u8 col, u8 id)
{
    u8 i,j;
    for(i = 0;i < 2;i ++)//一共2行
	{
        LDZ_SetAddr(page++, col);
		for(j = 0;j < 8;j ++)  //一行8字节
			LDZ_WriteDAT(ASC16[j + i*8 + id*16]);
	}
}

void LDZ_ShowCHN16(u8 page, u8 col, u8 id)
{
    u8 i,j;
    for(i = 0;i < 2;i ++)   //一共2行
	{
        LDZ_SetAddr(page++, col);
		for(j = 0;j < 16;j ++)  //一行16字节
			LDZ_WriteDAT(CHN16[j + i*16 + id*32]);
	}
}

void LDZ_ShowASC32(u8 page, u8 col, u8 id)
{
    u8 i,j;
    for(i = 0;i < 4;i ++)   //一共4行
	{
        LDZ_SetAddr(page++, col);
		for(j = 0;j < 16;j ++)  //一行16字节
			LDZ_WriteDAT(ASC32[j+ i*16 + id*64]);
	}
}

void LDZ_ShowCHN32(u8 page, u8 col, u8 id)
{
    u8 i,j;
    for(i = 0;i < 4;i ++)   //一共4行
	{
        LDZ_SetAddr(page++, col);
		for(j = 0;j < 32;j ++)  //一行32字节
			LDZ_WriteDAT(CHN32[j + i*32 + id*128]);
	}
}

        至此,定制化的字符/汉字显示接口已经完成,接下来就是在主函数中使用。

六 实际效果

        在主函数中调用初始化以及字符显示接口:

int main(void)
{
    //LCD初始化/配置命令/清屏
    LDZ_Init();
    LDZ_Cfg();
    LDZ_Clear();


    while(1)
    {
        LDZ_ShowASC16(0, 0, 0);    //显示0
        LDZ_ShowASC16(0, 8, 1);    //显示1
        LDZ_ShowASC16(0, 16, 2);    //显示2
        LDZ_ShowASC16(0, 24, 3);    //显示3
            
        LDZ_ShowCHN16(2, 0, 0);    //显示“设”
        LDZ_ShowCHN16(2, 16, 1);    //显示“置”
            
        LDZ_ShowASC32(4, 0, 4);    //显示4
        LDZ_ShowASC32(4, 16, 5);    //显示5
            
        LDZ_ShowCHN32(4, 32, 0);    //显示“设”
        LDZ_ShowCHN32(4, 64, 1);    //显示“置”
    }
}

        实际运行屏幕效果如下:

七 附录

【1】【嵌入式】MCU(HC32F460)+SPI接口LCD液晶屏ILI9341 移植emWin记录1----点亮LCD屏_ili9341是spi 还是i2c-CSDN博客

【2】【开源】使用HK32F030驱动ST7567 LCD-CSDN博客

【3】LX12864P1屏幕使用介绍(ST7567驱动),显示横线、字符、图形-CSDN博客

【4】[STM32F1]使用STM32F103驱动ST7567液晶屏_st7567单片机驱动程序-CSDN博客

  • 26
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: ST7567是一款常用的单色图形液晶控制器,常用于嵌入式系统中。STM32是STMicroelectronics(意法半导体)公司生产的一系列基于ARM Cortex-M内核的32位微控制器。 要驱动ST7567显示器模块,首先需要连接STM32微控制器和ST7567控制器。通过控制STM32的GPIO引脚与ST7567的时钟(CLK)、数据命令(D/C)、数据(DIN)、复位(RST)等引脚连接,在STM32上配置相应的GPIO模式和时序。此外,还需通过SPI(串行外设接口)或I2C(串行总线)协议来与ST7567进行通信。 接下来,在STM32上实现驱动程序。可以使用STMicroelectronics提供的HAL库或者自己编写底层驱动程序。驱动程序通常包括初始化设置、幕亮度控制、显示缓冲区管理、图像数据渲染和刷新等功能。 首先,需要进行初始化设置,包括配置SPI或I2C通信参数、初始化GPIO引脚、对ST7567进行复位等。 然后,需要实现幕亮度控制。可以通过调整ST7567的对比度控制来实现幕的亮度调节。 接着,需要管理显示缓冲区。可以创建一个与ST7567像素矩阵大小相同的内存数组作为显示缓冲区,并在需要更新幕内容时,将需要显示的图像数据写入缓冲区。 然后,需要实现图像数据的渲染。可以根据需要在缓冲区中绘制图形、文本等,然后通过驱动程序将数据发送给ST7567。 最后,需要定时刷新幕内容。通过控制驱动程序的刷新频率,实现幕内容的更新和显示。 以上是驱动ST7567液晶显示器的基本步骤和方法。通过掌握STM32的GPIO、SPI或I2C等相关知识,结合ST7567驱动规范,就可以成功驱动ST7567液晶显示器,并在嵌入式系统中实现所需的图形显示功能。 ### 回答2: ST7567是一款基于SPI总线协议的液晶驱动芯片,可以与STM32微控制器进行连接和驱动。 首先,我们需要在STM32的开发环境中创建一个新的工程,并将ST7567驱动程序库导入到工程中。这个驱动程序库通常包含了与ST7567芯片通信所需的函数和定义。 接下来,我们需要根据连接电路图将ST7567芯片STM32微控制器进行物理连接。通常,SPI总线由四个主要的信号线组成:时钟线(SCK),数据线(MOSI),从机选择线(SSB)和数据/命令控制线(DC)。确保将这些信号线正确连接到STM32的相应引脚上,并为ST7567芯片提供正确的电源电压和地接线。 然后,我们可以根据ST7567的数据手册编写代码,实现与ST7567芯片的通信和控制。首先,我们需要初始化SPI总线,并设置相关的寄存器和参数,以确保与ST7567的正常通信。然后,我们可以使用相应的函数和指令发送数据和命令到ST7567,并进行幕显示的控制,例如清、绘制图形和显示文本等。 最后,我们可以编译和下载程序到STM32微控制器,并将其与ST7567和其他相关硬件一起启动。通过正确的物理连接和软件驱动STM32可以与ST7567芯片进行通信,并实现对液晶的控制和显示。 需要注意的是,以上仅为一般步骤的概述,并且具体的驱动方法和代码实现可能因不同的开发环境和硬件连接而有所不同。因此,在具体的项目中,我们需要参考ST7567的数据手册、STM32的参考资料以及驱动程序库的文档来详细了解和实现ST7567驱动STM32的具体步骤和方法。 ### 回答3: ST7567是一种图形液晶显示器控制器驱动芯片,可以用于控制128x64或者132x32像素的单色液晶显示。而STM32是一系列的32位ARM Cortex-M微控制器,广泛应用于嵌入式系统开发。 要在STM32使用ST7567驱动,首先需要连接硬件。将STM32的引脚与ST7567的引脚相连,包括数据线、时钟线、片选线等,以便实现数据和指令的传输。还要连接电源线,保证ST7567正常供电。 接下来,在STM32的开发环境中编写驱动程序。首先,初始化STM32的GPIO和SPI(或者I2C)接口,以便与ST7567进行通信。然后,编写LCD的初始化函数,设置ST7567的工作模式、显示模式、对比度等参数。在初始化函数中,还需要发送一系列指令和数据,以便设置ST7567的内部寄存器。这些指令和数据可以从ST7567的数据手册中获得。 一旦ST7567STM32成功建立通信,就可以在STM32的主程序中使用ST7567驱动进行显示操作了。通过向ST7567发送数据,可以在液晶上显示文字、图像等内容。可以编写函数来实现绘制点、直线、矩形和填充矩形等基本图形,以及显示字符串等高级操作。 最后,需要注意的是,ST7567驱动程序的具体实现可能会有所不同,因为它取决于具体的STM32型号和开发环境。特定的STM32开发板和软件包可能提供了相应的库函数或者示例代码,可以更方便地进行ST7567驱动开发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值