一、LCD2004a模块外观
二、时钟配置 STM32F103RCT6
硬件I2C配置 &hi2c1
三、驱动程序编写
i2c-lcd20x4.h
#ifndef __I2C_LCD_20x4_H
#define __I2C_LCD_20x4_H
#include "gpio.h"
void lcd_init (void); // initialize lcd
void lcd_send_cmd (char cmd); // send command to the lcd
void lcd_send_data (char data); // send data to the lcd
void lcd_send_string (char *str); // send string to the lcd
void lcd_put_cur(int row, int col); // put cursor at the entered position row (0 or 1), col (0-19);
void lcd_clear (void); // lcd clear
#endif
i2c-lcd20x4.c
/** Put this in the src folder **/
#include "i2c-lcd_20x4.h"
extern I2C_HandleTypeDef hi2c1; // change your handler here accordingly
#define SLAVE_ADDRESS_LCD 0x4E // change this according to ur setup
//发送命令函数
void lcd_send_cmd (char cmd)
{
char data_u, data_l;
uint8_t data_t[4];
data_u = (cmd&0xf0);
data_l = ((cmd<<4)&0xf0);
data_t[0] = data_u|0x0C; //en=1, rs=0
data_t[1] = data_u|0x08; //en=0, rs=0
data_t[2] = data_l|0x0C; //en=1, rs=0
data_t[3] = data_l|0x08; //en=0, rs=0
HAL_I2C_Master_Transmit (&hi2c1, SLAVE_ADDRESS_LCD,(uint8_t *) data_t, 4, 100);
}
//发送数据函数
void lcd_send_data (char data)
{
char data_u, data_l;
uint8_t data_t[4];
data_u = (data&0xf0);
data_l = ((data<<4)&0xf0);
data_t[0] = data_u|0x0D; //en=1, rs=0
data_t[1] = data_u|0x09; //en=0, rs=0
data_t[2] = data_l|0x0D; //en=1, rs=0
data_t[3] = data_l|0x09; //en=0, rs=0
HAL_I2C_Master_Transmit (&hi2c1, SLAVE_ADDRESS_LCD,(uint8_t *) data_t, 4, 100);
}
//清屏函数
void lcd_clear (void)
{
lcd_send_cmd (0x80);
for (int i=0; i<80; i++)
{
lcd_send_data (' ');
}
}
/************** LCD 20x4 AC set *****************************
| RS | RW | DB7 | DB6 | DB5 | DB4 | DB3 | DB2 | DB1 | DB0 |
---------------------------------------------------------
| 0 | 0 | 1 | AC6 | AC5 | AC4 | AC3 | AC2 | AC1 | AC0 |
************************************************************/
/************** LCD 20x4 Display address (DDRAM) ***************
| (行/列) | 列1 | 列2 | 列3 | ...... | 列18 | 列19 | 列20 |
-------------------------------------------------------------
| 1st line | 0x00 | 0x01 | 0x03 | ...... | 0x11 | 0x12 | 0x13 |
-------------------------------------------------------------
| 2nd line | 0x40 | 0x41 | 0x42 | ...... | 0x51 | 0x52 | 0x53 |
-------------------------------------------------------------
| 3rd line | 0x14 | 0x15 | 0x16 | ...... | 0x25 | 0x26 | 0x27 |
-------------------------------------------------------------
| 4th line | 0x54 | 0x55 | 0x56 | ...... | 0x65 | 0x66 | 0x67 |
***************************************************************/
// AC
// 1st line: 0x80
// 2nd line: 0xc0
// 3rd line: 0x94
// 4th line: 0xD4
//光标指向函数
void lcd_put_cur(int row, int col)
{
switch (row)
{
case 0:
col |= 0x80; //1st line
break;
case 1:
col |= 0xC0; //2nd line
break;
case 2:
col |= 0x94; //3rd line
break;
case 3:
col |= 0xD4; //4th line
break;
}
lcd_send_cmd (col);
}
//Lcd-20x4初始化函数
void lcd_init (void)
{
// 4 bit initialisation
HAL_Delay(50); // wait for >40ms
lcd_send_cmd (0x30);
HAL_Delay(5); // wait for >4.1ms
lcd_send_cmd (0x30);
HAL_Delay(1); // wait for >100us
lcd_send_cmd (0x30);
HAL_Delay(10);
lcd_send_cmd (0x20); // 4bit mode
HAL_Delay(10);
// dislay initialisation
lcd_send_cmd (0x28); // Function set --> DL=0 (4 bit mode), N = 1 (2 line display) F = 0 (5x8 characters)
HAL_Delay(1);
lcd_send_cmd (0x08); //Display on/off control --> D=0,C=0, B=0 ---> display off
HAL_Delay(1);
lcd_send_cmd (0x01); // clear display
HAL_Delay(1);
HAL_Delay(1);
lcd_send_cmd (0x06); //Entry mode set --> I/D = 1 (increment cursor) & S = 0 (no shift)
HAL_Delay(1);
lcd_send_cmd (0x0C); //Display on/off control --> D = 1, C and B = 0. (Cursor and blink, last two bits)
}
//发送字串函数
void lcd_send_string (char *str)
{
while (*str) lcd_send_data (*str++);
}
my_main.c
//我的初始化函数
void my_init(void)
{
lcd_init(); //LCD20x4初始化
lcd_clear (); //清空LCD20x4
lcd_put_cur(0, 0);
}
//我的循环函数
void my_while(void)
{
//光标指向0行0列
lcd_put_cur(0, 0);
lcd_send_string("BI1RFK");
//光标指向1行0列
lcd_put_cur(1, 0);
lcd_send_string("BI1.RFK");
//光标指向2行0列
lcd_put_cur(2, 0);
lcd_send_string("bi1rfk");
//光标指向3行0列
lcd_put_cur(3, 0);
lcd_send_string("bi1.rfk");
}