You are on page 1of 36

Trường Đại Học Bách Khoa Hà Nội

Viện Điện Tử - Viễn Thông


====o0o====

BÁO CÁO ĐỒ ÁN I

Đề tài: Lập trình game với kit MSP430G255.


Giảng viên hướng dẫn: ThS Trần Hải Nam.
Nhóm sinh viên thực hiện:

Họ và tên Mssv Lớp


Vũ Xuân Phong 20143438 Điện tử 03 – K59
Nguyễn Thành Công 20140507 Điện tử 09 – K59
Trần Đức Giang Huy 20146342 CN Điện tử 02 - K59
Nguyễn Như Đồng 20146191 CN Điện tử 01 – K59
Nguyễn Trọng Hiếu 20155560 CN Điện tử 02 – K60

Hà Nội, Tháng 12 năm 2017


Bảng Phân Công Công Việc.

Nội dung công việc Người đảm nhận

- Lập trình điều khiển Vũ Xuân Phong


- Báo cáo

- Tìm hiểu về Kit Lauchpad Nguyễn Thành Công


MSP430G2553.
- Báo cáo.

- Tìm hiểu về Kit Lauchpad Trần Đức Giang Huy


MSP430G2553.
- Báo cáo.

- Tìm hiểu về màn hình LCD NOKIA Nguyễn Như Đồng


5110
- Báo cáo.

- Tìm hiểu về Joystick Nguyễn Trọng Hiếu


- Báo cáo
MỤC LỤC
LỜI MỞ ĐẦU ............................................................................................................ 2

Chương I. Phân Tích Đề Tài. ................................................................................... 3

1. Phân tích đề tài, sơ đồ khối. ..............................................................................3

2. Chi tiết về điều khiển của các khối. ..................................................................4

2.1. Kit launch pad Msp430G2553. ....................................................................4

2.2. Màn hình LCD Nokia 5110. ........................................................................9

2.3. Nút chuyển 4 hướng Joystick. ...................................................................12

Chương II. Lập trình điều khiển. .......................................................................... 13

1. Lưu đồ thuật toán chương trình. ....................................................................13

2. Lập trình với Energia. .....................................................................................14

3. Chi tiết về các khối code chương trình. .........................................................15

3.1. Các cấu trúc được tạo ra. ...........................................................................15

3.2. Khởi tạo rắn và mồi. ...................................................................................15

3.3. Thuật toán vẽ rắn. ......................................................................................16

3.4. Khối điều khiển...........................................................................................20

3.5. Khối di chuyển. ...........................................................................................22

3.6. Khỗi xử lý các xự kiện................................................................................23

3.7. Khối thực hiện việc vẽ điểm và và vẽ số mạng lên LCD. ..........................26

3.8. Khối chương trình chính. ..........................................................................27

Chương 3. Chạy thử và hiệu chỉnh. ....................................................................... 29

1. Một số hình ảnh chạy thử. ..............................................................................29

2. Đánh giá kết quả đạt được. .............................................................................30

3. Những khó khăn gặp phải. ..............................................................................30

KẾT LUẬN .............................................................................................................. 32

0|Page
DANH MỤC HÌNH VẼ

Hình 1.1. Sơ đồ khối chung cho hệ thống. ................................................... 3

Hình 1.2. Sơ đồ chân vi điều khiển MSP430G2553. ................................... 5

Hiǹ h 1.3. Kit Launch Pad MSP430G2553. .................................................. 8

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

Hình 1.6. Module Joystick. .........................................................................12

Hình 2.1. Lưu đồ thuật toán chương trình. .................................................13

Hình 2.2. Giao diên Energia. ......................................................................14

Hình 3.1. Hình chương trình chạy thử. .......................................................29

Hình 3.2. Hình chương trình chạy thử. ........................................................29

Hình 3.3. Hình chương trình chạy thử. .......................................................30

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.

MSP430 là dòng vi điều khiển do hãng TI ( Texas Instruments) sản xuất, có


kiến trúc RISC được thiết kế đặc biệt cho siêu năng lượng thấp. MSP430 sử dụng
nguồn thấp và tích hợp nhiều ngoại vi thông minh. Vi điều khiển được sử dụng
trong nội dung Đồ án I là họ MSP430G2553.

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.

1. Phân tích đề tài, sơ đồ khố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.

Hình 1.1. Sơ đồ khối chung cho hệ thống.

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.

