He he bài này về ý tưởng thì không sai, nhưng có 1 số lỗi về thuật toán và mắc một lỗi là có 1 lệnh không hợp lệ tuy biên dịch không lỗi nhưng khi thực thi sẽ không như ý muốn. Lẽ ra cũng không định "khảo cổ" đâu, nhưng vì thấy mọi người bảo không out port thì làm sao mà đưa được dữ liệu ra. Vậy thì giờ mọi người xem nhé.
Chuơng trình này thì đảm bảo là chạy 100% còn cái lệnh: mov @R0, A không hợp lệ là vì cái NÀY ở phần "Indirect Addressing" có nói. Lẽ ra nếu không vì cái ngoại lệ này thì cũng không đến nỗi không thấy chưong trình chạy .
Code:
org 0x0 batdau: mov A, #0x0 mov B, #0xFF //mov R0,0x80 <-- bỏ cái này đi mov R0, #07 // thanh ghi này dùng trong vòng lặp trên này rồi thì xuống bên dưới hàm (tre_1s) phải dùng thanh ghi khác // Hoặc ít nhất là cất nó đi, sau tre_1s thì khôi phục lại giá trị thì mới không bị sai vòng lặp này led0: mov 0x80, A//mov @R0,A <-- Đây chính là lệnh không hợp lệ acall tre_1s mov 0x80, B //inc R0 <-- Không hiểu ý tưởng chỗ này là gì djnz R0, led0 //mov R0, #90H mov R0, #07 led1: mov 0x90, A acall tre_1s mov 0x90, B //inc R0 djnz R0, led1 //mov R0, #0A0H mov R0, #07 led2: mov 0xA0, A acall tre_1s mov 0xA0, B //inc R0 djnz R0, led2 //mov R0, #0B0H mov R0, #07 led3: mov 0xB0, A acall tre_1s mov 0xB0, B //inc R0 djnz R0, led3 sjmp batdau tre_1s: mov r1, #10 loop3: mov R2, #100 loop2: mov r3, #100 loop1: djnz r3,loop1 djnz R2,loop2 djnz r1,loop3 ret end
Comment