STM32 使用LCD12864显示屏(串行方式)

这篇具有很好参考价值的文章主要介绍了STM32 使用LCD12864显示屏(串行方式)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

LCD12864

简介

12864LCD液晶显示模块是一款4位/8位并行、2线或3线接口方式,内部含有国际一级、二级简体中文字库的图形点阵液晶模块。显示分辨率为12864,内置8198个1616点汉字,和128个16*8点ASCII字符集。

功能引脚图

STM32 使用LCD12864显示屏(串行方式)

串口通讯需要使用的引脚

  1. CS片选信号 (如果只有一款屏,可以将CS直接接到VCC上,实现两线通讯。)
  2. SID数据传输引脚
  3. CLK时钟
  4. PSB(低电平表示串行通讯,串口通讯时可以直接接地。)
  5. VSS、VDD电源脚

原理图

工作电压:5V
驱动电压:0-7V
逻辑电平:2.7-5.5V
工作温度:0-55°C
STM32 使用LCD12864显示屏(串行方式)

串行时序图

  1. 在操作液晶屏前,将CS片选信号拉高。
  2. SID前8位是控制字符,1-5位固定为1。
    RW为0时,表示写操作。RS为1时,表示写数据,RS为0时,表示写指令。
    因此写指令CMD固定为0xF8,写数据DAT固定为0xFA。
  3. 发送数据分为两组,将发送的8位数据截取成两段,第一段发送给1byte的高4位,第二段发送给2byte的高4位。
    STM32 使用LCD12864显示屏(串行方式)

基本指令说明

  1. 功能设定
    本设计使用(0x30),表示8位MPU控制,选择基本指令集。
    STM32 使用LCD12864显示屏(串行方式)

  2. 显示开关设置
    本设计使用(0x0C),表示设定显示开,关闭光标,正常显示。
    STM32 使用LCD12864显示屏(串行方式)

  3. 进入设定点
    本设计使用(0x06),表示显示数据的读写时,设定游标方向右移,DDRAM地址计数器加1。
    STM32 使用LCD12864显示屏(串行方式)

  4. 清楚显示
    本设计使用(0x01),表示清除显示。
    STM32 使用LCD12864显示屏(串行方式)

  5. 设定DDRAM地址
    本设计使用(0x80),表示设置启动位置到地址计数器。
    128x64点阵原理上等同于256x32点阵,第三行对应的DDRAM地址紧接着第一行,第四行对应的DDRAM地址紧接着第二行。在使用反白功能时,第一行反白,第三行必然反白。
    STM32 使用LCD12864显示屏(串行方式)

6. 屏幕与DDRAM地址的对应关系

STM32 使用LCD12864显示屏(串行方式)

代码配置

lcd12864.h

#ifndef __LCD12864_H
#define __LCD12864_H

#include "stm32f10x.h"
#include "Delay.h"

#define CS 	GPIO_Pin_0	//片选信号
#define SID GPIO_Pin_1	//数据传输
#define CLK GPIO_Pin_2	//时钟
#define PSB GPIO_Pin_3	//串并选择 低电平为串行
#define CMD_PROT GPIOC	//GPIO分组

#define CS_HIGH GPIO_SetBits(CMD_PROT,CS)
#define CS_LOW GPIO_ResetBits(CMD_PROT,CS)
#define SID_HIGH GPIO_SetBits(CMD_PROT,SID)
#define SID_LOW GPIO_ResetBits(CMD_PROT,SID)
#define CLK_HIGH GPIO_SetBits(CMD_PROT,CLK)
#define CLK_LOW GPIO_ResetBits(CMD_PROT,CLK)
#define PSB_HIGH GPIO_SetBits(CMD_PROT,PSB)
#define PSB_LOW GPIO_ResetBits(CMD_PROT,PSB)

#define CMD 0xF8	//写指令
#define DAT 0xFA	//写数据

typedef struct{
	uint8_t com;	//地址
	uint8_t num;	//长度
	uint8_t *dat;	//数据
}LCD_InitTypeDef;	//定义写文字用的结构体

void LCD12864_UserConfig(void);/*用户配置*/
void LCD12864_Write_Init(void);/*LCD12864上电初始化流程*/
void LCD12864_Write_CMD_Data(uint8_t cmd,uint8_t data);/*LCD12864写函数 传入指令写指令,传入数据写数据*/
void LCD12864_Write_Word(LCD_InitTypeDef LCD_InitStructure);/*LCD12864写文字*/
void LCD12864_Write_Number(uint8_t com,uint8_t num);/*LCD12864写数字*/
void LCD12864_Open(void);/*屏幕开显示*/
void LCD12864_Shut(void);/*屏幕关显示,进入睡眠*/

#endif

lcd12864.c

#include "lcd12864.h"