2. Chi tiết về điều khiển của các khối.

2.1. Kit launch pad Msp430G2553.

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.

MSP là chữ viết tắt của “MIXED SIGNAL MICROCONTROLLER”. Là


dòng vi điều khiển siêu tiết kiệm năng lượng, sử dụng nguồn thấp, khoảng điện
áp nguồn cấp từ 1.8V – 3.6V.

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.

Những đặc tính của dòng MSP 430 bao gồm:

• Điện áp nguồn: 1.8V – 3.6 V.


• Mức tiêu thụ năng lượng cực thấp:
• Chế độ hoạt động: 270 μA tại 1MHz, 2,2 V.
• Chế độ chờ: 0.7 μA.
• Chế độ tắt (RAM vẫn được duy trì): 0.1 μA.
• Thời gian đánh thức từ chế độ Standby nhỏ hơn 1μs.
• Cấu trúc RISC-16 bit, Thời gian một chu kỳ lệnh là 62.5 ns
• Cấu hình các module Clock cơ bản:
• Tần số nội lên tới 16 MHz với 4 hiệu chỉnh tần số +- 1%.
• Thạch anh 32 KHz.
• Tần số làm việc lên tới 16 MHz.
• Bộ cộng hưởng.

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.

Hình 1.2. Sơ đồ chân vi điều khiển MSP430G2553.

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:

Hình 1.3. Kit Launch Pad MSP430G2553.

- 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.

Cấ u trúc điểm ảnh LCD Nokia 5110.

Hiǹ h 1.4. Cấ u trúc điể m ả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.

Hình 1.5. Cách thức vẽ trên LCD Nokia 5110.

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.

Giao tiế p với LCD Nokia 5110.


• Thứ tự và chức năng các chân LCD NOKIA 5110

1: RST : Chân reset LCD


2: CE: Chân cho phép hoặc không cho phép LCD hoạt động.
3: DC: Chân chọn dữ liệu gửi đến LCD là lệnh hay là dữ liệu để hiển thị ra
màn hình.
4: DIN: Chân truyền dữ liệu theo chuẩn SPI.
5: CLK: Chân truyền xung nhịp theo chuẩn SPI.
6: VCC: Chân cấp nguồn cho LCD.
7: BL: Chân cấp nguồn cho led nền màn hình LCD.
8: GND: Chân mass.
Ngoài chuẩn SPI với 3 đường tín hiệu chuẩn ( CS (CE), SCK(CLK),
MOSI(DI) ) thì Nokia LCD này cần thêm 2 đường nữa, đó là D/C (Data/Command)
và RST (Reset).
• Giao tiếp với LCD NOKIA 5110
Quá trình gửi dữ liệu từ vi điều khiển đến LCD NOKIA 5110 được chia làm
2 chế độ. Chế độ gửi lệnh điiều khiển LCD và chế độ gửi dữ liệu hiển thị ra LCD.
Đường tín hiệu DC cho phép chọn 1 trong 2 chế độ này.
- Nếu DC=0: dữ liệu gửi đến LCD được lưu vào thanh ghi Command. Thanh
ghi Command lưu trữ và thực thi các lệnh dùng để điều khiển sự hoạt động
của Nokia LCD (dữ liệu này không được hiển thị ra màn hình).

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.

̀ h 1.6. Module Joystick.


Hin

Các chân của Module.

• 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.

1. Lưu đồ thuật toán chương trình.

Hình 2.1. Lưu đồ thuật toán chương trình.

13 | P a g e
2. Lập trình với Energia.

Hình 2.2. Giao diên 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ẽ:

struct Toa_Do{ // struct tọa độ điểm

int x;

int y;

};

- Struct để mô tả đối tượng chính cảu game con rắn:


struct Snake{// struct mô tả rắn
int n; // chiều dài thân hiện tại.
Toa_Do Than[20]; // chiều dài rắn tối đa là 20
int tt;//1 right, -1 left , 2 up , down -2 // hướng di chuyển
Toa_Do food; // tọa độ mồi
};

3.2. Khởi tạo rắn và mồi.

- 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).

