Báo cáo project cuối kỳ môn thực hành KTMT

9 13 0
Báo cáo project cuối kỳ môn thực hành KTMT

Đang tải... (xem toàn văn)

Thông tin tài liệu

Kiểm tra tốc độ và độ chính xác khi gõ văn bản Chương trình sau sẽ đo tốc độ gõ bàn phím và hiển thị kết quả bằng 2 đèn led 7 đoạn. Nguyên tắc: Cho một đoạn văn bản mẫu, cố định sẵn trong mã nguồn. Ví dụ “bo mon ky thuat may tinh” Sử dụng bộ định thời Timer (trong bộ giả lập Digi Lab Sim) để tạo ra khoảng thời gian để đo. Đây là thời gian giữa 2 lần ngắt, chu kì ngắt. Trong thời khoảng đó, người dùng nhập các kí tự từ bàn phím. Ví dụ nhập “bo mOn ky 5huat may tinh”. Chương trình cần phải đếm số kí tự đúng (trong ví dụ trên thì người dùng gõ sai chữ O và 5) mà người dùng đã gõ và hiển thị lên các đèn led. Cách làm : Thuật toán sẽ đếm số kí tự được nhập trong từng giây bằng cách cho sleep 5ms sau mỗi vòng lặp Gồm 1 vòng lặp để xử lí các công việc : Đầu tiên, bài toán sẽ xác định xem có kí tự mới được nhập từ bàn phím hay không qua giá trị KEY_READY được lưu trong k1 + Nếu k1 = 1, tức là có giá trị được nhập từ bàn phím thì chương trình sẽ tăng biến đếm của kí tự được nhập lên 1 và kiểm tra ngắt mềm ( Ngắt bằng bàn phím):

