HỌC VIỆN CƠNG NGHỆ BƯU CHÍNH VIỄN THƠNG
BÁO CÁO BÀI TẬP LỚN
Mơn học : Kĩ thuật vi xử lý
Nhóm bài tập lớn: 11
Đề tài: Chạy chữ quảng cáo lên LCD
Thành viên:
1. Phạm Minh Phú – B19DCVT285
2. Nguyễn Thành Nam – B19DCVT269
3. Nguyễn Văn Nguyên – B19DCVT277
4. Đoàn Ngọc Phúc – B19DCVT288
I. Giới thiệu về LCD 16x2 (LM016L)
LCD là gì?
LCD là một loại vật chất phản xạ ánh sáng khi điện thế thay đổi. Nó hoạt
động dựa trên nguyên tắc ánh sáng nền (Back Light). Nó bao gồm một lớp chất
lỏng nằm giữa 2 lớp kính phân cực ánh sáng. Bình thường, khi khơng có điện áp,
các tinh thể này được xếp thẳng hàng giữa hai lớp cho phép ánh sáng truyền qua
theo hình xoắn ốc. Hai bộ lọc phân cực, 2 bộ lọc màu và 2 bộ cân chỉnh sẽ xác
định cường độ ánh sáng đi qua và màu nào được tạo ra trên một pixel.
Khi có điện áp cấp vào, lớp canh chỉnh sẽ tạo một vùng điện tích, canh chỉnh
lại các tinh thể lỏng đó. Nó khơng cho phép ánh sáng đi qua để hiện thị lên hình
ảnh tại vị trí điểm ảnh đó. Các điểm ảnh trong màn hình LCD là một transistor cực
nhỏ ở một trong 2 chế độ: cho phép ánh sáng đi qua hoặc không.
Điểm ảnh bao gồm 3 yếu tố màu: đỏ, xanh lá, xanh dương. Các màn hình
LCD trước đây thường tiêu thụ điện năng nhiều, độ tương phản thấp cho đến khi
các nhà khoa học người Anh tìm ra “Biphenyl” – vật liệu chính của tinh thể lỏng,
thì LCD mới thực sự phổ biến. LCD xuất hiện đầu tiên trong các máy tính cầm tay,
trị chơi điện tử cầm tay, đồng hồ điện tử
Ngày nay, thiết bị hiển thị LCD 1602 (Liquid Crystal Display) được sử dụng
trong rất nhiều các ứng dụng của vi điều khiển. LCD 1602 có rất nhiều ưu điểm so
với các dạng hiển thị khác như: khả năng hiển thị kí tự đa dạng (chữ, số, kí tự đồ
họa); dễ dàng đưa vào mạch ứng dụng theo nhiều giao thức giao tiếp khác nhau,
tiêu tốn rất ít tài nguyên
hệ thống, giá thành rẻ,…
Cấu tạo:
Màn hình LCD1602 cấu
tạo từ 3 phần:
●
Chip driver: Điều
khiển LCD, giao tiếp
với vi điều khiển theo
interface LCD
●
LCD Panel: Hiển thị ra
bên ngồi
●
Back Light: Đèn nền
LCD
Thơng số kĩ thuật :
●
Điện áp hoạt
động là 5 V.
●
Kích thước: 80 x 36 x 12.5 mm
●
Chữ đen, nền xanh lá
●
Khoảng cách giữa hai chân kết nối là 0.1 inch tiện dụng khi kết nối với
Breadboard.
●
Tên các chân được ghi ở mặt sau của màn hình LCD hổ trợ việc kết nối,
đi dây điện.
●
Có đèn led nền, có thể dùng biến trở hoặc PWM điều chình độ sáng để sử
dụng ít điện năng hơn.
●
Có thể được điều khiển với 6 dây tín hiệu
Chức năng của từng chân LCD 1602:
- Chân số 1 - VSS : chân nối đất cho LCD được nối với GND của mạch điều khiển
- Chân số 2 - VDD : chân cấp nguồn cho LCD, được nối với VCC=5V của mạch
điều khiển
- Chân số 3 - VE : điều chỉnh độ tương phản của LCD
- Chân số 4 - RS : chân chọn thanh ghi, được nối với logic "0" hoặc logic "1":
+ Logic “0”: Bus DB0 - DB7 sẽ nối với thanh ghi lệnh IR của LCD (ở chế độ
“ghi” - write) hoặc nối với bộ đếm địa chỉ của LCD (ở chế độ “đọc” - read)
+ Logic “1”: Bus DB0 - DB7 sẽ nối với thanh ghi dữ liệu DR bên trong LCD
- Chân số 5 - R/W : chân chọn chế độ đọc/ghi (Read/Write), được nối với logic “0”
để ghi hoặc nối với logic “1” đọc
- Chân số 6 - E : chân cho phép (Enable). Sau khi các tín hiệu được đặt lên bus
DB0-DB7, các lệnh chỉ được chấp nhận khi có 1 xung cho phép của chân này:
+ Ở chế độ ghi: Dữ liệu ở bus sẽ được LCD chuyển vào thanh ghi bên trong khi
phát hiện một xung (high-to-low transition) của tín hiệu chân E
+ Ở chế độ đọc: Dữ liệu sẽ được LCD xuất ra DB0-DB7 khi phát hiện cạnh lên
(low-to-high transition) ở chân E và được LCD giữ ở bus đến khi nào chân E
xuống mức thấp
- Chân số 7 đến 14 - D0 đến D7: 8 đường của bus dữ liệu dùng để trao đổi thơng
tin với MPU. Có 2 chế độ sử dụng 8 đường bus này là: Chế độ 8 bit (dữ liệu được
truyền trên cả 8 đường, với bit MSB là bit DB7) và Chế độ 4 bit (dữ liệu được
truyền trên 4 đường từ DB4 tới DB7, bit MSB là DB7)
II. Quá trình gửi lệnh lcd
Bước 1: Kéo chân RW xuống mức
thấp nhất để chọn chế độ là
“ghi”
Bước 2: Kéo chân rs xuống mức thấp
nhất để cho led LCD hiểu
được là ghi lệnh chứ không
phải ghi dữ liệu
Bước 3: Gửi byte lệnh ra các chân
D7->D0
Bước 4: Tạo xung trên chân E bằng
cách kéo chân E xuống mức
không rồi lại kéo lên 1 hoặc
ngược lại
Bước 5: Delay 1 khoảng thời gian để
led LCD thực hiện xong lệnh
III. Code
#include "stm32f10x.h"
#include "stm32f10x_conf.h"
#include "stm32f10x_gpio.h"
////// khoi tao cac chan led LCD BUTTON va cac chan pin///////////////////
#define LCD_RW GPIO_Pin_13
#define LCD_RS GPIO_Pin_14 // Chan chon thanh ghi RS = 0 cho phep ghi RS = 1 thanh ghi
doc
#define LCD_EN GPIO_Pin_15 // chan cho phep hoat dong LCD va tao xung
#define LCD_D4 GPIO_Pin_0
#define LCD_D5 GPIO_Pin_1
#define LCD_D6 GPIO_Pin_2
#define LCD_D7 GPIO_Pin_3
#define BT1 GPIO_Pin_0
#define BT2 GPIO_Pin_1
#define BT3 GPIO_Pin_2
//////cau hinh cho led LCD//////////////
void LCD_Configure(){
// cap clock cho port C
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure; //tao ham GPIO_InitStructure
//cau hinh cho LCD là out put _ push-pull
GPIO_InitStructure.GPIO_Mode
= GPIO_Mode_Out_PP;
// khai bao cac chan su dung
GPIO_InitStructure.GPIO_Pin
LCD_D4 | LCD_D5 | LCD_D6 | LCD_D7;
= LCD_RW | LCD_RS | LCD_EN |
// cau hinh toc do cho cac chan
GPIO_InitStructure.GPIO_Speed
= GPIO_Speed_50MHz;
// luu cac gia tri vao ham GPIO_ InitStructure
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
/////cau hình cho button///////////////
void Button_Configue(){
RCC -> APB2ENR |= 0x00000008;
//cap clock cho port B
GPIOB -> CRL |= 0xFFFFF000;
// cau hinh cho chan pin 0,1,2
GPIOB -> CRL |= 0x00000888;
// moi chan set cau hình input : 1000
GPIOB -> ODR
// cau hinh cho push down
&=~(0x07);
}
/////tao ham delay ms/////////////
void delay_ms(unsigned int time){
while(time){
SysTick -> LOAD = 71999;// luu bien dem count = 72000 vao thanh ghi LOAD
SysTick -> VAL = 0;// dat gia tri cuoi cung là 0
SysTick -> CTRL = 5;
while(!(SysTick -> CTRL & ( 1 << 16))){ //kiem tra co countflag da bat len 1 chua
}//nêu chua tiep tuc giam bien load ve 0
-- time;//sau khi co countflag bat len 1 nghia la chay het 1ms , giam time di 1
}
}
/////tao ham delay us////////////
void delay_us(unsigned int time){
while(time){
SysTick -> LOAD = 72 - 1;
SysTick -> VAL = 0;
SysTick -> CTRL = 5;
while(!(SysTick -> CTRL & (1 << 16))){
}
-- time;
}
}
/////tao ham bat led lcd bang cach tao xung cho chan E cua led lcd////////////
void LCD_Enable(){
GPIO_SetBits(GPIOC, LCD_EN); ////////set bit 1 cho chan E cua led lcd
delay_us(3);/////////set bit 1 cho chan E cua led lcd trong vong 3 us
GPIO_ResetBits(GPIOC, LCD_EN);///////set bit 0 cho chan E
delay_us(50);
///////set bit 0 cho chan E trong vong 50 us
}
////tao ham gui 4 bit cho led lcd//////////////////////////////////////
void LCD_Send4Bit(unsigned int data){
GPIO_WriteBit(GPIOC, LCD_D4, data & 0x01);// bat bit 1 cho chan d4 va tat toan bo
//chan d5 d6 d7
GPIO_WriteBit(GPIOC, LCD_D5, (data >> 1) & 1);// bat bit 1 cho chan d5 va tat toan
// o chan d4 d6 d7
GPIO_WriteBit(GPIOC, LCD_D6, (data >> 2) & 1);// bat bit 1 cho chan d6 va tat toan
// bo chan d4 d5 d7
GPIO_WriteBit(GPIOC, LCD_D7, (data >> 3) & 1);// bat bit 1 cho chan d7 va tat toan
// bo chan d4 d5 d6
}
////tao ham SendCommand cho led lcd///////////
void LCD_SendCommand(unsigned int data){ //data 8bit
LCD_Send4Bit(data >> 4); // dich phai 4 bit
LCD_Enable();
LCD_Send4Bit(data);
// gui 4 bit còn lai
LCD_Enable();
}
///tao ham int cho lcd///////////
void LCD_Init(){
LCD_Configure();//goi ham LCD_Configure()
LCD_Send4Bit(0x00);//set bit 0 cho cac chan d4->d7
delay_ms(20);//delay 20ms cho LCD hoat dong on dinh
GPIO_WriteBit(GPIOC, LCD_RS, 0);//reset chan rs ve 0
GPIO_WriteBit(GPIOC, LCD_RW, 0);//reset chan rw ve 0
LCD_Send4Bit(0x03);//mac dinh
LCD_Enable();//tao xung cho chan e
delay_ms(5);//delay 4ms
LCD_Enable();//tao xung cho chan e
delay_us(100);//delay cho LCD hoat dong on dinh
LCD_Send4Bit(0x02);//nhap nhay con tro
LCD_Enable();
LCD_SendCommand(0x28);//giao tiep mac dinh 4 bit
LCD_SendCommand(0x0C);//bat ta con tro
LCD_SendCommand(0x06);//tu dong di chuyn con tro to vi tri ke tiep
LCD_SendCommand(0x01);// xoa toan man hinh
}
///tao ham clear cho led lcd//////////////
void LCD_Clear(){
LCD_SendCommand(0x01);
delay_ms(10);
}
/////tao ham dia chi cua con tro////////////////
void LCD_Gotoxy(unsigned int x, unsigned int y){
unsigned int address;
if(!y){//neu y khac 0
address = (0x80 + x);//con tro nhay len dong dau tien
}
else address = (0xC0 + x);// con tro nhay xuong dong 2
delay_us(1000);
LCD_SendCommand(address);
delay_us(50);
}
/////tao hàm truyen du lieu//////////////
void LCD_PutChar(unsigned char data){
GPIO_WriteBit(GPIOC, LCD_RS, 1);////keo chan RS ve 1////////////
LCD_SendCommand(data);
////gui ki tu //////////
GPIO_WriteBit(GPIOC, LCD_RS, 0);////keo chan RS ve 0//////////
}
/////tao ham gui nhieu du lieu/////////////////
void LCD_Puts(char *s){
while(*s){
LCD_PutChar(*s);
s++;
}
}
//////ham main////////////////////
int main(){
LCD_Init();///// khai báo ham LCD_Init
delay_ms(20);/// cho 20 ms cho LCD phan hoi
Button_Configue();// khai bao ham Button_Configue
uint16_t k=0;
// khai bao bien k
while(1){
if((GPIOB -> IDR & 0x01) != 0x01){ // khi button 1 dc nhan cho 20ms
// sau do tang bien k len 1
delay_ms(20);
k = 1;
}
if((GPIOB -> IDR & 0x02) != 0x02){ // khi button 2 dc nhan cho 20ms
// sau do tang bien k len 2
delay_ms(20);
k = 2;
}
if((GPIOB -> IDR & 0x04) != 0x04){ // khi button 3 dc nhan cho 20ms
// sau do tang bien k len 3
delay_ms(20);
k = 3;
}
switch(k){
case 1: // neu k = 1
LCD_SendCommand(0x01);//xoa toàn bo man hinh
LCD_Gotoxy(0,0);
// dua con tro vao vi tri cot 0 hang 0
LCD_Puts("Nhom 11 De tai 6");// gui du lieu cho led lcd
delay_ms(10);
LCD_SendCommand(0x02); // chuyen led ve man hinh home
break;
case 2: // khi button 2 duoc nhan
LCD_SendCommand(0x18); // dich man hinh sang trai
delay_ms(10);
break;
case 3:// khi button 3 duoc nhan
LCD_SendCommand(0x1C);// dich man hinh sang phai
delay_ms(10);
break;
}
}
}