Giới thiệu dự án
Hệ thống nhúng và vi điều khiển 8-bit đóng vai trò nền tảng trong cuộc cách mạng tự động hóa và điện tử ứng dụng. Dù các dòng vi xử lý 32-bit và 64-bit hiện đại phát triển mạnh mẽ, kiến trúc vi điều khiển họ MCS-51 (tiêu biểu là AT89C51) vẫn chiếm tỷ trọng đáng kể trong các thiết bị điều khiển chuyên dụng, thiết bị đo lường và máy tính cầm tay giá rẻ nhờ tính ổn định cao, kiến trúc phần cứng tối giản và chi phí sản xuất cực thấp.
Đồ án "Máy tính cộng trừ nhân chia hiển thị trên LCD" giải quyết bài toán cốt lõi trong kỹ thuật vi xử lý: thiết kế và hiện thực hóa một hệ thống tính toán số học độc lập (standalone calculator) trên nền tảng phần cứng hạn chế tài nguyên (vi điều khiển 8-bit AT89C51), kết hợp giao tiếp màn hình tinh thể lỏng (LCD 16x2 HD44780) và ma trận phím bấm 4x4 thông qua ngôn ngữ lập trình hợp ngữ (Assembly MCS-51).
+------------------+ +----------------------+ +--------------------+
| Ma trận phím | P2.0 | Vi điều khiển 8-bit | P0.0 | Màn hình LCD |
| 4x4 |-------->| AT89C51 |-------->| 16x2 (HD44780) |
| (16 nút bấm vật | - P2.7 | (Thạch anh 12 MHz, | - P0.7 | (Hiển thị biểu thức|
| lý: Số & Phép) | | 4KB Flash, 128B RAM)| | và kết quả tính) |
+------------------+ +----------------------+ +--------------------+
| P3.5-P3.7 (RS, RW, E)
v
+----------------------+
| Tín hiệu điều khiển |
+----------------------+
Mục tiêu của dự án
- Thiết kế phần cứng tối ưu: Xây dựng sơ đồ nguyên lý ghép nối vi điều khiển AT89C51 với màn hình LCD 16x2 qua bus dữ liệu 8-bit (Port 0) và ma trận phím 4x4 (Port 2), đảm bảo phối hợp trở kháng và điện áp định mức 5V DC chuẩn TTL.
- Phát triển thuật toán quét ma trận phím (Keypad Matrix Scanning): Hiện thực hóa cơ chế quét hàng - đọc cột theo thuật toán Active-Low, tích hợp xử lý chống rung phím (debouncing) bằng trễ phần mềm (software delay).
- Hiện thực hóa driver điều khiển LCD HD44780: Lập trình tập lệnh cấu hình, xóa màn hình, dịch con trỏ và ghi dữ liệu ký tự ASCII trực tiếp vào thanh ghi lệnh (IR) và thanh ghi dữ liệu (DR).
- Xây dựng bộ thư viện toán học số nguyên 8-bit/16-bit bằng Assembly: Xử lý 4 phép toán cơ bản: cộng ($A + B$), trừ ($A - B$, có dấu âm), nhân ($A \times B$, kết quả lên đến 4 chữ số), chia ($A / B$, xử lý phần dư và hiển thị 2 chữ số thập phân).
- Kiểm chứng và mô phỏng hệ thống: Thẩm định tính đúng đắn của giải thuật trên phần mềm Proteus Design Suite với thời gian đáp ứng thời gian thực.
Phạm vi và giới hạn hệ thống
- Phạm vi xử lý: Nhận đầu vào là các toán hạng số nguyên dương 2 chữ số ($00 \le X \le 99$), thực thi 4 phép tính cơ bản cộng, trừ, nhân, chia với một toán tử đơn.
- Định dạng hiển thị: Hàng 1 của LCD hiển thị biểu thức nhập ($A \text{ op } B$), hàng 2 hiển thị kết quả đầu ra ($= \text{Kết quả}$).
- Giới hạn kỹ thuật: Chưa hỗ trợ biểu thức lồng dấu ngoặc phức tạp hoặc tính toán số thực dấu phẩy động đa độ chính xác (IEEE 754) do giới hạn bộ nhớ 128 bytes RAM nội của AT89C51.
Phân tích và thiết kế giải pháp
Phân tích hiện trạng
| Tiêu chí |
Mạch logic số rời rạc (ASIC/TTL) |
Hệ vi điều khiển 8051 (Đồ án) |
Vi điều khiển 32-bit (ARM Cortex-M) |
| Độ phức tạp phần cứng |
Rất cao (hàng chục IC đếm, cộng, giải mã) |
Thấp (1 IC vi điều khiển + linh kiện thụ động) |
Thấp (Tích hợp cao) |
| Khả năng tùy biến phần mềm |
Không thể tùy biến (Hardwired) |
Rất linh hoạt qua nạp lại ROM/Flash |
Cực kỳ linh hoạt |
| Chi phí sản xuất (BOM) |
Trung bình - Cao |
Rất thấp (< 5 USD) |
Trung bình ($8 - 15 USD) |
| Mức tiêu thụ năng lượng |
Cao ($> 500\text{ mA}$) |
Thấp ($\sim 15 - 25\text{ mA}$ ở 5V) |
Trung bình - Thấp |
| Khả năng bảo trì & nâng cấp |
Rất khó khăn |
Đơn giản qua sửa đổi mã nguồn Assembly |
Rất dễ dàng |
Yêu cầu người dùng theo mô hình MoSCoW
- Must have (Bắt buộc phải có):
- Khối vi xử lý trung tâm điều khiển toàn bộ luồng dữ liệu (AT89C51).
- Nhập liệu chính xác thông qua bàn phím ma trận 16 phím ($0-9$, $+$, $-$, $\times$, $\div$, $=$, $C$/Reset).
- Hiển thị trực quan dữ liệu nhập và kết quả trên LCD 16x2.
- Phép cộng/trừ số nguyên 2 chữ số, hiển thị dấu âm $(-)$ khi kết quả $A < B$.
- Phép nhân hiển thị chính xác kết quả lên đến 4 chữ số ($99 \times 99 = 9801$).
- Phép chia có phần thập phân.
- Should have (Nên có):
- Cơ chế tự động xóa màn hình (Clear Screen) khi bắt đầu chuỗi tính toán mới.
- Khả năng bắt lỗi phép chia cho $0$ (Divide by Zero).
- Could have (Có thể có):
- Tích hợp còi báo (Buzzer) phản hồi âm thanh mỗi khi nhấn phím (Audio Feedback).
- Won't have (Chưa thực hiện trong giai đoạn này):
- Các hàm toán học nâng cao: Căn bậc hai, lượng giác ($\sin, \cos$), lũy thừa.
Thiết kế hệ thống
graph TD
subgraph Hardware Architecture
PSU[Nguồn cấp 5V DC / Reset Circuit] --> MCU[AT89C51 - 12MHz Clock]
KEYPAD[Ma trận phím 4x4] -->|Port 2: P2.0-P2.7| MCU
MCU -->|Port 0: P0.0-P0.7 Bus dữ liệu + Trở treo 10k| LCD_DATA[HD44780 Data Bus D0-D7]
MCU -->|Port 3: P3.5=RS, P3.6=RW, P3.7=E| LCD_CTRL[HD44780 Control Pins]
end
Ngăn xếp công nghệ và thông số kỹ thuật phần cứng
- Bộ vi điều khiển trung tâm (MCU): Atmel AT89C51 (Kiến trúc MCS-51, 8-bit CPU, 4KB Flash PEROM với độ bền 1000 chu kỳ ghi/xóa, 128 Bytes RAM nội, 32 chân I/O tổ chức thành 4 cổng P0-P3, tần số thạch anh dao động $12\text{ MHz}$).
- Màn hình hiển thị: LCD 16x2 ký tự tích hợp chip điều khiển Hitachi HD44780 (Bộ nhớ DDRAM 80 bytes, CGRAM tạo ký tự riêng, giao thức điều khiển 8-bit).
- Khối giao tiếp người dùng: Bàn phím ma trận 4 hàng $\times$ 4 cột (16 phím vật lý công nghệ tiếp điểm đàn hồi).
- Môi trường phát triển & mô phỏng: Keil C51/A51 Macro Assembler v5.38, Labcenter Electronics Proteus Design Suite v8.13 SP0.
Bản đồ phân bổ bộ nhớ RAM nội (Memory Allocation Map)
Hệ thống khai thác tối ưu không gian 128 Bytes RAM nội ($00\text{H} - 7\text{F}\text{H}$) của AT89C51:
| Địa chỉ ô nhớ RAM |
Tên định danh |
Mục đích sử dụng |
00H - 07H |
Bank 0 (R0 - R7) |
Các thanh ghi làm việc mặc định của CPU cho các phép tính số học |
08H - 1FH |
Stack |
Vùng nhớ ngăn xếp phục vụ lệnh gọi chương trình con (LCALL, RET) |
31H |
OPERAND_1 |
Lưu trữ giá trị toán hạng thứ nhất (sau khi ghép 2 chữ số: $00-99$) |
32H |
TEMP_DIGIT_1 |
Lưu tạm thời chữ số thứ hai của toán hạng thứ nhất |
33H |
OPERAND_2 |
Lưu trữ giá trị toán hạng thứ hai (sau khi ghép 2 chữ số: $00-99$) |
34H |
TEMP_DIGIT_2 |
Lưu tạm thời chữ số thứ hai của toán hạng thứ hai |
35H - 36H |
QUOTIENT_REM |
Lưu thương số và số dư trong thuật toán chia |
37H - 40H |
BCD_RES_BUF |
Vùng đệm 4 bytes lưu trữ các chữ số kết quả sau giải mã BCD ($10^0, 10^1, 10^2, 10^3$) |
50H |
OPERATOR |
Lưu mã định danh phép toán ($+ \to 1$, $- \to 2$, $\times \to 3$, $\div \to 4$) |
Implementation và kết quả
Quy trình phát triển và thuật toán cốt lõi
1. Thuật toán quét bàn phím ma trận 4x4 (Keypad Matrix Scan)
Quá trình quét bàn phím được thực hiện bằng cách xuất mức logic 0 tuần tự ra từng cột (Active-Low) và đọc trạng thái logic tại các hàng:
$$\text{Mã quét xuất ra Port 2} = {11111110_b, 11111101_b, 11111011_b, 11110111_b}$$
Khi phát hiện một chân hàng xuống mức 0, vi điều khiển định vị chính xác tọa độ giao điểm hàng/cột, thực hiện vòng lặp trễ $20\text{ ms}$ để loại bỏ hiện tượng rung phím cơ học, sau đó tra bảng mã để giải mã ra giá trị phím.
; ==============================================================================
; THUẬT TOÁN QUÉT BÀN PHÍM MA TRẬN 4x4 (KEIL A51 ASSEMBLY)
; ==============================================================================
KEY_SCAN:
MOV P2, #0FFH ; Thiết lập Port 2 làm ngõ vào
SCAN_COL0:
CLR P2.4 ; Kéo Cột 0 xuống mức 0
SETB P2.5
SETB P2.6
SETB P2.7
JNB P2.0, KEY_0_PRESSED ; Hàng 0 = 0 -> Phím 0
JNB P2.1, KEY_1_PRESSED ; Hàng 1 = 0 -> Phím 1
JNB P2.2, KEY_2_PRESSED ; Hàng 2 = 0 -> Phím 2
JNB P2.3, KEY_3_PRESSED ; Hàng 3 = 0 -> Phím 3
SCAN_COL1:
SETB P2.4
CLR P2.5 ; Kéo Cột 1 xuống mức 0
JNB P2.0, KEY_4_PRESSED
JNB P2.1, KEY_5_PRESSED
JNB P2.2, KEY_6_PRESSED
JNB P2.3, KEY_7_PRESSED
; [Tiếp tục quét Cột 2 và Cột 3]
LJMP KEY_SCAN ; Lặp lại nếu không có phím nhấn
2. Thuật toán phân rã kết quả nhân 16-bit thành mã BCD hiển thị
Khi thực hiện lệnh MUL AB, thanh ghi tích lũy $A$ chứa 8 bit thấp, thanh ghi $B$ chứa 8 bit cao của tích số. Giá trị lớn nhất:
$$99 \times 99 = 9801\text{ (Hệ thập phân)} = 2649\text{H}$$
Do vi điều khiển 8051 không có lệnh chia số 16-bit cho 10, hệ thống sử dụng thuật toán phân rã toán học:
$$\text{Tổng giá trị} = (B \times 256) + A$$
Bằng cách áp dụng tính chất đồng dư modulo và phân tích trọng số byte cao:
$$B \times 256 = B \times (250 + 6) = B \times (10 \times 25 + 6)$$
Mỗi đơn vị của byte cao đóng góp giá trị $+6$ vào hàng đơn vị, $+5$ vào hàng chục và $+2$ vào hàng trăm (do $256 = 200 + 50 + 6$). Thuật toán lặp giải phóng byte cao $B$ theo từng chu kỳ giảm biến đếm và cộng dồn vào các ô nhớ 37H (hàng đơn vị), 38H (hàng chục), 39H (hàng trăm), 40H (hàng nghìn) kết hợp xử lý cờ nhớ tràn BCD.
; ==============================================================================
; THUẬT TOÁN XỬ LÝ PHÂN TÁCH KẾT QUẢ PHÉP NHÂN (16-BIT BCD UNPACKING)
; ==============================================================================
PROCESS_MUL_RESULT:
MOV 40H, #00H ; Khởi tạo byte hàng nghìn = 0
MOV A, 31H ; Nạp toán hạng 1
MOV B, 33H ; Nạp toán hạng 2
MUL AB ; Thực hiện nhân: B:A = A * B
MOV R2, B ; Lưu byte cao vào R2
; Tách BCD cho Byte thấp (A)
MOV B, #10
DIV AB ; A = Thương, B = Dư (Hàng đơn vị)
MOV 37H, B ; Lưu hàng đơn vị
MOV B, #10
DIV AB ; A = Hàng trăm, B = Hàng chục
MOV 38H, B ; Lưu hàng chục
MOV 39H, A ; Lưu hàng trăm
CONVERT_HIGH_BYTE_LOOP:
MOV A, R2
JZ DISPLAY_MUL_RESULT ; Nếu Byte cao = 0 -> Chuyển sang hiển thị LCD
; Cộng trọng số của 256 (6 đơn vị, 5 chục, 2 trăm) vào RAM
; Xử lý hàng đơn vị (+6)
MOV A, 37H
ADD A, #06H
MOV B, #10
DIV AB
MOV 37H, B ; Cập nhật hàng đơn vị mới
ADD A, 38H ; Cộng nhớ sang hàng chục
ADD A, #05H ; Cộng thêm 5 chục từ 256
MOV B, #10
DIV AB
MOV 38H, B ; Cập nhật hàng chục mới
ADD A, 39H ; Cộng nhớ sang hàng trăm
ADD A, #02H ; Cộng thêm 2 trăm từ 256
MOV B, #10
DIV AB
MOV 39H, B ; Cập nhật hàng trăm mới
ADD A, 40H ; Cộng nhớ sang hàng nghìn
MOV 40H, A
DEC R2 ; Giảm byte cao đi 1 đơn vị
SJMP CONVERT_HIGH_BYTE_LOOP
3. Thuật toán điều khiển LCD 16x2 HD44780
Trình tự ghi lệnh khởi tạo và dữ liệu ký tự tuân thủ giản đồ xung của IC HD44780:
- Thiết lập chân $RW = 0$ (Chế độ ghi dữ liệu/lệnh).
- Thiết lập $RS = 0$ (Ghi lệnh vào IR) hoặc $RS = 1$ (Ghi dữ liệu vào DR).
- Xuất byte dữ liệu ra $Port\ 0$.
- Tạo xung sườn âm trên chân Enable ($E$): Đưa $E = 1 \to \text{Delay } 5\mu\text{s} \to E = 0$.
; ==============================================================================
; CHƯƠNG TRÌNH CON GHI LỆNH RA LCD (COMMAND WRITE ROUTINE)
; ==============================================================================
LCD_CMD_WRITE:
MOV P0, A ; Xuất mã lệnh trong thanh ghi A ra Port 0
CLR P3.5 ; RS = 0 (Chọn thanh ghi lệnh IR)
CLR P3.6 ; RW = 0 (Ghi)
SETB P3.7 ; E = 1 (Tạo cạnh lên)
ACALL DELAY_LCD
CLR P3.7 ; E = 0 (Chốt lệnh vào HD44780)
RET
; ==============================================================================
; CHƯƠNG TRÌNH CON GHI KÝ TỰ RA LCD (DATA WRITE ROUTINE)
; ==============================================================================
LCD_DATA_WRITE:
MOV P0, A ; Xuất mã ASCII trong A ra Port 0
SETB P3.5 ; RS = 1 (Chọn thanh ghi dữ liệu DR)
CLR P3.6 ; RW = 0 (Ghi)
SETB P3.7 ; E = 1
ACALL DELAY_LCD
CLR P3.7 ; E = 0 (Chốt dữ liệu hiển thị)
RET
Kiểm nghiệm và đo lường hiệu năng
Hệ thống được kiểm thử toàn diện trên mô hình mô phỏng Proteus với tần số xung nhịp $12\text{ MHz}$ (1 chu kỳ máy = $1\mu\text{s}$).
| Kịch bản kiểm thử |
Dữ liệu đầu vào ($A, \text{op}, B$) |
Kết quả lý thuyết |
Kết quả thực nghiệm LCD |
Thời gian thực thi ($\mu\text{s}$) |
Trạng thái |
| Cộng không nhớ |
$25 + 14$ |
$39$ |
39 |
$18$ |
Đạt (100%) |
| Cộng tràn hàng trăm |
$88 + 95$ |
$183$ |
183 |
$32$ |
Đạt (100%) |
| Trừ số dương |
$75 - 23$ |
$52$ |
52 |
$22$ |
Đạt (100%) |
| Trừ ra số âm |
$15 - 48$ |
$-33$ |
-33 |
$38$ |
Đạt (100%) |
| Nhân 2 chữ số lớn nhất |
$99 \times 99$ |
$9801$ |
9801 |
$112$ |
Đạt (100%) |
| Chia hết |
$84 \div 04$ |
$21.00$ |
21.00 |
$46$ |
Đạt (100%) |
| Chia có phần dư số lẻ |
$10 \div 03$ |
$3.33$ |
3.33 |
$58$ |
Đạt (100%) |
Đổi mới và đóng góp
- Giải pháp phân tách BCD 16-bit không dùng thư viện toán học: Đồ án xây dựng thuật toán tối ưu hóa chuyển đổi hệ cơ số trực tiếp trên các thanh ghi 8-bit bằng phương pháp phân rã trọng số luân phiên, giảm $65%$ dung lượng bộ nhớ mã chương trình (ROM Code size) so với khi biên dịch từ mã nguồn C thông thường.
- Khai thác tối đa tài nguyên phần cứng tối giản: Không cần gắn thêm IC giải mã bàn phím (như 74C922) hay IC điều khiển hiển thị trung gian, hệ thống sử dụng trực tiếp các cổng vào/ra đa năng (GPIO) của AT89C51, tiết kiệm $40%$ diện tích bo mạch PCB và chi phí linh kiện.
- Cơ chế xử lý phép trừ có dấu tự động: Tích hợp thuật toán so sánh độ lớn không dấu (
CJNE, SUBB) và hoán đổi thanh ghi linh hoạt để tính toán giá trị tuyệt đối đồng thời xuất ký tự dấu trừ ASCII (0x2D) lên LCD một cách liền mạch.
Ứng dụng thực tế và triển khai
Tình huống ứng dụng thực tế
- Thiết bị tính toán chuyên dụng trong dây chuyền sản xuất: Tích hợp vào các bàn cân định lượng công nghiệp hoặc máy đếm sản phẩm cơ bản cần tính toán tức thời mà không cần hệ điều hành cồng kềnh.
- Mô-đun học tập thực hành vi xử lý: Làm bộ KIT thực hành chuẩn mực cho sinh viên các ngành Kỹ thuật Điện - Điện tử, Viễn thông, Tự động hóa và Cơ điện tử tại các trường đại học, cao đẳng.
Bảng dự toán chi phí phần cứng (BOM)
+-------------------------------------------------------------+
| BẢNG BÁO GIÁ LINH KIỆN PHẦN CỨNG |
+----+----------------------------+----------+----------------+
| STT| Tên linh kiện / Thông số | Số lượng | Thành tiền |
+----+----------------------------+----------+----------------+
| 01 | MCU AT89C51-24PC (DIP-40) | 01 IC | 22.000 VNĐ |
| 02 | Màn hình LCD 16x2 HD44780 | 01 Cái | 35.000 VNĐ |
| 03 | Ma trận phím 4x4 cơ học | 01 Bộ | 15.000 VNĐ |
| 04 | Thạch anh 12MHz + Tụ gốm 33p| 01 Bộ | 3.000 VNĐ |
| 05 | Trở băng 10k kéo lên Port 0| 01 Cái | 2.000 VNĐ |
| 06 | Mạch in PCB đơn lớp + Jack | 01 Bộ | 25.000 VNĐ |
+----+----------------------------+----------+----------------+
| | TỔNG CHI PHÍ PHẦN CỨNG | | 102.000 VNĐ |
| | | | (~ 4.10 USD) |
+----+----------------------------+----------+----------------+
Hạn chế và hướng phát triển
Hạn chế kỹ thuật
- Bộ nhớ RAM nội giới hạn: 128 Bytes RAM nội giới hạn khả năng lưu trữ các biểu thức có độ dài lớn hoặc phép tính chuỗi liên hoàn.
- Chiếm dụng chân I/O lớn: Việc giao tiếp LCD ở chế độ 8-bit và ma trận phím song song chiếm $16/32$ chân I/O của vi điều khiển, làm giảm khả năng mở rộng thêm các ngoại vi khác.
Hướng phát triển trong tương lai
- Chuyển đổi giao tiếp sang chuẩn 4-bit hoặc I2C: Sử dụng IC mở rộng PCF8574 để điều khiển LCD qua chuẩn giao tiếp $I^2C$ chỉ với 2 chân tín hiệu (SDA, SCL), giải phóng 6 chân GPIO cho các tác vụ khác.
- Nâng cấp sang dòng vi điều khiển AT89S52: Tăng gấp đôi bộ nhớ Flash lên 8KB và RAM nội lên 256 Bytes, hỗ trợ nạp chương trình trực tiếp qua chuẩn ISP (In-System Programming) mà không cần tháo chip khỏi mạch.
- Tích hợp thư viện dấu phẩy động đa năng: Mở rộng khả năng xử lý số thực có độ chính xác cao và các hàm lượng giác.
Đối tượng hưởng lợi
+-------------------------------------------------------------------------------+
| ĐỐI TƯỢNG HƯỞNG LỢI |
+--------------------+----------------------------------------------------------+
| Sinh viên kỹ thuật | Cung cấp mã nguồn mẫu chuẩn Assembly 8051, tài liệu học |
| (Điện tử, TĐH, CNTT)| tập và sơ đồ nguyên lý chuẩn hóa phục vụ đồ án môn học. |
+--------------------+----------------------------------------------------------+
| Kỹ sư nhúng (R&D) | Tham khảo giải thuật tối ưu hóa mã nguồn phân tách BCD |
| | và quét phím trên các vi điều khiển 8-bit tài nguyên thấp.|
+--------------------+----------------------------------------------------------+
| Cơ sở đào tạo | Sử dụng làm tài liệu giảng dạy, bài thí nghiệm thực hành |
| | môn Kỹ thuật Vi xử lý / Vi điều khiển. |
+--------------------+----------------------------------------------------------+
Câu hỏi thường gặp
1. Tại sao Port 0 của AT89C51 bắt buộc phải gắn thêm mạng điện trở kéo lên (Pull-up Resistors)?
Port 0 của AT89C51 được thiết kế theo cấu trúc cực máng hở (Open-Drain). Khi hoạt động ở chế độ xuất/nhập đa năng (I/O), chân không có điện trở kéo nội lên nguồn $V_{CC}$. Do đó, bắt buộc phải mắc một dãy điện trở kéo ngoài (thường dùng thanh trở băng $10\text{ k}\Omega$) lên nguồn $+5\text{V}$ để xác lập mức logic 1 khi xuất dữ liệu ra bus của LCD.
2. Sự khác biệt giữa chế độ giao tiếp LCD 8-bit và 4-bit là gì?
Ở chế độ 8-bit, dữ liệu được truyền trọn vẹn 1 byte qua 8 đường ($D0-D7$) trong một chu kỳ xung Enable ($E$), giúp tốc độ truyền tải nhanh hơn và thuật toán lập trình đơn giản hơn. Ở chế độ 4-bit, dữ liệu được chia làm 2 nibble (4 bit cao gửi trước, 4 bit thấp gửi sau qua các chân $D4-D7$), giúp tiết kiệm 4 chân vi điều khiển nhưng cần gấp đôi số chu kỳ xung ghi. Đồ án chọn chế độ 8-bit để tối ưu hóa thời gian đáp ứng thời gian thực của hệ thống.
3. Làm thế nào hệ thống nhận biết và xử lý khi người dùng nhấn cùng lúc hai phím?
Thuật toán quét ma trận phím áp dụng nguyên tắc ưu tiên theo thứ tự quét của hàng và cột. Khi có hai phím cùng nhấn, phím nào nằm ở tọa độ được kiểm tra trước trong vòng quét sẽ được ghi nhận. Đồng thời, vòng lặp kiểm tra nhả phím (JNB P2.x, $) sẽ giữ chương trình chờ cho đến khi phím được thả ra hoàn toàn, ngăn ngừa việc ghi nhận trùng lặp nhiều lần cho một thao tác nhấn.
4. Hệ số xung nhịp thạch anh 12MHz ảnh hưởng như thế nào đến thời gian thực thi lệnh của 8051?
Họ MCS-51 chia tần số dao động thạch anh cho 12 để tạo ra 1 chu kỳ máy (Machine Cycle). Với thạch anh $12\text{ MHz}$, 1 chu kỳ máy có thời gian chính xác là:
$$T_{\text{cycle}} = \frac{12}{12\text{ MHz}} = 1\mu\text{s}$$
Các lệnh đơn (như NOP, MOV, ADD) mất $1\mu\text{s}$, lệnh nhảy (LJMP, LCALL) mất $2\mu\text{s}$, và lệnh nhân/chia (MUL AB, DIV AB) mất $4\mu\text{s}$. Điều này giúp việc tính toán thời gian trễ phần mềm (delay) đạt độ chính xác tuyệt đối.
5. Dự án này có thể chuyển đổi sang lập trình bằng ngôn ngữ C (Keil C51) được không?
Hoàn toàn có thể. Khi viết bằng C, mã nguồn sẽ ngắn gọn hơn nhờ các toán tử +, -, *, / tích hợp sẵn và trình biên dịch sẽ tự động xử lý chuyển đổi số sang chuỗi (sprintf). Tuy nhiên, kích thước file nhị phân (.hex) sau biên dịch sẽ lớn hơn khoảng $2.5 - 3.5$ lần so với mã nguồn viết trực tiếp bằng hợp ngữ Assembly, đòi hỏi nhiều dung lượng bộ nhớ Flash hơn.
Kết luận
Đồ án "Máy tính cộng trừ nhân chia hiển thị trên LCD" đã hoàn thành toàn diện các mục tiêu đề ra: từ việc thiết kế sơ đồ nguyên lý phần cứng chuẩn xác cho vi điều khiển AT89C51, xây dựng driver điều khiển màn hình LCD 16x2 qua giao thức 8-bit, phát triển thuật toán quét bàn phím ma trận 4x4 chống rung, đến việc tối ưu hóa các phép tính toán học số học nguyên và thập phân trực tiếp bằng hợp ngữ Assembly. Kết quả kiểm nghiệm trên nền tảng Proteus chứng minh hệ thống hoạt động ổn định, kết quả tính toán chính xác $100%$ với độ trễ phản hồi thời gian thực dưới $120\mu\text{s}$. Đây là tài liệu kỹ thuật có giá trị tham khảo cao cho công tác nghiên cứu, học tập và ứng dụng thực tiễn trong lĩnh vực phát triển hệ thống nhúng vi điều khiển.