Báo cáo project cuối kì mơn thực hành KTMT Nhóm Hoàng Hà Trung Đức 20205066 Nguyễn Xuân An 20204937 Bài số 3: Kiểm tra tốc độ độ xác gõ văn Chương trình sau đo tốc độ gõ bàn phím hiển thị kết đèn led đoạn Nguyên tắc: - Cho đoạn văn mẫu, cố định sẵn mã nguồn Ví dụ “bo mon ky thuat may tinh” - Sử dụng định thời Timer (trong giả lập Digi Lab Sim) để tạo khoảng thời gian để đo Đây thời gian lần ngắt, chu kì ngắt - Trong thời khoảng đó, người dùng nhập kí tự từ bàn phím Ví dụ nhập “bo mOn ky 5huat may tinh” Chương trình cần phải đếm số kí tự (trong ví dụ người dùng gõ sai chữ O 5) mà người dùng gõ hiển thị lên đèn led Cách làm : Thuật tốn đếm số kí tự nhập giây cách cho sleep 5ms sau vịng lặp Gồm vịng lặp để xử lí cơng việc : - Đầu tiên, tốn xác định xem có kí tự nhập từ bàn phím hay khơng qua giá trị KEY_READY lưu $k1 + Nếu $k1 = 1, tức có giá trị nhập từ bàn phím chương trình tăng biến đếm kí tự nhập lên kiểm tra ngắt mềm ( Ngắt bàn phím): Hàm kiểm tra ngắt mềm kiểm tra xem nguyên nhân ngắt có phải người dùng hay khơng ngun nhân ngắt MASK_CAUSE_KEYBOARD tức nguyên nhân ngắt đến từ người dùng nhảy đến hàm COUNTER_KEYBOARD để kiểm tra kí tự nhập vào khơng quay chương trình để chạy tiếp Hàm COUNTER_KEYBOARD kiểm tra kí tự nhập vào, khơng phải kí tự ENTER hiển thị kí tự vừa nhập lên hình MMIO nhảy đến kí tự Nếu kí tự nhập vào ENTER gọi đến hàm END để xử lí ngắt, kiểm tra xem chuỗi (sourcestring từ mã nguồn stringstore nhập từ bàn phím) xem chuỗi ngắn lấy độ dài chuỗi làm số kí tự cần duyệt tính từ đầu xâu Sau kiểm tra số kí tự hàm CHECK_STRING, hàm so sánh chuỗi sourcestring stringstore để đếm số kí tự Cuối in số kí tự digital lab sim in thời gian nhập ( tính s) hình máy tính Kiểm tra xem lỗi nhập vào có phải lỗi người dùng hay khơng + Nếu $k1 = 0, bỏ qua bước việc tăng biến đếm số kí tự nhập kiểm tra ngắt - Tiếp theo hàm XXX kiểm tra xem hàm chạy 1(s) hay chưa cách chia số lần lặp cho 200 để kiểm tra, chưa 1(s) tiếp tục nhảy đến hàm SLEEP để tăng độ trễ lên 5ms quay lại bước ban đầu - Ngược lại hàm đủ 1(s) chương trình chạy tiếp đến hàm SETCOUNT để hiển thị số giá trị nhập vào giây từ bàn phím Sau hàm DISPLAY_DIGITAL để hiển thị giá trị led đoạn hàm SHOW_7SEG_LEFT SHOW_7SEG_RIGHT - Cuối kiểm tra xem hàm PRINT dùng để in kết cuối hình chạy hay chưa &t9, hàm ASK_LOOP xuất để hỏi xem người dùng muốn chạy lại chương trình lần hay khơng MÃ NGUỒN: eqv SEVENSEG_LEFT 0xFFFF0011 # Dia chi cua den led doan trai #Bit = doan a #Bit = doan b #Bit = dau eqv SEVENSEG_RIGHT 0xFFFF0010 # Dia chi cua den led doan phai eqv IN_ADRESS_HEXA_KEYBOARD 0xFFFF0012 eqv OUT_ADRESS_HEXA_KEYBOARD 0xFFFF0014 eqv KEY_CODE 0xFFFF0004 # ASCII code from keyboard, byte eqv KEY_READY 0xFFFF0000 # =1 if has a new keycode ? (t1 = tuc la co ky tu nhap vao tu ban phim) # Auto clear after lw eqv DISPLAY_CODE 0xFFFF000C # ASCII code to show, byte eqv DISPLAY_READY 0xFFFF0008 # =1 if the display has already to # Auto clear after sw eqv MASK_CAUSE_KEYBOARD 0x0000034 # Keyboard Cause # bien de xac dinh loi nhap vao la nguoi dung nhap mot ky tu nao tu ban phim # dung de so sanh voi Coproc0.$13(cause) # neu Coproc0.$13(cause) = 0x0000034 thi viec ngat xay nguoi dung nhap ki tu nao de ngat chu khong phai la loi vi nguyen nhan khac data bytehex : byte 63,6,91,79,102,109,125,7,127,111 sach luu gia tri cua tung chu so den LED # danh # dung de dua vao SEG hien thi cac so tu -> storestring : space 1000 #khoang de luu cac ky tu nhap tu ban phim stringsource : asciiz "Bo mon ky thuat may tinh" Message: asciiz "\n So ky tu 1s : " numkeyright: asciiz "\n So ky tu nhap dung la: " notification: asciiz "\n ban co muon quay lai chuong trinh? " typingtime: asciiz "\n Thoi gian nhap la: " #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # MAIN Procsciiz ciiz edure #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ text li $k0, KEY_CODE li $k1, KEY_READY li $s0, DISPLAY_CODE li $s1, DISPLAY_READY li $s7, # de luu thoi gian nhap cua nguoi dung MAIN: li $s4,0 #dung de dem toan bo so ky tu nhap vao (lengthOf(storestring)) li $s3,0 # dung de dem so vong lap li $t4,10 # dung de lam so bi chia label DISPLAY_DIGITAL li $t5,200 # luu gia tri so vong lap li $t6,0 # bien dem so ky tu nhap duoc 1s li $t9,0 # bien check label PRINT # neu label PRINT duoc chay thi t9 = # neu label PRINT chua chay thi t9 = LOOP: WAIT_FOR_KEY: lw $t1, 0($k1) # $t1 = [$k1] = KEY_READY beq $t1, $zero,XXX # if $t1 == then Polling ( neu t1 ==0 thi tuc la chua co ky tu nhap vao -> XXX #neu t1 == thi tuc la co ky tu nhap vao -> MAKE_INTER MAKE_INTER: addi $t6,$t6,1 #tang bien dem ky tu nhap duoc 1s len ( t6 dung de dem ky tu nhap vao 1s teqi $t1, # if $t1 = then raise an Interrupt (t1 = KEY_READY) # teqi dung truong hop muon xu ly ngat mem (Ngat nhap tu ban phim) # Lam tuong tu HOME ASSIGNMENT LAB 11 # # Loop an print sequence numbers # XXX: #neu da lap dk 200 vong se nhay den xu ly so ky tu nhap 1s addi $s3, $s3, # dem so lan lap 1s ($s3 se la so vong lap 1s da lap qua tu chay chuong trinh) div $s3,$t5 # lay so vong lap chia cho 200 de xac dinh da duoc 1s hay chua mfhi $t7 # luu phan du cua phep chia tren (t7 bang phan du cua phep chia $s3/$t5) bne $t7,0,SLEEP # neu chua duoc 1s nhay den label SLEEP # neu da duoc 1s thi nhay den nhan SETCOUNT de thuc hien in man hinh # IN RA MAN HINH CCONSOLE "so ki tu nhap duoc 1s: $t6" SETCOUNT: li $s3,0 #tai lap gia tri cua $t3 ve de dem lai so vong lap cho cac lan tiep theo li $v0,4 #bat dau chuoi lenh in console so ky tu nhap duoc 1s # (v0 = 4: print string) la $a0,Message # in Message: "\n So ky tu 1s : " syscall li $v0,1 #in so ky tu 1s # v0 = 1: in interger add $a0,$t6,$zero # in so $t6 = so ky tu nhap vao 1s syscall addi $s7, $s7, gian nhap vao len don vi # sau moi 1s thi cong bien dem thoi # HIEN THI LED KHI VONG LAP DANG LAP, GIA TRI CUA LED LA SO KI TU NHAP VAO TRONG 1s KHI VONG LAP DANG CHAY DISPLAY_DIGITAL: div $t6,$t4 # lay so ky tu nhap duoc 1s chia cho 10 # neu lon hon 10 thi se phai in hang chuc led ben trai # nen can chia cho 10 de xem so ki tu nhap vao 1s co lon hon 10 hay khong mflo $t7 #luu gia tri phan nguyen, gia tri se duoc luu o den LED ben trai # den led phia ben trai hien thi hang chuc cua so ki tu nhap vao nen se la phan nguyen chia cho 10 la $s2,bytehex # lay dia chi cua danh sach luu gia tri cua tung chu so den LED add $s2,$s2,$t7 # xac dinh dia chi cua gia tri # (cong s2 voi t7 de laydia chi byte hex hien thi den led phia ben trai cho hang chuc neu so ki tu nhap vao >=10 # neu so ki tu nhap vao 1s < 10 thi s2 khong doi va dua chinh gia tri s2 7SEG lb $a0,0($s2) #lay noi dung cho vao $a0 (lay gia tri cua byte_hex dua va $a0) jal SHOW_7SEG_LEFT # den label den LED trai (hien thi led theo gia tri $a0) # -mfhi $t7 #luu gia tri phan du cua phep chia, gia tri se duoc in den LED ben phai # phan du cua phep chia chinh la hang don vi cua so ki tu nhap vao 1s la $s2,bytehex # lay dia chi byte_hex add $s2,$s2,$t7 # cong dia chi byte_hex voi gia tri du tuong ung de lay gia tri hexa tuong ung voi hang don vi lb $a0,0($s2) # lay gia tri hexa luu byte_hex tuong ung jal SHOW_7SEG_RIGHT # show # li $t6,0 #sau da hoan dua bien dem so ky tu nhap duoc 1s ve de bat dau cho chu ky moi beq $t9,1,ASK_LOOP # t9 la bien check xem label PRINT da chay hay chua # neu label PRINT da duoc chay thi t9 =1 # neu label PRINT chua duoc chay thi t9 = # tuc la can kiem tra neu t9 da duoc chạy thi viec CHECK_STRING da thuc hien xong (hoan chuong trinh), # chi quay lai DISPLAY_DIGITAL de hien thi ket qua len SEG # nen chạy den ASK_LOOP de hoi nguoi dung co muon chay lai chuong trinh mot lan nua khong SLEEP: addi $v0,$zero,32 li $a0,5 to sleep in milliseconds) syscall nop # sleep ms ($a0 = the length of time # WARNING: nop is mandatory here # Giữa lệnh syscall lệnh jump, branch cần bổ sung thêm lệnh nop Nếu không việc ghi nhận giá trị ghi PC vào EPC bị sai b LOOP hien tien trinh nhap vao) END_MAIN: li $v0,10 syscall # Loop (nhay nguoc lai ve LOOP de thuc # exit SHOW_7SEG_LEFT: li $t0, sb $a0, jr $ra SEVENSEG_LEFT 0($t0) # assign port's address # assign new value SHOW_7SEG_RIGHT: li $t0, sb $a0, jr $ra SEVENSEG_RIGHT 0($t0) # assign port's address # assign new value #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # PHAN PHUC VU NGAT #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ktext 0x80000180 #chuong trinh chay sau interupt duoc goi (tu dong nhay den 0x80000180) mfc0 $t1, $13 # set $t1 to the value store in Coproc register $13 (nguyen nhan ngat) # cho biet nguyên nhân làm tham chieu dia chi bo nho khong hop # ghi $13 (cause) thay đổi bit 2~6 cho biết nguyen nhân gây ngắt li $t2, MASK_CAUSE_KEYBOARD and $at, $t1,$t2 # neu $t1 = $t2 thi sau AND $at = $t1 = $t2 beq $at,$t2, COUNTER_KEYBOARD # tuc la neu nguyen nhan gay loi ($t1) = MASK_CAUSE_KEYBOARD thi nhay den COUNTER_KEYBOARD j END_PROCESS # neu nguyen nhan gay loi khong phai la MASKE_CAUSE_KEYBOARD # thi nhay den END_PROCESS de tro ve chuong trinh chinh (ket thuc chuong trinh xu ly ngat) # Kiem tra cac ky tu nhap vao, neu khong phai la ENTER thi chay tiep ki tu tiep theo, neu la ENTER thi nhay den END de ngat COUNTER_KEYBOARD: READ_KEY: lb $t0, 0($k0) # $t0 = [$k0] = KEY_CODE : doc ky tu nhap vao WAIT_FOR_DIS: lw $t2, 0($s1) # $t2 = [$s1] = DISPLAY_READY beq $t2, $zero, WAIT_FOR_DIS # if $t2 == then Polling SHOW_KEY: sb $t0, 0($s0) # hien thi ky tu vua nhap tu ban phim tren man hinh MMIO la $t7,storestring # lay $t7 lam dia chi co so cua chuoi nhap vao add $t7,$t7,$s4 # $s4 la dai xau nhap vao tu ban phim # thay doi dia chi $t7 = baseStroreString(address) + lengthOf(storeString) sb $t0,0($t7) # dua READ_KEY (bien doc duoc tu MMIO) vao vi tri tuong ung storestring addi $s4,$s4,1 # cong dai xau storeString len vi da them vao ki tu beq $t0,10,END # NEU PHIM NHAP VAO LA ENTER THI GOI DEN XU LY NGAT VA NHAY DEN END DE XU LY VIEC DEM CAC KY TU DUNG VA IN RA DIGITAL LAB SIM END_PROCESS: # Tro ve chuong trinh chinh sau xu ly xong Exception (ngat) NEXT_PC: mfc0 $at, $14 # $at

Ngày đăng: 18/12/2023, 00:03

Tài liệu cùng người dùng

Tài liệu liên quan