设为首页 加入收藏

TOP

普冉PY32系列(六) 通过I2C接口驱动PCF8574扩展的1602LCD(三)
2023-07-23 13:28:48 】 浏览:68
Tags:普冉 PY32 系列 通过 I2C PCF8574 1602LCD
ErrorStatus status; for(;;) { status = BSP_I2C_IsDeviceReady(lcd_addr, 5000); if(status == SUCCESS) { break; } } uint8_t up = data & 0xF0; uint8_t lo = (data << 4) & 0xF0; uint8_t data_arr[4]; data_arr[0] = up|flags|BACKLIGHT|PIN_EN; data_arr[1] = up|flags|BACKLIGHT; data_arr[2] = lo|flags|BACKLIGHT|PIN_EN; data_arr[3] = lo|flags|BACKLIGHT; status = BSP_I2C_MasterTransmit(lcd_addr, data_arr, sizeof(data_arr), 5000); LL_mDelay(LCD1602_DELAY); return status; } void LCD_SendCommand(uint8_t lcd_addr, uint8_t cmd) { LCD_SendInternal(lcd_addr, cmd, 0); } void LCD_SendData(uint8_t lcd_addr, uint8_t data) { LCD_SendInternal(lcd_addr, data, PIN_RS); } void LCD_SendString(uint8_t lcd_addr, char *str) { while (*str) { LCD_SendData(lcd_addr, (uint8_t)(*str)); str++; } }

初始化设置

void LCD_Init(uint8_t lcd_addr)
{
  // need at least 40ms after power rises above 2.7V
  LL_mDelay(50);
  // start in 8-bit mode, 3 commands
  LCD_SendCommand(lcd_addr, LCD1602_CMD_FUNC_8B_1L_5X8);
  LCD_SendCommand(lcd_addr, LCD1602_CMD_FUNC_8B_1L_5X8);
  LCD_SendCommand(lcd_addr, LCD1602_CMD_FUNC_8B_1L_5X8);
  // set it to 4-bit mode, interface is still 8-bit
  LCD_SendCommand(lcd_addr, LCD1602_CMD_FUNC_4B_1L_5X8);

  // now interface is 4-bit, set it to 2 lines and 5x8 font
  LCD_SendCommand(lcd_addr, LCD1602_CMD_FUNC_4B_2L_5X8);
  // display & cursor home
  LCD_SendCommand(lcd_addr, LCD1602_CMD_HOME);
  // display on, right shift, underline off, blink off
  LCD_SendCommand(lcd_addr, LCD1602_CMD_MODE_ON_CURSOR_BLNK);
  // move direction right
  LCD_SendCommand(lcd_addr, LCD1602_CMD_DIRECTION_RIGHT);
  // clear display (optional here)
  LCD_SendCommand(lcd_addr, LCD1602_CMD_CLEAR_DISPLAY);
}

功能操作

清除屏幕

LCD_SendCommand(LCD1602_I2C_ADDR, LCD1602_CMD_CLEAR_DISPLAY);

移动光标, 输出文字

// move cursor to 0,0
LCD_SendCommand(LCD1602_I2C_ADDR, LCD1602_DDRAM_ROW0|0);
LCD_SendString(LCD1602_I2C_ADDR, " Using 1602 LCD");
// move cursor to 1,0
LCD_SendCommand(LCD1602_I2C_ADDR, LCD1602_DDRAM_ROW1|0);
LCD_SendString(LCD1602_I2C_ADDR, "  over I2C bus");

通过 CGRAM 设置 自定义字符

// CGRAM test
for (i = 0; i < 8; i++)
{
  LCD_SetCGRAM(LCD1602_I2C_ADDR, i, &cgrom[i * 8]);
}

展示自定义字符

for (i = 0; i < 8; i++)
{
  LCD_SendData(LCD1602_I2C_ADDR, i);
  LL_mDelay(200);
}

显示整体左右平移

// Shift display test
LCD_SendCommand(LCD1602_I2C_ADDR, LCD1602_CMD_CLEAR_DISPLAY);
LL_mDelay(500);
LCD_SendCommand(LCD1602_I2C_ADDR, LCD1602_DDRAM_ROW0|9);
LCD_SendString(LCD1602_I2C_ADDR, "Shift");
LCD_SendCommand(LCD1602_I2C_ADDR, LCD1602_DDRAM_ROW1|8);
LCD_SendString(LCD1602_I2C_ADDR, "<<<->>>");
LL_mDelay(500);
for (i = 0; i < 8; i++)
{
  LCD_SendCommand(LCD1602_I2C_ADDR, LCD1602_CMD_DISPLAY_SHIFT_LEFT);
  LL_mDelay(200);
}
LL_mDelay(500);
for (i = 0; i < 8; i++)
{
  LCD_SendCommand(LCD1602_I2C_ADDR, LCD1602_CMD_DISPLAY_SHIFT_RIGHT);
  LL_mDelay(200);
}

左右移动光标

// Move cursor test
for (i = 0; i < 11; i++)
{
  LCD_SendCommand(LCD1602_I2C_ADDR, LCD1602_CMD_CURSOR_MOVE_LEFT);
  LL_mDelay(200);
}
LL_mDelay(500);
for (i = 0; i < 12; i++)
{
  LCD_SendCommand(LCD1602_I2C_ADDR, LCD1602_CMD_CURSOR_MOVE_RIGHT);
  LL_mDelay(200);
}

常见问题

1. 屏幕不显示

不显示的原因有很多, 如果确认代码和接线无误, 可能的原因有

  1. 检查1602LCD的供电电压是不是5V, 在3.3V下无法驱动,
首页 上一页 1 2 3 4 下一页 尾页 3/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇轻松玩转makefile | 变量与模式 下一篇树莓派烧录ubuntu 20.04.5

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目