基于stm32物联网开发板(2)--LCD屏幕_stm32 spi lcd

	//0x23--- 0010 0011
	data_rx<<=1;//默认读取到的数据为0
	if(SPI_MISO)data_rx=data_rx|0x01;
}
SPI_CLK=0;//空闲电平为低电平
return data_rx;

}


#### 2.2 硬件SPI配置


![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/7c768447e7ed4fbf856c60805c50be4d.png#pic_center)  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/129329f344b94cf8818c15153dd5e18b.png#pic_center)



uint8_t SPI1_WROneByte(uint8_t data)
{
HAL_SPI_Transmit(&hspi1,&data,1,100);
return 0;
}


关于SPI硬件配置详细介绍参考:[STM32 SPI硬件配置]( )


#### 2.2 写数据和写命令


  当采用SPI接口驱动时,D/C引脚作为数据命令选择脚,D/C=0时读写命令,D/C=1时读写数据。



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

/****************************************************
函数说明:LCD写入命令
入口数据:dat 写入的命令
返回值: 无
*****************************************************/
void LCD_WR_REG(u8 dat)
{
OLED_CS(0);
OLED_DC_Clr();//写命令
LCD_Writ_Bus(dat);
OLED_CS(1);
}


### 3.常用命令介绍


  (1)设置屏幕扫描方向0x36  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/98e28fd39feb4bc7b48b41e03a3cc183.png#pic_center)


* **参数说明:**  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/c92d47659ed44cb3bd4d2df04efada9e.png#pic_center)  
   (2)设置列(Column)地址0x2A


  0x2A指令用于设置列的起始地址和结束地址,XS<=XE。  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/3dc0281565bc46f5a732183a5090f4c3.png#pic_center)  
   (3)设置行(ROW)地址0x2B


  0x2B指令用于设置行的起始地址和结束地址,YS<=YE。  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/34b35174e3254b23ad770f3c1a6ead0a.png#pic_center)  
   (4)写GRAM指令0x2C  
   此命令用于将数据从MCU传输到帧存储器。接受此命令后,列寄存器和页寄存器将重置为起始列/起始页面位置。起始列/起始页的位置根据MADCTL设置而不同。发送任何其他命令都可以停止帧写入。  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/87b7270ad771438e92c549a0a3ee37db.png#pic_center)


### 4.ST7789驱动序列



void Lcd_Init(void)
{
OLED_RST_Clr();
Delay_Ms(200);
OLED_RST_Set();
Delay_Ms(20);
//************* Start Initial Sequence **********//
LCD_WR_REG(0x36);
if(USE_HORIZONTAL0)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);//竖屏

LCD_WR_REG(0x3A);
LCD_WR_DATA8(0x05);

LCD_WR_REG(0xB2);
LCD_WR_DATA8(0x0C);
LCD_WR_DATA8(0x0C);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x33);
LCD_WR_DATA8(0x33);

LCD_WR_REG(0xB7);
LCD_WR_DATA8(0x35);

LCD_WR_REG(0xBB);
LCD_WR_DATA8(0x19);

LCD_WR_REG(0xC0);
LCD_WR_DATA8(0x2C);

LCD_WR_REG(0xC2);
LCD_WR_DATA8(0x01);

LCD_WR_REG(0xC3);
LCD_WR_DATA8(0x12);

LCD_WR_REG(0xC4);
LCD_WR_DATA8(0x20);

LCD_WR_REG(0xC6);
LCD_WR_DATA8(0x0F);

LCD_WR_REG(0xD0);
LCD_WR_DATA8(0xA4);
LCD_WR_DATA8(0xA1);

LCD_WR_REG(0xE0);
LCD_WR_DATA8(0xD0);
LCD_WR_DATA8(0x04);
LCD_WR_DATA8(0x0D);
LCD_WR_DATA8(0x11);
LCD_WR_DATA8(0x13);
LCD_WR_DATA8(0x2B);
LCD_WR_DATA8(0x3F);
LCD_WR_DATA8(0x54);
LCD_WR_DATA8(0x4C);
LCD_WR_DATA8(0x18);
LCD_WR_DATA8(0x0D);
LCD_WR_DATA8(0x0B);
LCD_WR_DATA8(0x1F);
LCD_WR_DATA8(0x23);

LCD_WR_REG(0xE1);
LCD_WR_DATA8(0xD0);
LCD_WR_DATA8(0x04);
LCD_WR_DATA8(0x0C);
LCD_WR_DATA8(0x11);
LCD_WR_DATA8(0x13);
LCD_WR_DATA8(0x2C);
LCD_WR_DATA8(0x3F);
LCD_WR_DATA8(0x44);
LCD_WR_DATA8(0x51);
LCD_WR_DATA8(0x2F);
LCD_WR_DATA8(0x1F);
LCD_WR_DATA8(0x1F);
LCD_WR_DATA8(0x20);
LCD_WR_DATA8(0x23);
LCD_WR_REG(0x21);
LCD_WR_REG(0x11);
LCD_WR_REG(0x29);//开启显示
LCD_Clear(WHITE);//清屏
OLED_BLK_Set();//开背光
}


### 5.LCD屏示例


#### 5.1 横竖屏配置示例


  要实现屏幕横屏和竖屏效果,可设置屏幕扫描方向寄存器0x36。



#define USE_HORIZONTAL 0 //设置横屏或者竖屏显示 0或1为竖屏 2或3为横屏
/******************************************************************************
函数说明:设置起始和结束地址
入口数据:x1,x2 设置列的起始和结束地址
y1,y2 设置行的起始和结束地址
返回值: 无
******************************************************************************/
void LCD_Address_Set(u16 x1,u16 y1,u16 x2,u16 y2)
{
if(USE_HORIZONTAL0)
{
LCD_WR_REG(0x2a);//列地址设置
LCD_WR_DATA(x1);
LCD_WR_DATA(x2);
LCD_WR_REG(0x2b);//行地址设置
LCD_WR_DATA(y1);
LCD_WR_DATA(y2);
LCD_WR_REG(0x2c);//储存器写
}
else if(USE_HORIZONTAL
1)
{
LCD_WR_REG(0x2a);//列地址设置
LCD_WR_DATA(x1);
LCD_WR_DATA(x2);
LCD_WR_REG(0x2b);//行地址设置
LCD_WR_DATA(y1+80);
LCD_WR_DATA(y2+80);
LCD_WR_REG(0x2c);//储存器写
}
else if(USE_HORIZONTAL==2)
{
LCD_WR_REG(0x2a);//列地址设置
LCD_WR_DATA(x1);
LCD_WR_DATA(x2);
LCD_WR_REG(0x2b);//行地址设置
LCD_WR_DATA(y1);
LCD_WR_DATA(y2);
LCD_WR_REG(0x2c);//储存器写
}
else
{
LCD_WR_REG(0x2a);//列地址设置
LCD_WR_DATA(x1+80);
LCD_WR_DATA(x2+80);
LCD_WR_REG(0x2b);//行地址设置

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!

C1yHs-1715684171907)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!

  • 13
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值