void khoiTao(struct Snake &snake){ //khoi tao

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;

3.3. Thuật toán vẽ rắn.

- 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.

void sort(const struct Snake &snake){

for (int i = 0; i < snake.n; i++)

draw[i] = snake.Than[i];

if (isBig){

draw[snake.n] = snake.food;

draw[snake.n + 1].x = snake.food.x;

draw[snake.n + 1].y = snake.food.y+1;

draw[snake.n + 2].x = snake.food.x +1;

draw[snake.n + 2].y = snake.food.y;

draw[snake.n + 3].x = snake.food.x + 1;

draw[snake.n + 3].y = snake.food.y +1;

toSort = snake.n+3;

else{

draw[snake.n] = snake.food;

17 | P a g e
toSort = snake.n;

for (int i = 0; i < toSort; i++){

for (int j = i+1; j < toSort + 1; j++){

if (draw[i].x > draw[j].x) swap(draw[i], draw[j]);

else if (draw[i].x == draw[j].x){

if (draw[i].y > draw[j].y) swap(draw[i], draw[j]);

• 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:

void swap(struct Toa_Do& a, struct Toa_Do& b){

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:

void drawColum(int x){

int i = 0;

while (i < 48)

// Thực hiện chuyển 8 giá trị điểm ảnh thành 1 byte để vẽ lên LCD.

if (drawLcd[i] != 0 || drawLcd[i + 1] != 0 || drawLcd[i + 2] != 0 ||


drawLcd[i + 3] != 0 || drawLcd[i + 4] != 0 || drawLcd[i + 5] != 0

|| drawLcd[i + 6] != 0 || drawLcd[i + 7] != 0){

char aByte = drawLcd[i] | drawLcd[i + 1] << 1 |

drawLcd[i + 2] << 2 | drawLcd[i + 3] << 3 | drawLcd[i + 4] << 4

| drawLcd[i + 5] << 5 | drawLcd[i + 6] << 6 | drawLcd[i + 7] << 7;

gotoXY(x,(i/8));

LcdWrite(LCD_D,aByte); // vẽ 8 điểm ảnh.

i += 8; // tăng vị trí đến dòng tiếp theo của LCD.

• Đầu vào x là cột thứ x cần vẽ.


• Mảng drawLcd là mảng toàn cục 48 phần tử lưu các vị trí cần vẽ trong
cột.

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ẽ:

void drawSnake(struct Snake &snake){

sort(snake);

startLcd();

int i = 0;

while (i < toSort+1){

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.

3.4. Khối điều khiển.

- 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:

void dieuKhien(struct Snake &snake){

// doc gia tri ADC cua JOYSTICK.

sensorValue = analogRead(sensorPin);

sensorValue1 = analogRead(sensorPin1);

20 | P a g e
if(sensorValue1 > 800){

if (snake.tt != 1 && wtf != -1 ) {

snake.tt = -1;

wtf = 0;

if(sensorValue1 < 200){

if (snake.tt != -1 && wtf != -1 ){

snake.tt = 1;

wtf = 0;

if(sensorValue < 200){

if (snake.tt != 2 && wtf != 1){

snake.tt = -2;

wtf = 0;

if(sensorValue > 800){

if (snake.tt != -2 && wtf != 1) {

snake.tt = 2;

wtf = 0;

21 | P a g e
}

3.5. Khối di chuyển.

- 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.

3.6. Khỗi xử lý các xự kiện.

- 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.

3.7. Khối thực hiện việc vẽ điểm và và vẽ số mạng lên LCD.

- 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;

// ve diem va mang len LCD NOKIA 5110.

void drawPoint(int score, int heart){

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);

for (int index = 0; index < 7; index++)

26 | P a g e
LcdWrite(LCD_D, scores[index]);

heart = heart >0?heart:0;

gotoXY(49,0);

Write(heart);

gotoXY(56,0);

for (int index = 0; index < 7; index++)

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.

3.8. Khối chương trình chính.

- 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ử.

Hình 3.1. Hình chương trình chạy thử.

Hình 3.2. Hình chương trình chạy thử.

29 | P a g e
Hình 3.3. Hình chương trình chạy thử.

2. Đánh giá kết quả đạt được.


Trong quá trình thực hiện Đồ án I, chúng em đã tìm hiểu về Kit
Msp430G2553, cách thức hoạt động của màn hình LCD Nokia 5110 và nút chuyển
bốn hướng Joystick, từ đó có thể thực hiện lập trình điều khiển trên Energia.

Đề 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.

3. Những khó khăn gặp phải.

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.

Chúng em chân thành cảm ơn Thầy.

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

You might also like