Chương trình Download: Danh sách các lớp: Tên lớp Công dụng Button.hpp Tạo các nút nhấn, và chứa các hành động liên quan Disklist.hpp Liệt kê các ổ đĩa trong máy, và chứa các hành động l
Trang 1I ĐÔI NÉT VỀ NGÔN NGỮ C:
I.1 Nguồn gốc:
C được phát minh và cài đặt đầu tiên bởi Dennis Ritchie chạy trên hệ điều hành Unix, được Martin Richards phát triển trong thập niên 70 C sử dụng chuẩn ANSI được đề nghị lần cuối cùng vào năm 1989
I.2 C là ngôn ngữ bậc trung:
Được xem là ngôn ngữ bậc trung vì C tổ hợp những thành phần tốt nhất của các ngôn ngữ bậc cao với sự điều khiển và tính linh hoạt của ngôn ngữ Assembly C cho phép thao tác trên các bit, các byte và các địa chỉ – những phần tử cơ bản với các chức năng của máy tính, mã của chương trình C cũng mang tính khả chuyển
I.3 C là ngôn ngữ của lập trình viên:
C được các lập trình viên làm việc thật sự tạo ra, thúc đẩy và kiểm tra, để rồi
C lại mang về cho họ những gì họ mong muốn: ít hạn chế, ít lời phàn nàn, các cấu trúc khối, các hàm đơn lẻ, và môt tập đóng kín những từ khóa
II CÁC PHƯƠNG PHÁP LẬP TRÌNH:
II.1 Phương pháp lập trình lệnh:
Chương trình là một dãy các lệnh
Lập trình là xác định các lệnh cùng với thứ tự các lệnh đó
Phương pháp này chỉ có giá trị với chương trình lệnh ( < 100 lệnh)
II.2 Phương pháp lập trình thủ tục:
Chương trình là một hệ thống các thủ tục và hàm, mỗi thủ tục hay hàm là một dãy các lệnh
Lập trình là đi xác định những thủ và hàm, và xác định các lệnh bên tring thủ tục và hàm đó
Phương pháp này tiến bộ hơn phương pháp trên
II.3 Phương pháp lập trình đơn thể:
Chương trình là một hệ thông các đơn thể (module)
Mỗi đơn thể là một hệ thống thủ tục, hàm có cùng ý nghĩa nào đó Mỗi thủ tục và hàm là một dãy các lệnh
Các đơn thể có được lưu trữ và biên dịch phân cách, nên dễ dàng lắp ghép Tuy nhiên phương pháp này còn thiếu tự nhiên, ngài ra nếu chương trình quá rộng và quá sâu thì không thể quản lý được
II.4 Phương pháp lập trình hướng đối tượng:
Chương trình là một hệ thống các đối tượng, các đối tượng trong thực tế được diễn tả bằng ngôn ngữ tin học
Lập trình là đi xác định những đối tượng cùng những quan hệ của chúng
Tính tự nhiên của phương pháp này làm nó trở nên sinh động, mỗi đối tượng có thuộc tính và hành động riêng như trong thực tế do đó dễ hình dung, dễ quản lý Ngoài ra, nhờ dựa trên các đối tượng nên tính tiến hóa và mở rộng rất cao
Trang 2Trong phần viết chương trình giao diện vi tính, người viết đã chọn phương pháp lập trình hướng đối tương Nhờ những ưu điểm trên, phương pháp này cho phép bổ sung một cách dễ dàng, tạo điều kiện thuận lợi cho việc bổ sung sau này nếu cần
III PHƯƠNG PHÁP LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG TRONG C III.1 Các khái niệm:
Thế giới thực Phương pháp lập trình Ngôn ngữ lập trình Đối tượng bất kỳ trong thế
giới thực
Đối tượng Biến có kiểu lớp
(tương tự kiểu cấu trúc) Khái niện chung của một
đối tương
Lớp đối tượng Kiểu lớp(Class-tương tự
kiểu cấu trúc) Thuộc tính được quan tâm
của đối tượng
Thuộc tính Thành phần dữ liệu của
kiểu lớp Khả năng có thể thực hiện
của một đối tương
Hành động Thủ tục, hàm của kiểu lớp
III.2 Phương pháp:
III.2.1 Xác định các lớp đối tượng, quan hệ qua các lớp này (xây dựng sơ đồ lớp)
III.2.2 Thiết kế các lớp (biểu diễn trên máy tính)
Thành phần dữ liệu (thuộc tính)
Thành phần xử lý (hành động)
III.2.3 Cài đặt các lớp: Viết hàm main() III.2.4 Thử nghiệm
IV Thực hiện viết chương trình DownLoad:
IV.1 Yêu cầu của giao diện:
Cho phép chọn file sẽ truyền
Bằng cách gõ vào tên file
Bằng cách click chuột để chọn
Xem trước vùng nhớ cần thiết sẽ sử dụng ở RAM ở Kit 8085
Chọn cổng truyền
Truyền file có kiểm tra
IV.2 Chọn ngôn ngữ lập trình:
Chọn ngôn ngữ C viết ở môi trường Dos
Lý do: yêu cầu thiết bị (máy tính) không cao, phù hợp kiến thức người viết
Ưu điểm: C là một công cụ lập tình gọn nhẹ, chạy nhanh, hiệu quả và khép kín Vì sử dụng C ở môi trường Dos nên không cần phải kiểm soát các driver như nếu viết ở môi trường Windows Ngôn ngữ C cho phép truy cập trực tiếp các port, dể dàng kiểm soát từng bit dữ liệu
Khuyết điểm: Vùng nhớ trống ở môi trường Dos chỉ có 640Kbyte, và sau khi khởi động xong (ở màn hình dos) thì chỉ còn lại trên dưới 400Kbyte, không cho phép tạo một giao diện phức tạp Độ phân giải ở chế độ graph trong Dos không thể so sánh với môi trường Windows
Trang 3IV.3 Chương trình Download:
Danh sách các lớp:
Tên lớp Công dụng Button.hpp Tạo các nút nhấn, và chứa các hành động liên quan Disklist.hpp Liệt kê các ổ đĩa trong máy, và chứa các hành động liên quan List.hpp Để vẽ bảng liệt kê các thư mục và file, và chứa các hành động liên
quan Mouse.h Chứa các thao tác về chuột Screen.h Chứa các tham số về giao diện màn hình, và chứa các hành động
liên quan Textbox.hpp Vẽ khung nhập liệu (tên file, loại file, ) , và chứa các hành động
liên quan Xuat.hpp Chứa các thao tác, hành động liên quan đến truyền file Lưu đồ của hàm main():
Giải thích lưu đồ:
Hình 13: lưu đồ hàm Main() của chương trình DownLoad
Begin
InitGraphics()
Khởi tạo thành công
Mainpro()
closegraph()
End
CT báo lỗi
Đóng chế độ đồ họa
Thoát
InitValues(…)
InitScreen()
InitMouse(…)
S
Đ
Trang 4 Chương trình bắt đầu ở begin
InitGraphisc():Khởi tạo chế độ đồ họa, vì chương trình này có sử dụng màn hình
ở chế độ đồ họa trong môi trường Dos Nếu khởi tạo không thành công thì thông báo lổi khởi tạo và thoát khỏi chương trình
InitValues(…): hàm này còn khởi tạo các giá trị ban đầu cho màn hình: kích thước cửa sổ, kích thước ký tự
InitScreen(): Vẽ màn hình với các giá trị đã khởi tạo
InitMouse(): Khởi tạo chuột
Khởi tạo thành công: kiểm tra, nếu khởi động chuột thành công thì tiếp tục công việc, nếu không thành công thì xuất ra thông báo lỗi và thoát khỏi chương trình
MainPro là chương trình quản lý mọi thao tác của toàn bộ chương trình, từ các thao tác nhập xuất đến các thao tác lựa chọn các tùy chọn
Closegraph(): Đóng chế độ đồ họatrước khi thoát khỏi chương trình
End: kết thúc chương trình
Hàm Main() này được viết bằng ngôn ngữ C :
void main(void) {
InitGraphics();
InitValues("Chuong trinh truyen du lieu ra RAM");
InitScreen();
if (!InitMouse(&MainWindow.rViewPort)) {
OutMessage("Mouse driver not found Init mouse and return");
getch();
closegraph();
exit(1);
} ShowMouse();
MainProgram();
closegraph();
}
void main(void): void cho biết rằng hàm main() không trả về môt giá trị nào, nghĩa là trong hàm main này không có lệnh return() hoặc lệnh là một lệnh return không có tham sô (void) cho biết hàm main không cần đối số đưa vào
Lưu đồ hàm Mainpro():
Begin
Khởi tạo các giá trị cho các ô nhập text
Khởi tạo các giá trị cho các nút chọn
A
Trang 5Hình 14: Lưu đồ của hàm MainPro()
Giải thích lưu đồhàm MainPro():
Truyền file Return
Xác nhận thoát
Xác định file chọn
Click Nút pull down
Click nút Exit
Nhấn Esc
Click nút Send
Xuất các ô nhập text ra màn hình
Xuất các nút chọn
ra màn hình
A
GetEvent()
Click vào
ô Open File
Gọi chương trình nhập vào đường dẫn
Gọi chương trình xuất cửa sổ chọn file
Trang 6 Khởi tạo các giá trị cho các ô nhập text: trên màn hình sẽ có khung cho phép gõ vào tên file, chương trình con này sẽ khởi tạo các tọa độ, màu chữ cho text
Khởi tạo các giá trị cho các nút chọn: cũng giống như trên, nhưng đối với các nút Send, Exit và nút Pulldown
Xuất các ô nhập text ra màn hình
Xuất các nút chọn ra màn hình
GetEvent: chương trình con lấn biến cố chuột Biến cố này chứa các thông tin về tọa độ chuột, phím nào của chuột được click, thời gian click lần cuối, … để xáx định các lệnh kế tiếp cần thực hiện
Click vào ô Open File: nếu biến cố click chuột xẩy ra tại tọa độ của của ô Open file thì kết quả click vào ô này là TRUE, thực hiện chương trình con nhập vào file cần xuất Ngược lại thì bỏ qua
Click vào nút Pulldown: nếu biến cố click chuột xẩy ra tại tọa độ của của nút Pulldown thì kết quả click vào ô này là TRUE, gọi chương trình xuất ra cửa sổ chọn File, ngược lại thì bỏ qua
Click nút Send: nếu biến cố click chuột xẩy ra tại tọa độ của của nút Send thì kết quả click vào ô này là TRUE, thực hiện xác nhận file xuất đã nhập vào chưa, nếu file xuất chưa nhập vào thì báo lỗi và bỏ qua lệnh Send, nếu file xuất đã có tên rồi thì xuất file
Click nút Exit: nếu biến cố click chuột xẩy ra tại tọa độ của của nút Exit thì kết quả click vào ô này là TRUE, thực hiện xác nhận muốn thoát khỏi chương trình, nếu xác nhận đúng thì thoát, ngược lại thì bỏ qua lệnh Exit
Nhấn Esc: nếu người dùng nhấn vào nút Esc trên bàn phím thì biến cố Nhấn Esc sẽ là TRUE, thực hiện xác nhận muốn thoát khỏi chương trình, nếu xác nhận đúng thì thoát, ngược lại thì bỏ qua lệnh thoát bằng nút Esc
Sau đó, chương trình lại thực hiện vòng lặp tại hàm lấy biến cố chuột cho tới khi có thao tác mới
Giả sử click chuột vào ô Open File, ô này sẽ đổi trạng thái, các kýtự trong ô sẽ đổi màu báo trạng thái chờ nhập, nhập vào một tên fie có phần mở rộng là “prn” với đầy đủ đường dẫn, sau đó gõ phímEnter thì tên file sẽ được lưu vào một biến toàn cục, và các địa chỉ đầu và địa chỉ cuối của chương trình ngôn ngữ máy sẽ được hiện lên ở khung “Free memory request”, và một dòng thông bào bên dưới báo cho biết click Send để truyền file
Giả sử tiếp tục click Send thì một thông báo xác nhận sẽ xuất hiện, muốn xác nhận có chắc là người dùng muốn truyền file không Nếu trả lời Ok thì chương trình truyền file sẽ được gọi thi hành
Sau đây là lưu đồ của chương trình con thực hiện việc truyền File
Giải thích lưu đồ:
Gọi chương trình cắt file: chương trình cắt file thực chất là một chương trình con có nhiệm vụ lọc ra những thông tin quan trọng trong file “x.prn” sẽ được truyền
đi, và lưu chúng trong một file “x.tmp” chỉ xuất hiện trong khoảng thời gian chương trình đang cắt file Sau đó file “x.tmp” này sẽ bị xoá đi khi quá trình truyền file hoàn tất Quá trình truyền file phải sử dụng bước này để các quá trình bắt tay giữa máy tính và Kit được ổn định (thực nghiệm), và việc viết chương trình được rõ ràng hơn
Trang 7 Gọi chương trình xuất file: chương trình này sẽ đọc file có tên là “x.tmp” được tạo từ chương trình cắt file Chương trình này sẽ tuần tự đọc file, nhận tín hiệu bắt tay và gởi dữ liệu cho đến khi hết file
Trong quá trình truyền file, nếu có sự cố, giả sử không bắt tay được vì lý do nào đó, thì chươn trình sẽ đợi, thời gian kéo dài sẽ coi như việc truyền file bi lỗi, và thông báo lỗi sẽ xuất hiện
Nếu truyền thành công thì thông báo hoàn tất công việc
Return: Quay trở về chương trình MainPro
Trong hàm MainPro(), cần quan tâm chương trình con truyền file
Hình 15: Lưu đồ chương trình con có nhiệm vụ truyền file
Trong phần này, ta quay lại công việc cắt file đã giới thiệu ở mục III của chương V
Chương trình con cắt file là để tạo ra một file tạm thời có phần mở rộng tmp file này sẽ là một file có cấu trúc đơn giản hơn file prn rất nhiều nhằm để giúp cho việc truyền file thêm đơn giản
Trước hết hãy khảo sát một file *.prn, file này được dịch ra bởi 1 chương trình dịch Assembler
Trong chương trình, byte lệnh đều tiên bắt đầu ở địa chỉ 0000hex Nhận xét rằng mỗi dòng lệnh bắt đầu bở một địa chỉ bộ nhớ, và liền sau địa chỉ này là một dấu nháy đơn, mà dấu nháy đơn đầu tiên chỉ xuất hiện tại địa chỉ của dòng lệnh đầu tiên
để tìm địa chỉ đầu tiên thì có thể tìm dấu nháy đơn đầu tiên
Đúng
Gọi chương trình Cắt file Begin
Gọi chương trình xuất file
Thành công
Thông báo hoàn tất công việc
Return
Thông báo lỗi công việc Sai
Trang 8MACRO-80 3.4 01-Dec-80 PAGE 1 Org 0000h
0000' 3E 00 MVI A,00h 0002' 32 A001 STA 0A001h 0005' 3E 80 MVI A,80h 0007' 32 A001 STA 0A001h 000A' 3E 06 MVI A,06h 000C' 32 A000 STA 0A000h 000F' 76 HLT
MACRO-80 3.4 01-Dec-80 PAGE S Macros:
Symbols:
No Fatal error(s)
Còn địa chỉ cuối cùng là địa chỉ của byte cuối cùng của dòng lệnh cuối cùng Dòng lệnh cuối cùng là dòng lệnh nằm gần từ “Macros” nhất Từ macros này cũng là từ macros duy nhất
cách tìm địa chỉ cuối cùng như sau:
Tìm từ Macros
Dò ngược trở về phíc trên cho đến khi gặp dấu nháy đơn đầu tiên
Tiếp tục dò ngược về trước, nếu trong vòng 10 ký tự mà gặp môt ký tự xuống dòng thì thì dấu nháy đơn vừa rồi nằm ngay sau dòng lệnh cuối cùng
Trong dòng lệnh cuối cùng, tìm byte cuối cùng sẽ tính được địa chỉ cuối cùng
Cách tìm một dòng lệnh:
Khi gặp một dấu nháy đơn, thì tìm một ký tự khác dấu nháy đơn hoặc khoảng trắng
Khi gặp ký tự đầu tiên, đó chính là ký tự đầu tiên của byte lệnh
Nếu sau 2 ký tự của lệnh là một khoảng trắng thì 2 ký tự vừa rồi chính là một mã lệnh
Nếu sau 2 lý tự của môt byte lệnh không có khoảng trắng nào, thì 2 ký tự vừa rồi chính là 2 của 4 ký tự báo một địa chỉ
Nếu sau 2 ký tự tính từ lúc bắt đầu một lệnh là 2 khoảng trắng trở lên thì 2 byte vừa rồi là 2 byte cuối cùng của một dòng lệnh
Bắt đầu một chu kỳ mới tìm dòng mã lệnh
Lưu mã lệnh vào file *.tmp:
Đầu tiền lưu địa chỉ đầu, địa chỉ cuối vào file
Nếu gặp mã lệnh (2 ký tự) thì ghi tiếp vào file
Nếu gặp mã địa chỉ thì đổi chổ 2 ký tự sau với 2 ký tự trước của địa chỉ
Đến khi gặp địa chỉ cuối cùng thì ghi vào 2 ký tự cuối cùng và đóng file
trên được mô tả bằng lưu đồ sau:
Trang 9Đ
S
S
S
Nhận địa chỉ đầu Begin
Nhận địa chỉ cuối Mở file nguồn
Mở file đích
Tìm dấu “ ‘”
Đọc 2 ký tự lệnh
Xét ký tự tiếp theo
Không là khoảng trắng
Là một khoảng trắng
2 khoảng trắng
Lưu 2 ký tự Lưu 2 ký tự sau Đọc 2 ký tự tiếp theo
> địa chỉ cuối
Đ
S
End
Đ
Đ
Hình 16: Lưu đồ chương trình con Cắt file
Busy=1
Xuất dliệu ra bus
Strobe=1
ACK=1 & Error=0
AF=1
Đọc Error=0
s a
Thu nible cao
AF=0
Error=1
sai
Thu nible thấp
Ktra dữ liệu sai
Đúng
Xuất FF ra data bus
AF=0 Strobe=0
Hết dữ liệu Chuẩn bị dữ liệu
kế tiếp
sai Sai
Return
Đúng
Đúng
Sai
Đúng
Đúng Begin
Xuất 00 ra data bus
AF=0 Strobe=0
Trang 10Sau khi cắt file, một file mới đã được tạo ra Chương trình truyền file đến bước xuất file Dĩ nhiên trước khi xuất file cũng cần có những thủ tục mở file, đặt các mức logic cần thiết để khởi động cổng: mở file hợp lệ, cho bit AF=0, strobe=0
Giải thích lưu đồ chương trình xuất file:
Trước tiên, máy tính xuất strobe=0, AF=0 bằng chách xuất ra port 37Ahex số 03hex (xem lại thanh ghi điều khiển ở mục IV chương IV);
Chương trình xuất bắt đầu tại begin
Đọc Busy\ cho tới khi bằng [1]: đợi kit phát ra Busy=[0] báo hiệu đã sẳn sàng nhận dữ liệu
Nếu nhận được Busy\=[1] thì bước xuất dữ liệu được thực hiện, tức là lúc đó máy tính đọc 2 ký tự đầu tiên của file tmp và xuất ra port 378 của máy tính
Strobe=[1]: để báo cho kit biết dữ liệu đã được gửi ra port để kit biết mà đọc dữ liệu vào
ACK=[1] và Error=[0]: khi nhậndl xong kit sẽ báo ACK=[1], Error=0 để báo cho máy tính biết Kit sẽ gửi dữ liệu để kiểm tra đúng hay sai
AF=[1]: báo cho Kit biết máy tính sẳn sàng nhận dữ liệu
Máy tính đọc bit Error cho tới khi Error = [0] để biết Kit đã gửi về dữ liệu để kiểm tra
Thu Nible cao: Nhận dữ liệu để kiểm tra
Cho AF=[0]: đã nhận xong dữ liệu
Đọc Error cho tới khi Error=[1] để biết đã có dữ liệu mới
Thu nible thấp
Kiểm tra dữ liệu: máy tính sẽ phải ghép nối nible cao với nible thấp lại rồi
so sánh với dữ liệu vừa xuất ra, nếu 2 dữ liệu giống nhau thì kết quả xuất dữ liệu sẽ là đúng Máy tính sẽ xuất ra số FFhex ở thanh ghi data để báo đúng, và xuất AF=0 & strobe=0 để báo xuất xong 1 byte dữ liệu Ngược lại thì xuất 00hex ra thanh ghi data và xuất AF=0, strobe =0 để báo kết quả sai
Nếu kết quả sai thì quay lại xuất lạ byte vừa rồi đã xuất
Quay lại từ đầu chương trình xuất dữ liệu cho đến khi hết dữ liệu
IV.4 Chương trình nhận dữ liệu ở Kit:
Giải thích lưu đồ chương trình nhận dữ liệu:
Chương trình bắt đầu tại begin
Trước tiên phải khởi tạo 8255 với các chế độ qui định như sau:
Port A: nhận dữ liệu từ thanh ghi data theo ket nối phần cứng
Port B: xuất trạng thái Kít trả về máy tính
Port C: nhận tín hiệu điều khiển từ thanh ghi điều khiển của máy tính
Sau đó báo cho máy tính biết trạng thái bận Mục đích của công việc này là để đồng bộ thời điểm bắt đầu chương trình nhận dữ liệu với chương trình xuất dữ liệu từ máy tính
Reset biến đếm địa chỉ đầu và cuối, nơi đặt vùng dữ liệu nhận được từ máy tính
Xuất chử Ready báo cho người sử dụng biết trạng thái sẳn sàng nhận dữ liệu của kit Chờ người sử dụng gõ phím Go