/*用户配置*/
void LCD12864_UserConfig(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
	
	GPIO_InitStructure.GPIO_Pin	= CS|SID|CLK|PSB;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
	GPIO_Init(CMD_PROT,&GPIO_InitStructure);
}

/*LCD12864写一个字节*/
void LCD12864_Write_Byte(uint8_t data)
{
	uint8_t WBi;
	CS_HIGH;	//写之前拉高片选信号
	for(WBi=0;WBi<8;WBi++)
	{
		(data<<WBi&0x80)?SID_HIGH:SID_LOW;	//移位,判断高位
	
		CLK_LOW;	//拉低时钟
		CLK_HIGH;	//拉高时钟
	}
	CS_LOW;		//释放片选,不再占据总线
}
	
/*LCD12864写函数 传入指令写指令,传入数据写数据*/
void LCD12864_Write_CMD_Data(uint8_t cmd,uint8_t data)
{
	LCD12864_Write_Byte(cmd);
	LCD12864_Write_Byte(data&0xf0);			//根据时序图,传入数据的高4位变成发送数据的高4位,发送的数据低4位为0。例0x38 0011 1000 & 1111 0000
	LCD12864_Write_Byte((data<<4)&0xf0);	//再取传入数据的低4位,变成发送数据的高4位,发送的数据低4位为0。例0x38<<4 1000 & 1111 0000
	Delay_ms(2);	//设置传输延时
}

/*LCD12864上电初始化流程*/
void LCD12864_Write_Init(void)
{
	PSB_LOW;								//设置串行通讯
	LCD12864_Write_CMD_Data(CMD,0x30);		//功能设定,8位MCU接口,基本指令集
	LCD12864_Write_CMD_Data(CMD,0x06);		//显示数据的读写时,设定游标方向右移,DDRAM地址计数器加1
	LCD12864_Write_CMD_Data(CMD,0x0C);		//开显示,关闭光标
	LCD12864_Write_CMD_Data(CMD,0x01);		//清除显示
	LCD12864_Write_CMD_Data(CMD,0x80);		//设置启动位置
}
	
/*屏幕开显示*/
void LCD12864_Open(void)
{
	LCD12864_Write_CMD_Data(CMD,0x0C);	
}

/*屏幕关显示,进入睡眠*/
void LCD12864_Shut(void)
{
	LCD12864_Write_CMD_Data(CMD,0x08);		//进入睡眠模式
}

/*LCD12864写文字*/
void LCD12864_Write_Word(LCD_InitTypeDef LCD_InitStructure)
{
	uint8_t LWWi;
	LCD12864_Write_CMD_Data(CMD,LCD_InitStructure.com);		//写指令:写入地址
	
	for(LWWi=0;LWWi<LCD_InitStructure.num;LWWi++)
	{
		LCD12864_Write_CMD_Data(DAT,*LCD_InitStructure.dat++);	//根据数据长度写入字节
		Delay_ms(200);
	}
}
	
/*LCD12864写数字*/
void LCD12864_Write_Number(uint8_t com,uint8_t num)
{
	const uint8_t number[] = {"0123456789"};
	LCD12864_Write_CMD_Data(CMD,com);					//写地址
	
	LCD12864_Write_CMD_Data(DAT,number[num/1000]);		//1234 1
	LCD12864_Write_CMD_Data(DAT,number[num%1000/100]);	//1234 2
	LCD12864_Write_CMD_Data(DAT,number[num%100/10]);	//1234 3
	LCD12864_Write_CMD_Data(DAT,number[num%100%10]);	//1234 4
}

main.c文章来源地址https://www.toymoban.com/news/detail-447824.html

#include "stm32f10x.h"   // Device header
#include "lcd12864.h"
#include "Delay.h"

LCD_InitTypeDef LCD_InitStructure;

int main(void)
{
	LCD12864_UserConfig();		//LCD12864用户配置初始化
	LCD12864_Write_Init();		//LCD12864流程初始化
	
	LCD_InitStructure.com = 0x80;	//0x80-0x87 16 8
	LCD_InitStructure.num =16;
	LCD_InitStructure.dat = (u8*)&"桃之夭夭灼灼其华";
	LCD12864_Write_Word(LCD_InitStructure);
	
	LCD_InitStructure.com = 0x90;	//0x90-0x97 16 8
	LCD_InitStructure.num =16;
	LCD_InitStructure.dat = (u8*)&"之子于归宜其室家";
	LCD12864_Write_Word(LCD_InitStructure);
	
	LCD_InitStructure.com = 0x88;	//0x88-0x8F 16 8
	LCD_InitStructure.num =16;
	LCD_InitStructure.dat = (u8*)&"桃之夭夭有蕡其实";
	LCD12864_Write_Word(LCD_InitStructure);
	
	LCD_InitStructure.com = 0x98;	//0x98-0x9F 16 8
	LCD_InitStructure.num =16;
	LCD_InitStructure.dat = (u8*)&"之子于归宜其家室";
	LCD12864_Write_Word(LCD_InitStructure);
	
	Delay_ms(500);	//等待500ms
	
	LCD12864_Write_CMD_Data(CMD,0x01);	//清屏
	while(1)
	{
		uint8_t i;
		for(i=0;i<200;i++)
		{
			LCD12864_Write_Number(0x90,i);		//第二行显示动态的数字
			Delay_ms(200);
		}
	}
}

