Tải bản đầy đủ (.pdf) (36 trang)

Lập trình game với kit MSP430G255

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.24 MB, 36 trang )

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
- Lập trình điều khiển

Người đảm nhậ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
- Báo cáo

Nguyễn Trọng Hiếu


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.

Hin
̀ h 1.6. Module Joystick.
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


×