STM32f103 HAL库 串行驱动LCD12864(ST7920)

有价值的参考网页主要有 :

https://blog.csdn.net/baidu_25117757/article/details/113664351https://blog.csdn.net/baidu_25117757/article/details/113664351https://blog.csdn.net/baidu_25117757/article/details/113664351

https://www.cnblogs.com/AChenWeiqiangA/p/13412185.htmlhttps://www.cnblogs.com/AChenWeiqiangA/p/13412185.htmlhttps://www.cnblogs.com/AChenWeiqiangA/p/13412185.htmlhttps://blog.csdn.net/HURUI123456789/article/details/52248254icon-default.png?t=LA23https://blog.csdn.net/HURUI123456789/article/details/52248254

看过这3个网页基本上就全了。

 我的错误包括时钟信号有效的设计,端口电平的设计,大小写的忽略。

在这里插入图片描述

时钟有效的正确设计如下。

void LCD_Send_byte(uint8_t a)	
{
	 uint8_t i;
	 for(i=8;i>0;i--)
	 {	 if(a&0x80)	//从高位开始送
			{LCD_RW_IO_H;}
		 else
			{LCD_RW_IO_L;}		
		 		 
		 LCD_E_clk_L; 
		 delay_us(3);
		 LCD_E_clk_H;	//上升沿发送数据
		 delay_us(3);
		 a<<=1;
	}
}
uint8_t LCD_Read_byte(void)
{
	uint8_t i,dat=0;
	for(i=8;i>0;i--)
	{
		LCD_E_clk_L;
		delay_us(3);
		
		LCD_E_clk_H;//上升沿接收数据
		delay_us(3);
		
		if(LCD_IO_Read()) //输入
		{dat|=(0x01<<(i-1));}
	} 
	return dat;
}

端口电平的正确设计如下。错误在于直接拷贝了led电平设计代码,忘记了led点亮是低电平有效,led的亮输出为GPIO_PIN_RESET,LCD12864的高电平应设置为GPIO_PIN_SET。

//led亮需要输出低电平
#define LED1_ON                       HAL_GPIO_WritePin(LED1_GPIO,LED1_GPIO_PIN,GPIO_PIN_RESET)    // 输出高电平
#define LED1_OFF                      HAL_GPIO_WritePin(LED1_GPIO,LED1_GPIO_PIN,GPIO_PIN_SET)  // 输出低电平
//lcd12864 端口电平正确设计
#define LCD_RS_CS_H           HAL_GPIO_WritePin(LCD_RS_GPIO,LCD_RS_CS,GPIO_PIN_SET)    // 输出高电平
#define LCD_RS_CS_L           HAL_GPIO_WritePin(LCD_RS_GPIO,LCD_RS_CS,GPIO_PIN_RESET)  // 输出低电平

LCD_WriteData函数定义没有问题,引用的时候写成了Lcd_WriteData,系统提示function declared implicitly,就是大小写的区别。

端口管脚设置代码如下。

//IO初始化
void LCD_GPIO_Config(void)
{	
	GPIO_InitTypeDef GPIO_InitStruct;
	
	LCD_RS_RCC_CLK_ENABLE();

	GPIO_InitStruct.Pin = LCD_RS_CS;
	GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
	GPIO_InitStruct.Pull = GPIO_NOPULL;
	GPIO_InitStruct.Speed =GPIO_SPEED_FREQ_HIGH;
	HAL_GPIO_Init(LCD_RS_GPIO, &GPIO_InitStruct); 

	LCD_RW_RCC_CLK_ENABLE();

	GPIO_InitStruct.Pin = LCD_RW_IO;
	GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
	GPIO_InitStruct.Pull = GPIO_NOPULL;
	GPIO_InitStruct.Speed =GPIO_SPEED_FREQ_HIGH;
	HAL_GPIO_Init(LCD_RW_GPIO, &GPIO_InitStruct); 

	LCD_EN_RCC_CLK_ENABLE();	
	
	GPIO_InitStruct.Pin = LCD_E_clk;
	GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
	GPIO_InitStruct.Pull = GPIO_NOPULL;
	GPIO_InitStruct.Speed =GPIO_SPEED_FREQ_HIGH;
	HAL_GPIO_Init(LCD_E_GPIO, &GPIO_InitStruct); 
}

问题现象代码如下。为何LCD_opening函数在main.c中lcd显示正常,放在lcd12864.c中由main调用就是乱码?

void LCD_opening(void)
{
  uint8_t str1[]="测力系统";
  
  LCD_display_str(1,1,str1);//x1-4 y1-8

}

  • 2
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32F103是一款由意法半导体(STMicroelectronics)开发的32位ARM Cortex-M3微控制器。它具有丰富的外设资源和灵活的系统配置,非常适合各种嵌入式应用。 HAL库STM32Cube软件套件提供的一种高级抽象层级。它简化了STM32系列微控制器的软件开发过程,并提供了一系列API函数,方便用户使用各种外设功能。HAL库提供对I2C总线等通信接口的支持,以便与外部器件进行通信。 24C02是一个很常见的串行EEPROM芯片,它在I2C总线上工作,可提供2K字节的存储容量,即256个字节。使用STM32F103与24C02进行通信时,可以使用HAL库中的I2C函数来实现。 首先,需要初始化I2C外设,设置通信速率、时钟极性和时钟相位等参数。然后,可以使用HAL库提供的函数来编写读取和写入24C02中存储数据的代码。例如,通过调用HAL_I2C_Master_Transmit函数,可以向24C02发送写入命令和要写入的数据;通过调用HAL_I2C_Master_Receive函数,可以从24C02接收数据。 使用HAL库进行24C02的读写操作时,需要注意一些特殊的细节,例如ACK(应答)位的处理以及页面写入等。可以参考HAL库的文档或官方示例代码来获得更详细的信息。 综上所述,使用STM32F103HAL库与24C02进行通信是一种相对简单和方便的方法,适用于各种应用场景,如数据存储、参数配置等。但需要熟悉HAL库的函数和24C02的通信协议,以确保正确进行读写操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值