到了这里,关于STM32 使用LCD12864显示屏(串行方式)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32-基本知识梳理10-FSMC控制ST7789V-LCD液晶显示屏

    一、ST7789V-LCD液晶显示 1,一种计算机的I/O设备,即输入输出设备; 2,数据传递结构,光线的传递通过偏光片进行调整,最终传递到滤光片上,进而不同RGB数据点,即像素点; 3, LCD显示器的关键参数 ①像素:显示器的像素指它成像最小的点 ②分辨率:像素点的个数的乘积

    2024年02月12日
    浏览(48)
  • ESP32设备驱动-I2C-LCD1602显示屏驱动

    LCD1602液晶显示器是广泛使用的一种字符型液晶显示模块。它是由字符型液晶显示屏(LCD)、控制驱动主电路HD44780及其扩展驱动电路HD44100,以及少量电阻、电容元件和结构件等装配在PCB板上而组成。 通过前面的实例我们知道,并口方式连接LCD1602将占用一定数量的GPIO口,在

    2024年02月07日
    浏览(54)
  • STM32-OLED显示屏

    *本文采用的OLED显示屏为4针脚IIC显示屏,4针脚分别为GND,VCC,SCL,SDA OLED.C OLED_Font.h main.c

    2024年02月05日
    浏览(49)
  • STM32——OLED显示屏(4)

    目录 一、调试方式 二、OLED简介 三、OLED硬件电路 四、OLED驱动函数 五、OLED显示屏使用 1、硬件接线图 2、添加OLED驱动函数 3、程序 4、实物展示  六、Keil软件自带调试模式         对于单片机的编程而言,经常会遇到一个很大的问题,就是程序调试,单片机不像电脑,电

    2024年02月03日
    浏览(52)
  • STM32 软件IIC 控制OLED 显示屏

    需要看原理图了

    2024年02月09日
    浏览(54)
  • STM32学习记录0010——TFTLCD液晶显示屏

    《STM32不完全手册》第18章 《ILI9341数据手册》 TFT-LCD 即薄膜晶体管液晶显示器。其英文全称为:Thin Film Transistor-Liquid Crystal Display。TFT-LCD与无源 TN-LCD、STN-LCD 的简单矩阵不同,它在液晶显示屏的每一个象素上都设置有一个薄膜晶体管(TFT),可有效地克服非选通时的串扰,使

    2023年04月09日
    浏览(48)
  • STM32F103驱动oled显示屏

    oled显示屏和其他显示屏类似,不过他只有0.96英寸,屏幕较小,但是使用起来比较方便。有二种驱动方式,分别为IIC,和SPI驱动。驱动方式比较简单。IIC驱动的话只需要4根线,电源,地线,数据线,和时钟线。 我这里使用的是IIC协议驱动oled显示屏,如果想了解IIC协议的可以看

    2024年02月11日
    浏览(52)
  • 【STM32】SPI通讯控制ILI9341显示屏

    ILI9341是一款分辨率为 240x320 分辨率 的a- tft液晶显示单片SOC驱动,由720通道源驱动、320通道门驱动、 172800字节GRAM (240RGBx320点位图形显示数据)和电源电路组成。 ILI9341支持并行8-/9-/16-/18位数据总线MCU接口,6-/16-/18位数据总线RGB接口和3 /4线串行外围接口 SPI通讯 。通过窗口地址函

    2024年01月21日
    浏览(50)
  • FPGA实现LCD显示屏显示彩条

    目录 总体设计  读显示屏ID  读显示屏ID代码 时钟分频  时钟分频代码  LCD显示 lcd显示模块 LCD驱动模块 lcd驱动代码 顶层模块 顶层模块代码 系统总体分为五个模块,分别是:rd_id(读显示屏ID模块),clk_div(时钟分频模块),lcd_display(lcd屏显示模块),lcd_driver(lcd屏驱动模块),和顶

    2024年02月16日
    浏览(39)
  • 5、江科大stm32视频学习笔记——OLED显示屏

    目录 1、OLED简介  2、OLED硬件电路 3、OLED驱动函函数简介和应用 4、用keil进行调试 4引脚OLED SCL和SDA是I2C通信引脚,需要接在I2C通信的引脚上 实验中用的模块是GPIO口模拟的I2C通信,故SCL和SDA两个端口可以接在任意的GPIO口上 7引脚OLED 右边5个引脚是SPI通信协议的引脚 如果是GPI

    2024年02月14日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包