hiện tại em dg có 1 đoạn code chương trình và em giải thick cho chương trình đó như thế này mọi người có kinh nghiệm xin chỉ giúp em em giải thick câu lệnh của chương trình ntn có chỗ nào sai hok.và chỗ ????? em chưa hiểu mong ai bjt thì giải thick hộ em chỗ đó với thanks mọi người.đoạn code của em viết cho mạch đếm sản phẩm hiện thị led 7 00>99
mà mọi người lệnh MOV TMOd,#05h. nếu như em thay bằng MOV TMOD,03h. lệnh có khác gì không.tại lệnh đầu 2 con led bằng 00 mới đúng.sao em sửa lại TMOD,#00h hay TMOD,#03h.TMOD,#05h.thì nó vẫn là chọn 00 ở đầu vậy ?
DEM SAN PHAM HIEN THI TREN 2 LED
ORG 000H ; điểm nhập reset hệ thống
MOV TMOD,#05H ; chọn chế độ định thời 05h = 00000101B, bộ định thời là bộ đếm (counter), chế độ định thời 16 bit
MOV TH0,#0 ; byte cao của bộ định thời bằng 0 (dùng để lưu giá trị đếm)
MOV TL0,#0 ; byte thấp của bộ định thời bằng 0 (dung để lưu giá trị đếm)
CLR TF0 ; xóa cờ TF0
SETB P3.4 ; cấu hình p3.4 là ngõ vào
SETB TR0 ; cho timer hoat động
TD: LCALL HEX_BCD ; gọi chương trình con HEX_BCD
LCALL BCD_7DOAN ; gọi chương trình con BCD_7DOAN
LCALL HIEN_THI ; hiện thị ra led
JMP TD ; khi đếm chạy tới giá trị 99 thì nó sẽ tự chạy lại giá trị ban đầu 00
;================================================= ====
HEX_BCD: giải mã HEX sang BCD
MOV A,TL0 ; sao chép nội dung ô nhớ địa chỉ TL0 vào thanh ghi A
MOV B,#10 ; nạp giá trị l0 vào thanh ghi B
DIV AB ; chia số nguyên không dấu 8-bít chứa trong thanh ghi A cho số nguyên không dấu 8-bít chứa trong thanh ghi B
MOV 10H,B ; sao nội dung của thanh ghi B vào ô nhớ 10H
MOV B,#10 ; nạp giá trị 10H vào thanh ghi B
DIV AB ;
MOV 11H,B ;sao nội dung thanh ghi B vào ô nhớ 11H
RET
;================================================= ====
BCD_7DOAN: giải mã BCD sang mã LED
MOV DPTR,#500H ; địa chỉ vùng mã 7 đoạn
MOV R0,#10H ; vị trí hiển thị dữ liệu trong vùng mã
MOV R1,#20H ;
BC: MOV A,@R0 ; di chuyển nội dung ô nhớ có địa chỉ chứa trong thanh ghi R0 vào A
MOVC A,@A+DPTR ; lấy mã hiển thị trong vùng mã theo vị trí
MOV @R1,A ; di chuyển nội dung thanh ghi A vào ô nhớ có địa chỉ chứa trong R1
INC R0 ; tăng R0
INC R1 ; tăng R1
CJNE R0,#12H,BC ; so sánh nếu R0 = 12 thì quay lại “BC”
RET
;================================================= ====
HIEN_THI:
MOV R0,#20H ; địa chỉ vùng mã hiển thị
MOV A,#0FDH ; mã quét
HT: MOV P0,@R0 ; xuất mã hiển thị
MOV P2,A ; xuất mã quét
LCALL DELAY ; gọi lệnh delay
MOV P2,#0FFH ; tắt led chống lem
INC R0 ; lấy mã hiển thị kế tiếp
RL A ; chuyển sang LED kế tiếp
CJNE A,#0F7H,HT ; kiểm tra đã quét xong chưa
RET
;================================================= ====
DELAY: ; chương trình tạo thời gian trễ 50 us
MOV 70H,#50 ; nạp giá trị 50 vào ô nhớ thập phân vào ô nhớ 70H
DJNZ 70H,$ ; giảm ô nhớ 70 đi 1 và nhảy tại chổ nếu 70H chưa bằng 0
RET
ORG 500H ; đĩa chỉ lưu mã led 7 đoạn ( 0 => 9)
DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H,080H,090H
END ; kết thúc
mà mọi người lệnh MOV TMOd,#05h. nếu như em thay bằng MOV TMOD,03h. lệnh có khác gì không.tại lệnh đầu 2 con led bằng 00 mới đúng.sao em sửa lại TMOD,#00h hay TMOD,#03h.TMOD,#05h.thì nó vẫn là chọn 00 ở đầu vậy ?
DEM SAN PHAM HIEN THI TREN 2 LED
ORG 000H ; điểm nhập reset hệ thống
MOV TMOD,#05H ; chọn chế độ định thời 05h = 00000101B, bộ định thời là bộ đếm (counter), chế độ định thời 16 bit
MOV TH0,#0 ; byte cao của bộ định thời bằng 0 (dùng để lưu giá trị đếm)
MOV TL0,#0 ; byte thấp của bộ định thời bằng 0 (dung để lưu giá trị đếm)
CLR TF0 ; xóa cờ TF0
SETB P3.4 ; cấu hình p3.4 là ngõ vào
SETB TR0 ; cho timer hoat động
TD: LCALL HEX_BCD ; gọi chương trình con HEX_BCD
LCALL BCD_7DOAN ; gọi chương trình con BCD_7DOAN
LCALL HIEN_THI ; hiện thị ra led
JMP TD ; khi đếm chạy tới giá trị 99 thì nó sẽ tự chạy lại giá trị ban đầu 00
;================================================= ====
HEX_BCD: giải mã HEX sang BCD
MOV A,TL0 ; sao chép nội dung ô nhớ địa chỉ TL0 vào thanh ghi A
MOV B,#10 ; nạp giá trị l0 vào thanh ghi B
DIV AB ; chia số nguyên không dấu 8-bít chứa trong thanh ghi A cho số nguyên không dấu 8-bít chứa trong thanh ghi B
MOV 10H,B ; sao nội dung của thanh ghi B vào ô nhớ 10H
MOV B,#10 ; nạp giá trị 10H vào thanh ghi B
DIV AB ;
MOV 11H,B ;sao nội dung thanh ghi B vào ô nhớ 11H
RET
;================================================= ====
BCD_7DOAN: giải mã BCD sang mã LED
MOV DPTR,#500H ; địa chỉ vùng mã 7 đoạn
MOV R0,#10H ; vị trí hiển thị dữ liệu trong vùng mã
MOV R1,#20H ;
BC: MOV A,@R0 ; di chuyển nội dung ô nhớ có địa chỉ chứa trong thanh ghi R0 vào A
MOVC A,@A+DPTR ; lấy mã hiển thị trong vùng mã theo vị trí
MOV @R1,A ; di chuyển nội dung thanh ghi A vào ô nhớ có địa chỉ chứa trong R1
INC R0 ; tăng R0
INC R1 ; tăng R1
CJNE R0,#12H,BC ; so sánh nếu R0 = 12 thì quay lại “BC”
RET
;================================================= ====
HIEN_THI:
MOV R0,#20H ; địa chỉ vùng mã hiển thị
MOV A,#0FDH ; mã quét
HT: MOV P0,@R0 ; xuất mã hiển thị
MOV P2,A ; xuất mã quét
LCALL DELAY ; gọi lệnh delay
MOV P2,#0FFH ; tắt led chống lem
INC R0 ; lấy mã hiển thị kế tiếp
RL A ; chuyển sang LED kế tiếp
CJNE A,#0F7H,HT ; kiểm tra đã quét xong chưa
RET
;================================================= ====
DELAY: ; chương trình tạo thời gian trễ 50 us
MOV 70H,#50 ; nạp giá trị 50 vào ô nhớ thập phân vào ô nhớ 70H
DJNZ 70H,$ ; giảm ô nhớ 70 đi 1 và nhảy tại chổ nếu 70H chưa bằng 0
RET
ORG 500H ; đĩa chỉ lưu mã led 7 đoạn ( 0 => 9)
DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H,080H,090H
END ; kết thúc
Comment