Professional Documents
Culture Documents
BÁO CÁO ĐỒ ÁN I
3.7. Khối thực hiện việc vẽ điểm và và vẽ số mạng lên LCD. ..........................26
0|Page
DANH MỤC HÌNH VẼ
Hiǹ h 1.4. Cấ u trúc điể m ảnh LCD Nokia 5110. ...........................................9
Hiǹ h 1.5. Cách thức vẽ trên LCD Nokia 5110. ............................................ 9
1|Page
LỜI MỞ ĐẦU
Xuất hiện từ những năm đầu thập niên 1960, hệ thống nhúng đang dần trở
thành một ngành phát triển mạnh mẽ trong lĩnh vực công nghệ thông tin (CNTT), với
những ứng dụng rộng rãi trong công nghiệp và đời sống. Hệ thống nhúng (embedded
system) được định nghĩa là một hệ thống chuyên dụng, thường có khả năng tự hành
và được thiết kế tích hợp vào một hệ thống lớn hơn để thực hiện một chức năng
chuyên biệt nào đó. Khác với máy tính đa năng, hệ thống nhúng thường được thiết
kế thực hiện một chức năng nhất định có tốc độ cao. Hệ thống nhúng bao gồm các
thiết bị phần cứng và phần mềm, được thực hiện trên các chip nhúng, vi xử lí, vi điều
khiển.
Trong nội dung Đồ án I với sự hướng dẫn của Thầy Trần Hải Nam, chúng
em được thực hành việc lập trình nhúng trên kit MSP430G2553 kết hợp với màn
hình LCD NOKIA 5110 và nút chuyển bốn hướng Joystick.
Ngôn ngữ được sử dụng để thực hiện Đồ án I là Energia dựa trên ngôn ngữ C
và C++ với thư viện hàm sẵn có phong phú và sử dụng trình dịch MSPGCC.
Trong quá trình thực hiện Đồ án I, nhờ sự hướng dẫn của Thầy Trần Hải
Nam, chúng em đã có cái nhìn tổng quan về nguyên lý hoạt động của Kit Lauchpad
MSP430G2553, màn hình LCD NOKIA 5110 và nút nhấn bốn hướng Joystick, từ
đó áp dụng vào thực hiện đề tài Đồ án I.
Chúng em xin được gửi lời cảm ơn đến Thầy Trần Hải Nam.
2|Page
Chương I. Phân Tích Đề Tài.
Đề tài Đồ án I theo sự hướng dẫn của Thầy Trần Hải Nam là thực hiện một
game nhỏ trên Kit MSP430G2553. Nhóm chúng em lực chọn thực hiện game con
rắn (game snake) kết hợp với nút chuyển 4 hướng Joystick và màn hình hiển thị
LCD Nokia 5110.
Vi điều khiển sẽ đọc tín hiệu điều khiển dạng analog từ Joystick và sử dụng
bộ ADC (Analog Digital Convert) để chuyển đổi thành tín hiệu số, ứng với từng giá
trị tương ứng vi điều khiển sẽ thực hiện vẽ lên màn hình LCD Nokia 5110 ( di
chuyển con rắn trên màn hình). Đồng thời vi điều khiển cũng thực hiện cập nhật
điểm và mạng của người chơi và thực hiện vẽ lại lên màn hình, sau mỗi lần có sự
thay đổi.
Trong đó:
Người chơi sẽ thực hiện điều khiển trực tiếp thông qua Joystick, Joystick sẽ
gửi tín hiệu điều khiển về cho vi điều khiển MSP430G2553, vi điều khiển sẽ
thực hiện xử lý tín hiệu và vẽ lại màn hình LCD.
Vi điều khiển MSP430G2553 sẽ đảm nhận chức năng xử lý tín hiệu từ
Joystick và vẽ lên trên màn hình LCD NOKIA 5110. Đồng thời thực hiện
3|Page
thuật toán chính bao gồm luật của trò chơi, cập nhật điểm và mạng cho người
chơi.
LCD Nokia 5110 thực hiện việc hiển thị việc di chuyển của con rắn, mồi,
điểm và mạng của người chơi. Màn hình Lcd sẽ được vẽ lại sau mỗi lần có
sự thay đổi.
MSP430 là họ vi điều khiển cấu trúc RISC 16-bit được sản xuất bởi công ty
Texas Instruments.
MSP430 kết hợp các đặc tính của một CPU hiện đại và tích hợp sẵn các
module ngoại vi. Đặc biệt Chíp MSP 430 là giải pháp thích hợp cho những ứng
dụng yêu cầu trộn tín hiệu.
4|Page
• Nguồn tạo xung nhịp bên ngoài.
• Điện trở bên ngoài.
• Timer_A 16 bit với 3 thanh ghi hình, 3 thanh ghi so sánh độ rộng 16 bit
• Timer_B 16 bit với 3 thanh ghi hình, 3 thanh ghi so sánh độ rộng 16 bit
• Giao diện truyền thông nối tiếp:
• Hỗ trợ truyền thông nối tiếp nâng cao UART, tự động dò tìm tốc
độ Baud.
• Bộ mã hóa và giải mã IrDA (Infrared Data Associatio).
• Chuẩn giao tiếp động bộ SPI.
• Chuẩn giao tiếp I2C.
• Bộ chuyển đổi ADC 10 bit, 200 ksps với điện áp tham chiếu nội, Lấy
mẫu và chốt. Tự động quét kênh, điều khiển chuyển đổi dữ liệu.
• Hai bộ khuếch đại thuật toán (hoạt động) có thể định cấu hình (Đối với
MSP 430x22x4).
• Bảo vệ sụt áp.
5|Page
Chip MSP430 có kích thước nhỏ go ̣n, chỉ 20 chân đố i với kiể u chân DIP.
Bao gồ m 2 port IO (hay GPIO general purprose input/ output : cổng nhập xuất
chung)
Port 1 : có 8 chân từ P1.0 đến P1.7 tương ứng với các chân từ 2-7 và 14 , 15.
Port 2 : cũng gồm có 8 chân P2.0 – P2.7 ứng với các chân 8 – 13 , 18,19.
6|Page
Bảng 1. Chức năng chân của chip MSP430G2553
- Chân số 1 là chân cấp nguồn Vcc (ký hiệu trên chip là DVcc), ở đây nguồn
cho chip chỉ được cấp ở mức 3,3V, nếu cấp nguốn cao quá mức này thì chip
có thể hoạt động sai hay cháy chip .
- Chân 20 là chân nối cực âm (0V), chân này thì không có gì đặc biệt.
- Chân reset : Chính là chân số 16 RST, nếu các bạn đã từng học về PIC thì sẽ
thấy chân reset có ký hiệu là MCLR, các bạn để ý thấy dấu gạch ngang trên
có nghĩa là chân này tích cực ở mức thấp. Mục đích của việc reset là nhằm
cho chương trình chạy lại từ đầu.
- Port I/O:
Port 1: có 8 chân từ P1.0 đến P1.7 tương ứng với các chân từ 2-7 và 14 , 15.
7|Page
Port 2: cũng gồm có 8 chân P2.0 – P2.7 ứng với các chân 8 – 13 , 18,19.
Trong chế độ nhập (input) thì cả 2 port đều có 1 mạch điều khiển điện trở
kéo dương – gọi là PULL UP nhưng giá trị của điện trở này rất lớn khoảng
47K nên gọi là WEAK PULL UP RESISTAN. Việc điều khiển PULL UP sẽ
được tiến hành thông qua lập trình tác động lên thanh ghi PxREN sẽ được đề
cập ở chương sau.
Điều này cũng giống như việc thiết lập input ở port B của vi điều khiển PIC,
ở port B cũng có điện trở kéo lên, và người lập trình phải thao tác qua thanh
ghi OPTION_REG.
Ma ̣ch na ̣p chi MCU.
Msp430 là dòng value line , power low, và low – cost . Chính vì vậy mà TI
đã cung cấp cho người dùng 1 mạch nạp code + debug chỉ trên 1 mạch nhỏ gọn.
Đây chính là hình ảnh của Kit lanchpad:
- Kit có thể nạp được code cho dòng Msp430G: như msp430g2231, 2553,
2452 …
- Kit kết nối với máy tính thông qua cổng USB.
8|Page
2.2. Màn hình LCD Nokia 5110.
LCD Nokia 5110 bao gồ m 84x48 điể m ảnh gồ m 84 điể m ảnh theo chiề u
ngang hay tru ̣c x và 48 điể m ảnh theo chiề u do ̣c hay tru ̣c y). LCD Nokia 5110 đươ ̣c
chia thành 6 blank đươ ̣c hiể u như 6 dòng theo chiề u do ̣c tru ̣c y, mỗi dòng gồ m 8
hàng điể m ảnh.
9|Page
Hình trên cho thấ y cách thức bô ̣ nhớ Ram ánh xa ̣ tới mô ̣t điể m ảnh nhấ t đinh
̣
trên màn hình hiể n thi.̣ Mô ̣t byte (8 bits) trong bô ̣ nhớ sẽ đươ ̣c ánh xa ̣ lên 8 điể m
ảnh liên tiế p nhau theo chiề u do ̣c. Mỗi lầ n thực hiê ̣n ve,̃ ta phải vẽ tố i thiể u 1 byte,
nên không thể vẽ mô ̣t điể m ảnh duy nhấ t trên màn hiǹ h.
10 | P a g e
- Nếu DC=1: dữ liệu gửi đến LCD được lưu vào thanh ghi Data. Thanh ghi
Data lưu trữ các giá trị dữ liệu hiển thị lên màn hình LCD.
- Tín hiệu reset LCD được tạo ra khi chân RST được kéo xuống mức thâp (tức
RST=0).
Khi đang truyền dữ liệu, nếu có tín hiệu reset LCD thì quá trình truyền sẽ bị
hủy. Cho đến khi chân RST ở mức cao (tức RST=1), trong chu kì xung clock
tiếp theo, quá trinh truyền dữ liệu của byte vừa bị hủy sẽ được thực hiện lại.
Khi đường tín hiệu CE ở mức cao (tức CE=1), thì LCD sẽ không chấp nhận
bất kỳ một dữ liệu nào từ VĐK gửi đến hay mọi dữ liệu hoặc lệnh lúc này đều
không ảnh hưởng đến LCD.
Khi đường tín hiệu CE ở mức thấp (tức CE=0) thì data gửi đến LCD sẽ được
chấp nhận cứ Sau mỗi chu kì của xung clock (xung cạnh lên) thì 1 bit dữ liệu được
dịch vào LCD trên chân DIN.
Chân CE phải được giữ ở mức thấp(tức CE=0) cho tới khi việc gửi dữ liệu
đến LCD hoàn tất.
11 | P a g e
2.3. Nút chuyển 4 hướng Joystick.
• L/R+ kế t nố i với nguồ n 5V của Kit Launch Pad MSP430G2553.
• U/D+ kế t nố i với nguồ n 5V của Kit Launch Pad MSP430G2553.
• GND kế t nố i với chân GND của Kit Launch Pad MSP430G2553.
• U/D U/D kế t nố i với chân đo ̣c tin
́ hiê ̣u của Kit Launch Pad MSP430G2553.
• L/R L/R kế t nố i với chân đo ̣c tin
́ hiê ̣u của Kit Launch Pad MSP430G2553.
Cấ u ta ̣o của Joystick gồ m hai biế n trở, giá tri ̣đo ̣c từ mỗi biế n trở qua bô ̣
ADC của Kit có giá tri ̣từ 0 – 1024.
12 | P a g e
Chương II. Lập trình điều khiển.
13 | P a g e
2. Lập trình với Energia.
Energia là một nền tảng điện tử mã nguồn mở được tạo bởi Robert Wessels
năm 2012 với mục tiêu đưa các sản phẩm của Texas Instruments MSP430 LaunchPad
dựa trên thiết kế của Arduino. Energia IDE là nền tảng được hỗ trợ trên các hệ điều
hành Mac, Windows và Linux. Energia sử dụng mspgcc biên dịch bởi Peter Bigot
và được dựa trên cơ sở của Arduino. Energia bao gồm một môi trường phát triển tích
hợp (IDE). Cộng đồng Energia cũng khá lớn mạnh. Ngoài việc giá thành của các kit
của nó rẻ hơn so với Arduino (so sánh với hàng chính hãng nhé). Hãng TI còn cung
cấp miễn phí các kit cho học sinh, sinh viên để nghiên cứu.
Energia là IDE hỗ trợ các dòng sản phẩm MSP430, MSP432, TM4C,
C2000, và CC3200 LaunchPad. Việc viết code và nạp cho kit Launchpad hoàn toàn
tương tự như Arduino. Thậm chí ngay cả đến Library và các Example cũng giống
như Arduino (Chỉ khác về phần cốt lõi).
14 | P a g e
3. Chi tiết về các khối code chương trình.
3.1. Các cấu trúc được tạo ra.
- Vì Lcd Nokia 5110 tổ chức thành 84x48 điểm ảnh, nên ta cần tạo ra một
struct để mô tả vị trí điểm ảnh cần vẽ:
int x;
int y;
};
- Khởi tạo ban đầu con rắn có 9 dốt, đầu ở vị trí tọa độ (10;10), hướng di
chuyển của rắn là từ trái sang phải, mồi ở vị trí tọa độ (15;15).
snake.Than[0].x = 10;
snake.Than[0].y = 10;
snake.Than[1].x = 9;
snake.Than[1].y = 10;
snake.Than[2].x = 8;
snake.Than[2].y = 10;
15 | P a g e
snake.Than[3].x = 7;
snake.Than[3].y = 10;
snake.Than[4].x = 6;
snake.Than[4].y = 10;
snake.Than[5].x = 5;
snake.Than[5].y = 10;
snake.Than[6].x = 4;
snake.Than[6].y = 10;
snake.Than[7].x = 3;
snake.Than[7].y = 10;
snake.Than[8].x = 2;
snake.Than[8].y = 10;
snake.food.x = 15;
snake.food.y = 15;
snake.n = 9;
snake.tt = 1;
- Mô tả:
• Vì mỗi lần vẽ trên Lcd Nokia 5110, phải vẽ ít nhất là 1 byte tương
đương với 8 điểm ảnh, nên trong khi con rắn di chuyển nó có thể sẽ tự
xóa đi một phần của mình hay che mất mồi.
• Để tránh việc xảy ra hiện tượng trên, ta sẽ thực hiện vẽ từng cột 48
điểm ảnh trên Lcd.
16 | P a g e
• Đầu tiên ta sẽ sắp xếp tất cả các điểm ảnh cần vẽ theo tọa độc x tang
dần, nếu các điểm ảnh có tọa độ x giống nhau, thì sắp xếp theo tọa độ
y tang dần.
• Sử dụng một mảng 48 phần tử để mô tả cho một cột trên LCD Nokia
5110. Bắt đầu từ tọa độc x nhỏ nhất, hay cột thứ x, ta kiểm tra và đánh
dấu những điểm ảnh được vẽ trong cột thứ x. Sau đó thực hiện việt vẽ
cột thứ x, sau đó chuyển sang côt tiếp theo.
- Hàm thực hiện sắp xếp tất cả các điểm ảnh cần vẽ bao gồm rắn và cả mồi.
draw[i] = snake.Than[i];
if (isBig){
draw[snake.n] = snake.food;
toSort = snake.n+3;
else{
draw[snake.n] = snake.food;
17 | P a g e
toSort = snake.n;
• Mảng draw là mảng toàn cục, lưu trữ tất cả các điểm ảnh cần vẽ.
• Biến kiểm tra isBig là một biến toàn cục kiểu bool, được sử dụng để
kiểm tra xem mồi có phải là mồi to hay không?.
• Hàm swap: Thay đổi vị trí hai điểm ảnh cho nhau:
Toa_Do c;
c = a;
a = b;
b = c;
• Biến toSort là biến toàn cục, lưu số lượng điểm cần vẽ.
18 | P a g e
- Hàm thực hiện vẽ một cột 48 điểm ảnh lên LCD:
int i = 0;
// Thực hiện chuyển 8 giá trị điểm ảnh thành 1 byte để vẽ lên LCD.
gotoXY(x,(i/8));
19 | P a g e
- Hàm thực hiện vẽ tất cả các cột có giá trị điểm ảnh cần vẽ:
sort(snake);
startLcd();
int i = 0;
drawLcd[draw[i].y] = 1;
if (draw[i].x != draw[i+1].x){
drawColum(draw[i].x);
startLcd();
i++;
• Hàm startLcd thực hiện việc đưa tất cả giả trị của mảng drawLcd về
giá trị 0, để thực hiện việc vẽ cột tiếp theo.
- Thực hiện việc đọc giá trị từ Joystick và chuyển hướng đi chuyển cho rắn
theo giá trị đọc vào từ Joystick:
sensorValue = analogRead(sensorPin);
sensorValue1 = analogRead(sensorPin1);
20 | P a g e
if(sensorValue1 > 800){
snake.tt = -1;
wtf = 0;
snake.tt = 1;
wtf = 0;
snake.tt = -2;
wtf = 0;
snake.tt = 2;
wtf = 0;
21 | P a g e
}
- Thực hiển việc di chuyển theo hướng tương ứng, mỗi lần di chuyển tăng
thêm một giá trị tọa độ.
void chuyenDong(struct Snake &snake){
if (snake.tt == 1) {
if (snake.Than[0].x + 1 > 83){
snake.tt = 0;
wtf = -1;
}
else
{
snake.Than[0].x++;
}
}
if (snake.tt == -1) {
if (snake.Than[0].x - 1 < 0){
snake.tt = 0;
wtf = -1;
}
else
{
snake.Than[0].x--;
}
}
if (snake.tt == -2 ) {
if (snake.Than[0].y+1 > 47){
snake.tt = 0;
22 | P a g e
wtf = 1;
}
else{
snake.Than[0].y++;
}
};
if (snake.tt == 2 ) {
if (snake.Than[0].y - 1 < 8){
snake.tt = 0;
wtf = 1;
}
else
{
snake.Than[0].y--;
}
}
}
• Đồng thời kiểm tra, nếu rắn đi quá màn hình thì cho rắn dừng lại.
- Thực hiện việc xử lý khi xảy ra các sự kiện như rắn ăn được mồi, rắn đi quá
màn hình, rắn cắn đuôi …
void xuLy(struct Snake &snake){
if (isBig){
if (
(snake.Than[0].x == snake.food.x && snake.Than[0].y == snake.food.y)||
(snake.Than[0].x == snake.food.x && snake.Than[0].y == snake.food.y + 1)
|| (snake.Than[0].x == snake.food.x + 1 && snake.Than[0].y ==
snake.food.y)
23 | P a g e
|| (snake.Than[0].x == snake.food.x + 1 && snake.Than[0].y ==
snake.food.y + 1)){
snake.n++;
snake.food.x = random(0,82);
snake.food.y = random(9,47);
point += 2;
isChange = true;
isBig = false;
}
}
else{
if(snake.Than[0].x == snake.food.x && snake.Than[0].y ==
snake.food.y){
snake.n++;
snake.food.x = random(0,82);
snake.food.y = random(9,47);
point++;
isChange = true;
}
}
if (point % 5 == 0 && point != 0){
isBig = true;
}
if (snake.n > 20) snake.n = 20;
if(snake.tt !=0){
for (int i = snake.n - 1; i > 0; i--){
snake.Than[i].x = snake.Than[i - 1].x;
snake.Than[i].y = snake.Than[i - 1].y;
}
}
24 | P a g e
if (point == 20 && z) {
deLay -= 70;
z = false;
}
if(heart <= 0) {
snake.n = -10;
gotoXY(5,2);
LcdString("Game Over !");
}
if(point >= 100){
snake.n = -10;
gotoXY(5,2);
LcdString("You Win!");
}
}
• Khi rắn ăn được mồi, tăng điểm cho người chơi đồng thời khởi tạo
một vị trí mỗi cho mồi bằng hàm random().
• Mỗi khi điểm chia hết cho 5, mỗi sẽ to lên.
• Khi người chơi đạt 100 điểm thì chiến thắng.
• Hàm ketThucgame() được sử dụng để kiểm tra việc rắn có cắn vào
đuôi mình không? Nếu có giảm số mạng đi một.
void ketThucGame(Snake &snake){
for (int i = 2; i < snake.n - 1; i++)
{
if (snake.Than[0].x == snake.Than[i].x &&
snake.Than[0].y == snake.Than[i].y){
heart -- ;
break;
}
}
}
25 | P a g e
• Khi số mạng giảm về 0, game over.
- Thực hiện việc vẽ giá trị điểm hiện tại và mạng hiện tại.
int a = 0;
int b = 0;
int c = 0;
if(isChange){
a = score/100;
b = (score/10)%10;
c = score%10;
gotoXY(7,0);
Write(a);
gotoXY(14,0);
Write(b);
gotoXY(21,0);
Write(c);
gotoXY(28,0);
26 | P a g e
LcdWrite(LCD_D, scores[index]);
gotoXY(49,0);
Write(heart);
gotoXY(56,0);
LcdWrite(LCD_D, life[index]);
• Biến kiểm tra isChange, kiểm tra nếu giá trị điểm thay đổi thì mới vẽ
lên trên LCD.
• Các biến a, b, c được sử dụng để lưu giá trị điểm.
- Hàm setup(): Chỉ chạy một lần, cài đặt LCD Nokia 5110 và khởi tạo các giá
trị ban đầu cho rắn.
void setup(void)
pinMode(LED, OUTPUT);
LcdInitialise();
LcdClear();
khoiTao(snake);
27 | P a g e
}
- Hàm loop(): là một vòng lặp chạy liên tục, chạy qua các khối của chương
trình.
void loop(void)
{
LcdClear();
drawSnake(snake);
xuLy(snake);
drawPoint(point,heart);
dieuKhien(snake);
chuyenDong(snake);
ketThucGame(snake);
delay(deLay);
}
28 | P a g e
Chương 3. Chạy thử và hiệu chỉnh.
1. Một số hình ảnh chạy thử.
29 | P a g e
Hình 3.3. Hình chương trình chạy thử.
Đề tài “Lập trình game Snake với kit Msp430G2553” đã có thể thực hiện
những chức năng cơ bản như di chuyển rắn, rắn ăn mồi, cập nhật điểm và mạng.
Nhưng bên cạnh đó vẫn còn có những hạn chế, như việc vẽ rắn di chuyển quá phức
tạp khiến cho bộ nhớ sử dụng lớn dẫn đến việc kích thước rắn chỉ có 20 đốt. Giá trị
đọc vào từ Joystick là một giải biến thiên nên khiến việc điều khiển con rắn rất khó
khăn.
Quá trình tìm hiểu về Kit Launchpad MSP430G2553, màn hình LCD Nokia
5110 có ít tài liệu. Cách thưc hiển thị của màn hình LCD Nokia 5110 khá phức tạp,
mỗi lần phải vẽ tối thiểu 1byte tương đương với 8 điểm ảnh, việc vẽ con rắn di
30 | P a g e
chuyển là khó khăn. Bên cạnh đó, bộ nhớ của vi điều khiển MSP430G2553 là hạn
chế (16KB).
31 | P a g e
KẾT LUẬN
Mặc dù đề tài Đồ án I không được hoàn thành như những gì đã mong đợi từ
ban đầu, chúng em còn gặp phải nhiều lỗi trong quá trình thực hiện. Nhưng bên
cạnh đó, chúng em đã học được thêm nhiều điều mới mẻ về Kit Launch Pad
MSP430G2553, cách thức mà màn hình LCD Nokia 5110 và Joystick hoạt động.
Cũng như việc củng cố thêm kiến thức về giải thuật lập trình.
Trong quá trình thực hiện Đồ án I, chúng em đã nhận được sự hướng dẫn
nhiệt tình từ Thầy Trần Hải Nam, nhờ đó chúng em đã có thể dễ dàng lắm được vấn
đề và tìm hiểu thực hiện nội dung đề tài.
32 | P a g e
TÀI LIỆU THAM KHẢO
Web:
http://energia.nu/Reference_Index.html
http://www.msp430launchpad.com/2012/08/using-nokia-lcd-library.html
http://linhkien69.vn/chu-de-nokia-5110-lcd-graphic-84x48-huong-dan-giao-tiep-va-
tao-anh-graphic_n57966_g723.aspx
http://arduino.vn/bai-viet/930-joystick-nut-nhan-da-huong
http://codientu.org/threads/6566/
33 | P a g e