LCD2004a + STM32F103RCT6 硬件&hi2c 驱动程序

一、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");


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值