TIN & HỌC TiiL

>> Học từ xa theo cách của bạn <<

Lập trình STM32 – Kết nối LCD trực tiếp


LCD là một màn hình nhiều điểm ảnh, có thể coi là một Led ma trận dạng lớn, tuy nhiên chúng ta không cần đi vào điều khiển từng Pixel hay là từng chấm nhỏ như bài led ma trận.

Ta sẽ điều khiển qua lệnh, con trỏ… để hiển thị thông tin một cách dễ dàng hơn. Có nhiều loại LCD, trong bài này ta dùng loại đơn giản 16×2.

Cấu tạo màn hình LCD


Chân Ký hiệu   Mô tả   Giá trị
  1   VSS   GND   0V
  2   VCC   5V
  3   V0   Độ tương phản
  4   RS   Lựa chọn thanh ghi  RS=0 (mức thấp) chọn thanh ghi lệnh

RS=1 (mức cao) chọn thanh ghi dữ liệu

  5   R/W   Chọn thanh ghi đọc/viết dữ liệu  R/W=0 thanh ghi viết

R/W=1 thanh ghi đọc

  6   E   Enable
  7   DB0   Chân truyền dữ liệu   8 bit: DB0DB7
  8   DB1
  9   DB2
  10   DB3
  11   DB4
  12   DB5
  13   DB6
  14   DB7
  15   A   Cực dương led nền   0V đến 5V
  16   K   Cực âm led nền   0V

Hình mô phỏng trong Proteus

Tiếp theo chúng ta học về cách kết nối, lập trình để sử dụng LCD. Trước tiên chúng ta phải gửi lệnh vào cho LCD biết nó phải làm gì. Cách gửi lệnh như sau:

Các em có thể xem một số lệnh sau đây. Những lệnh này gọi là lệnh khởi tạo LCD.

Sau khi gửi các lệnh vào LCD (qua các chân D0 – D7) để nó biết sẽ phải làm gì (bật màn hình, hiển thị hay tắt con trỏ, di chuyển con trỏ …), chúng ta sẽ phải gửi lệnh chứa các kí tự mà chúng ta muốn hiển thị. Cách gửi dữ liệu ra cũng tương tự như cách gửi lệnh, các em có thể xem trong hình sau:

Bước 1 thường là mặc định. Các bước sau tương tự như việc gửi lệnh vào LCD. Tại sao B1 lại là mặc định, vì chúng ta thường dùng LCD để hiển thị chứ không để nhận dữ liệu vào.

Ví dụ Kết nối và Lập trình STM32 với LCD

  1. Sơ đồ kết nối, và kết quả thực hiện

2. Full code đến hết hàm main

 

#include "main.h"
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
// Ham gui data/cmd ra 8 chan cua LCD
void send8BitLCD(char D) {
	// Dem D and so hoc voi 2^i de biet bit thu i =0 hay khac ko
	// tim gia tri cac bit
	int b0,b1,b2, b3,b4, b5, b6, b7;
  if ((D & 1) == 0)  b0=0;              // 1== 2^0
  else b0 =1;
  if ((D & 2) == 0)  b1=0;              // 2== 2^1
  else b1 =1;
  if ((D & 4) == 0)  b2=0;              // 4== 2^2
  else b2 =1;
  if ((D & 8) == 0)  b3=0;              // 8== 2^3
  else b3 =1;
  if ((D & 16) == 0)  b4=0;              // 16== 2^4
  else b4 =1;
  if ((D & 32) == 0)  b5=0;              // 32== 2^5
  else b5 =1;
  if ((D & 64) == 0)  b6=0;              // 64== 2^6
  else b6 =1;
  if ((D & 128) == 0)  b7=0;              // 128== 2^7
  else b7 =1;
  HAL_GPIO_WritePin(GPIOD,GPIO_PIN_0, b0);
  HAL_GPIO_WritePin(GPIOD,GPIO_PIN_1, b1);
  HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2, b2);
  HAL_GPIO_WritePin(GPIOD,GPIO_PIN_3, b3);
  HAL_GPIO_WritePin(GPIOD,GPIO_PIN_4, b4);
  HAL_GPIO_WritePin(GPIOD,GPIO_PIN_5, b5);
  HAL_GPIO_WritePin(GPIOD,GPIO_PIN_6, b6);
  HAL_GPIO_WritePin(GPIOD,GPIO_PIN_7, b7);
}

// Ham gui lenh
void sendCMD2LCD(char cmd) {
	//B1. Done
	//B2. Dat chan RS =0, de noi rang cmd  là lenh
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3,  GPIO_PIN_RESET);
	//B3. Gui 8 bit CMD vao 8 pin
	send8BitLCD(cmd);
	//B4. Enable cho cmd-->lcd
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4,  GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4,  GPIO_PIN_SET);
	//
	HAL_Delay(1);
}
// Ham gui ky tu hien thi
void sendChar2LCD(char Char) {
	//B1. Done
	//B2. Dat chan RS =1,  
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3,  GPIO_PIN_SET);
	//B3. Gui 8 bit CMD vao 8 pin
	send8BitLCD(Char);
	//B4. Enable cho cmd-->lcd
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4,  GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4,  GPIO_PIN_SET);
	//
	HAL_Delay(1);
}
void sendString2LCD(char *str) {
   for (int i=0; str[i] != '\0';  i++) {
			sendChar2LCD(str[i]);
   } 	
}



int main(void)
{
   HAL_Init();
   SystemClock_Config();
   MX_GPIO_Init();
	 
   // Xoa noi dung tren LCD
   sendCMD2LCD(0x01);	
	 // Bat hien thi man hinh, tat con tro
	 sendCMD2LCD(0x0C);	
	 // Test thu chuoi Hello
	 sendString2LCD("Hello K17 TNU");	
	 // Xuong dong 2
	 sendCMD2LCD(0x38);   // CHE DO 2 DONG
	 sendCMD2LCD(0xC0);	  // TRO XUONG DONG 2 
	 sendString2LCD("MAI CUONG THO");	
	 HAL_Delay(1000);
	
   while (1)
   {
   }

}

Xuất giá trị số ra LCD

Sử dụng hàm, chuyển đổi con số ra chuỗi ký tự số, rồi gọi hàm hiện chuỗi

Dưới đây là code hàm chuyển đổi

 

/*Function return size of string and convert signed  *
 *integer to ascii value and store them in array of  *
 *character with NULL at the end of the array        */

int Num2String(int value,char *ptr)
     {
        int count=0,temp;
        if(ptr==NULL)
            return 0;   
        if(value==0)
        {   
            *ptr='0';
            return 1;
        }

        if(value<0)
        {
            value*=(-1);    
            *ptr++='-';
            count++;
        }
        for(temp=value;temp>0;temp/=10,ptr++);
        *ptr='\0';
        for(temp=value;temp>0;temp/=10)
        {
            *--ptr=temp%10+'0';
            count++;
        }
        return count;
     }

Sử dụng hàm:

 

char str[10];
Num2String(-150,str);
sendString2LCD(str);	

 

Full video hướng dẫn

Về biên tập viên:Thầy TiiL

một GV Đại học. TiiL đã phụ trách một số môn học như: Lập trình Java, Phát triển web với Java, Lập trình thiết bị di động, Lập trình hệ thống nhúng và IoT.

Thẻ: