STM32驱动LCD12864(串行模式)

Posted 文某9

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32驱动LCD12864(串行模式)相关的知识,希望对你有一定的参考价值。

效果呈现

引脚定义:(VCC接入先询问厂家供电)

PIN1——GND

PIN2——5V

PIN3——不接

PIN4——RS(CS)

PIN5——R/W(SID)

PIN6——E(SCK)

PIN7——不接

PIN8——不接

PIN9——不接

PIN10——不接

PIN11——不接

PIN12——不接

PIN13——不接

PIN14——不接

PIN15——GND

PIN16——不接

PIN17——不接

PIN18——不接

PIN19——5V

PIN20——GND

代码部分(参考博主Z小旋)这位博主是F4驱动的,我修改为了F1驱动和IO口的配置

lcd12684.C

#include "lcd12864.H"
#include "delay.h"

/*! 
*  @brief      GPIO_init
 *  @since      v1.0
 *  @param  None
 *  @author     Z小旋
 *  使用时自行修改这里的初始化即可
 */



void lcd_GPIO_init()

 
 GPIO_InitTypeDef  GPIO_InitStructure; 	
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);	 //使能PB,PE端口时钟
	
 GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0 | GPIO_Pin_1;				 //LED0-->PB.5 端口配置
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
 
 GPIO_Init(GPIOB, &GPIO_InitStructure);					 //根据设定参数初始化GPIOB.5
 GPIO_SetBits(GPIOB,GPIO_Pin_5);						 //PB.5 输出高
 SID=1;
 SCLK=1;

 









/* 字符显示RAM地址    4行8列 */
u8 LCD_addr[4][8]=
	0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,  		//第一行
	0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,		//第二行
	0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F,		//第三行
	0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F		//第四行
	;






/*! 
*  @brief      LCD串行发送一个字节
 *  @since      v1.0
 *  @param  byte   写入字节
 *  @author     Z小旋
 */
void SendByte(u8 byte)

     u8 i; 
	  for(i = 0;i < 8;i++)
    
			if((byte << i) & 0x80)  //0x80(1000 0000)  只会保留最高位
			
				SID = 1;           // 引脚输出高电平,代表发送1
			
			else
			
				SID = 0;         // 引脚输出低电平,代表发送0
			
		/*或		
			SID =	(Dbyte << i) & 0x80;
				
			上面那样为了方便理解
		*/
			SCLK = 0;   //时钟线置低  允许SID变化
			delay_us(5); //延时使数据写入
			SCLK = 1;    //拉高时钟,让从机读SID
		   



/*! 
 *  @brief      LCD写指令
 *  @since      v1.0
 *  @param  Cmd   要写入的指令
 *  @author     Z小旋
 */
void Lcd_WriteCmd(u8 Cmd )

     delay_ms(1);     //由于我们没有写LCD正忙的检测,所以直接延时1ms,使每次写入数据或指令间隔大于1ms 便可不用写忙状态检测
     SendByte(WRITE_CMD);            //11111,RW(0),RS(0),0   
     SendByte(0xf0&Cmd);      //高四位
     SendByte(Cmd<<4);   //低四位(先执行<<)


/*! 
 *  @brief      LCD写数据
 *  @since      v1.0
 *  @param  Dat   要写入的数据
 *  @author     Z小旋
 */
void Lcd_WriteData(u8 Dat )

     delay_ms(1);     
     SendByte(WRITE_DAT);            //11111,RW(0),RS(1),0
     SendByte(0xf0&Dat);      //高四位
     SendByte(Dat<<4);   //低四位(先执行<<)

/*! 
 *  @brief      LCD初始化
 *  @since      v1.0
 *  @param  None
 *  @author     Z小旋
 */
void Lcd_Init(void)
 
delay_ms(50);   	//等待液晶自检(延时>40ms)
	Lcd_WriteCmd(0x30);        //功能设定:选择基本指令集
delay_ms(1);//延时>100us
	Lcd_WriteCmd(0x30);        //功能设定:选择8bit数据流
delay_ms(1);	//延时>37us
    Lcd_WriteCmd(0x0c);        //开显示
delay_ms(1);	//延时>100us
    Lcd_WriteCmd(0x01);        //清除显示,并且设定地址指针为00H
delay_ms(30);	//延时>10ms
		Lcd_WriteCmd(0x06);        //进入设定点,初始化完成



/*! 
 *  @brief      显示字符或汉字
 *  @since      v1.0
 *  @param  x: row(0~3)
 *  @param  y: line(0~7) 
 *  @param 	str: 要显示的字符或汉字
 *  @author     Z小旋
 */
void LCD_Display_Words(uint8_t x,uint8_t y,uint8_t*str)
 
	Lcd_WriteCmd(LCD_addr[x][y]); //写初始光标位置
	while(*str>0)
     
      Lcd_WriteData(*str);    //写数据
      str++;     
    

/*! 
 *  @brief      显示图片
 *  @since      v1.0
 *  @param  *pic   图片地址
 *  @author     
 */
void LCD_Display_Picture(uint8_t *img)
	
		uint8_t x,y,i;
		Lcd_WriteCmd(0x34);		//切换到扩充指令
		Lcd_WriteCmd(0x34);		//关闭图形显示
		for(i = 0; i < 1; i++)   //上下屏写入
		
			for(y=0;y<32;y++)   //垂直Y写32次
			  
				for(x=0;x<8;x++)   //横向X写8次
				
					Lcd_WriteCmd(0x80 + y);		//行地址
					Lcd_WriteCmd(0x80 + x+i);		//列地址
					Lcd_WriteData(*img ++);		//写高位字节数据 D15-D8   
					Lcd_WriteData(*img ++);		//写低位字节数据 D7-D0
				
			
		
		Lcd_WriteCmd(0x36);//打开图形显示		
		Lcd_WriteCmd(0x30);        //切换回基本指令
		
/*! 
 *  @brief      清屏函数
 *  @since      v1.0
 *  @param  None
 *  @author     Z小旋
 */
void LCD_Clear(void)
	
		Lcd_WriteCmd(0x01);			//清屏指令
		delay_ms(2);				//延时以待液晶稳定【至少1.6ms】
	
	

lcd12684.h

#ifndef __lcd12864_H_
#define __lcd12864_H_


#include "sys.h"

#define WRITE_CMD	0xF8//写命令  
#define WRITE_DAT	0xFA//写数据

//接口(SID: PE1  SCLK: PE0) 
#define SID PBout(1)
#define SCLK PBout(0)


void lcd_GPIO_init(void);
void Lcd_Init(void);

void SendByte(u8 Dbyte);
void LCD_Clear(void);
void LCD_Display_Words(uint8_t x,uint8_t y,uint8_t*str);
void LCD_Display_Picture(uint8_t *img);

void Lcd_WriteData(u8 Dat );
void Lcd_WriteCmd(u8 Cmd );

#endif

因为lcd12684自带字库,所以无需再取字模。

资源免费分享,评论区获取。

以上是关于STM32驱动LCD12864(串行模式)的主要内容,如果未能解决你的问题,请参考以下文章

FPGA nios软核编写液晶屏LCD12864驱动程序源码以及注意事项,本人亲自踩坑,重要!!!

如何用STM32驱动诺基亚5110显示屏?

如何用STM32驱动诺基亚5110显示屏?

如何用STM32驱动诺基亚5110显示屏?

ST7920芯片硬件SPI串行 stm32f103c8单片机移植u8g2后,定做一幅高清的logo

51单片机ST7920的LCD12864屏幕驱动显示