Win®(Red)

I'm Phatdt

Subscribe to RSS feed

lập trình cho 89SXX cho các New Programmer

bài viết về ứng dụng vdk với LCD(giao tiếp LCD)
vài hình ảnh về project
LCD 16X2

LCD 20X4

CT chạy LCD 16X2 ct phức tập tí post các pác tham khảo
RS BIT P2.0
RW BIT P2.1
EN BIT P2.2

ORG 0000H
LJMP BEGIN
ORG 0BH
LJMP NGAT_TIMER0
ORG 0030H
BEGIN:
MOV 20H,#0 ; Nap gia tri ban dau cho cac led hien thi
MOV 21H,#5 ; hien tai la 11:59:50
MOV 22H,#9
MOV 23H,#5
MOV 24H,#1
MOV 25H,#1
;wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
MOV IE,#10000010B ;KHOI TAO NGAT CHO PHEP INT0
MOV TMOD,#01H
MOV TL0,#LOW(-50000)
MOV TH0,#HIGH(-50000)
SETB TR0
;wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
CALL KHOITAO_LCD
MOV A,#80H
CALL FUNTION
AS: MOV DPTR,#STRING1
MOV R7,#16
NHAN:
MOV A,#00H
MOVC A,@A+DPTR
INC DPTR
CALL DISPLAY
DJNZ R7,NHAN
AA: MOV A,#0C0H ;DUA CON TRO VE DONG 2
CALL FUNTION
MOV DPTR,#STRING2
LCALL HIENTHI
CJNE R2,#10,$
MOV A,#0C0H ;DUA CON TRO VE DONG 2
CALL FUNTION
MOV DPTR,#STRING2
LCALL HIENTHI2
CALL DELAY_1GIAY
SJMP AA
;wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
HIENTHI:
MOV R1,#4
LOOP: MOV A,#11 ; KI TU " " CUA STRING2
MOVC A,@A+DPTR
CALL DISPLAY
DJNZ R1,LOOP

MOV A,25H
MOVC A,@A+DPTR
CALL DISPLAY

MOV A,24H
MOVC A,@A+DPTR
CALL DISPLAY


MOV A,#10 ; KI TU ":" CUA STRING2
MOVC A,@A+DPTR
CALL DISPLAY

MOV A,23H
MOVC A,@A+DPTR
CALL DISPLAY

MOV A,22H
MOVC A,@A+DPTR
CALL DISPLAY

MOV A,#10 ; KI TU ":" CUA STRING2
MOVC A,@A+DPTR
CALL DISPLAY

MOV A,21H
MOVC A,@A+DPTR
CALL DISPLAY

MOV A,20H
MOVC A,@A+DPTR
CALL DISPLAY


RET

;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM

HIENTHI2:
MOV R1,#4
LOOP2: MOV A,#11 ; KI TU " " CUA STRING2
MOVC A,@A+DPTR
CALL DISPLAY
DJNZ R1,LOOP2

MOV A,25H
MOVC A,@A+DPTR
CALL DISPLAY

MOV A,24H
MOVC A,@A+DPTR
CALL DISPLAY


MOV A,#11 ; KI TU " " CUA STRING2
MOVC A,@A+DPTR
CALL DISPLAY

MOV A,23H
MOVC A,@A+DPTR
CALL DISPLAY

MOV A,22H
MOVC A,@A+DPTR
CALL DISPLAY

MOV A,#11 ; KI TU " " CUA STRING2
MOVC A,@A+DPTR
CALL DISPLAY

MOV A,21H
MOVC A,@A+DPTR
CALL DISPLAY

MOV A,20H
MOVC A,@A+DPTR
CALL DISPLAY

SJMP THOAT2
THOAT2:
RET
;qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq

DELAY_1GIAY:
cjne r2,#20,DELAY_1GIAY ; CHO DU 1GIAY = 20*50mS
mov r2,#0

INC 20H
MOV A,20H
CJNE A,#10,STOP
MOV 20H,#0

INC 21H
MOV A,21H
CJNE A,#6,STOP
MOV 21H,#0

INC 22H
MOV A,22H
CJNE A,#10,STOP
MOV 22H,#0

INC 23H
MOV A,23H
CJNE A,#6,STOP
MOV 23H,#0

INC 24H
MOV A,24H
CJNE A,#2,STOP1

MOV A,25H
CJNE A,#1,STOP
MOV 24H,#0
MOV 25H,#0

STOP:
RET
STOP1: CJNE A,#10,STOP
MOV 24H,#0
INC 25H
MOV A,25H
RET

;wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww

KHOITAO_LCD:
CLR RW
CLR RS
CLR EN
MOV P0,#38H
CALL DELAY50US
SETB EN
CLR EN
MOV P0,#00001100B ; tat con tro
CALL DELAY50US
SETB EN
CLR EN
MOV P0,#00000110B
CALL DELAY50US
SETB EN
CLR EN
RET
FUNTION:
CLR RS
JMP WRITE_RAM
DISPLAY:
SETB RS
WRITE_RAM:
MOV P0,A
CALL DELAY50US
SETB EN
CLR EN
CLR RS

RET
DELAY50US:
MOV R4,#25
DJNZ R4,$
RET
;WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW

NGAT_TIMER0:
inc r2 ;tre 50ms DUNG THACH ANH 12M
MOV TL0,#LOW(-50000)
MOV TH0,#HIGH(-50000)
SETB TR0
RETI

;WWWWWWWWWWWWWWWWWWWWWWWWWW1WWWWWWWWWWWWWWWWWWWWWWWW
STRING1:
DB ' DIGITAL CLOCK '
STRING2:
DB '0123456789: '


END
và toàn bộ project
DH_LCD.zip
chúc các pác thành công
mọi thắc mắc post cmt để dc giúp đỡ

lập trình cho 89SXX cho các New Programmer

lâu we ko post bài hướng dẫn
hôm nay vui vui post thêm bài để có cái mà ngâm cứu
1 bài viết ứng dụng led 7seg(led 7 thanh) mạch hiển thị dựa trên phương pháp quét Led như vậy chỉ với 8 chân để xuất mã hiển thị và 8 chân để quét ta có thể hiển thị 8 led 7seg (vừa tiết kiệm dc port vừa phù hợp với úng dụng mạch cũng gọn) chi phí cũng ổn
sau đây là vài hình ảnh về mạch đếm 4 số đếm từ 0000-9999

sau khi xem mấy bài trước có lẽ các pác đã bít và hỉu dc các dòng lệnh rồi hen
bài này trở đi em sẽ ko chú giải thêm nữa(trừ khi lệnh mới chưa dùng bao h)
và đây code kèm theo

INCLUDE 89c52.MC
org 000H

; GAN MO DAU = 000
MOV R0,#0;GAN GIA TRI CHO O1 = = 0
MOV R1,#0
MOV P2,#0H
MOV P0,#01000000B

MAIN:
LCALL QUET_LED
LCALL QUET_PHIM
LJMP MAIN

QUET_LED:

;LAM SANG DEN 1
MOV A,R3
LCALL GIAIMA
MOV P2,#00000001b
MOV P0,A
LCALL DELAY
MOV P2,#0;

;LAM SANG DEN 2
MOV A,R2
LCALL GIAIMA
MOV P2,#00000010b
MOV P0,A
LCALL DELAY
MOV P2,#0;

;LAM SANG DEN 3
MOV A,R1
LCALL GIAIMA
MOV P2,#00000100b
MOV P0,A
LCALL DELAY
MOV P2,#0;

;LAM SANG DEN 4
MOV A,R0
LCALL GIAIMA
MOV P2,#00001000b
MOV P0,A
LCALL DELAY
MOV P2,#0;

RET

QUET_PHIM:
JNB P3.3,BUTTON1
JNB P3.2,BUTTON2
JNB P3.1,BUTTON3
JNB P3.0,BUTTON4
RET

BUTTON1:
WAIT:
LCALL QUET_LED
JNB P3.3,WAIT
CJNE R3,#9,TANG_R3
MOV R3,#0
SJMP END1
TANG_R3:
INC R3
END1:
RET
BUTTON2:
WAIT1:
LCALL QUET_LED
JNB P3.2,WAIT1
CJNE R2,#9,TANG_R2
MOV R2,#0
SJMP WAIT
TANG_R2:
INC R2
RET
BUTTON3:
WAIT2:
LCALL QUET_LED
JNB P3.1,WAIT2
CJNE R1,#9,TANG_R1
MOV R1,#0
SJMP WAIT1
TANG_R1:
INC R1
RET
BUTTON4:
WAIT3:
LCALL QUET_LED
JNB P3.0,WAIT3
CJNE R0,#9,TANG_R0
MOV R0,#0
SJMP WAIT2
TANG_R0:
INC R0
RET
GIAIMA:
CJNE A,#00h,SO1
MOV A,#0C0H
SJMP EXIT

SO1:
CJNE A,#01H,SO2
MOV A,#0F9H
SJMP EXIT

SO2:
CJNE A,#02H,SO3
MOV A,#0A4H
SJMP EXIT

SO3: CJNE A,#03H,SO4
MOV A,#0B0H
SJMP EXIT

SO4: CJNE A,#04H,SO5
MOV A,#99H
SJMP EXIT

SO5: CJNE A,#05H,SO6
MOV A,#92H
SJMP EXIT
SO6: CJNE A,#06H,SO7
MOV A,#82H
SJMP EXIT

SO7: CJNE A,#07H,SO8
MOV A,#0F8H
SJMP EXIT

SO8: CJNE A,#08H,SO9
MOV A,#80H
SJMP EXIT

SO9:
MOV A,#00010000b
EXIT:
RET

DELAY1S:
MOV R1,#10
noop1:
MOV R2,#100
noop2:
MOV R3,#200
noop3:
nop
nop
djnz r3,noop3
djnz r2,noop2
djnz r1,noop1

ret

Delay:
Mov R6,#50H ; = = >= > > > gan R6 = #0FFH, 1 chu ki may
Kt1:Djnz R6,Kt1 ; = = >= > > > giam R6 xuong 1, R6 khac 0- > giam tiep
Ret ; = = >= > > > ket thuc chuong trinh con


END
đây là toàn bộ project
down về tham khảo nhá
9999 NUMBER.zip

lập trình 89S cho các new programer........(tt)

11. Lệnh OR dữ liệu của ô nhớ có địa chỉ direct với dữ liệu trên thanh ghi A:
• Cú pháp: ORL direct,A
• Lệnh này chiếm dung lượng bộ nhớ ROM là 2 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: thực hiện phép logic OR dữ liệu ở thanh ghi A với dữ liệu của ô nhớ có địa chỉ direct, kết quả được lưu trữ ở ô nhớ có địa chỉ direct.
• Ví dụ:
mov A,#0Fh
mov 5Fh,#0F0h
ORL 5Fh,A
Kết quả : 5Fh = #0FFh
12. Lệnh OR dữ liệu trên ô nhớ có địa chỉ direct với dữ liệu xác định:
• Cú pháp: ORL direct,#data
• Lệnh này chiếm dung lượng bộ nhớ ROM là 3 Byte
• Thời gian thực hiện: 2 chu kì máy
• Công dụng: thực hiện phép logic OR dữ liệu của ô nhớ có địa chỉ direct với dữ liệu cho trước, kết quả được lưu trữ ở ô nhớ có địa chỉ direct.
• Ví dụ:
mov 60h,#0F0h
ORL 60h,#1Fh
Kết quả : 60h = #0FFh
13. Lệnh EX-OR dữ liệu ở thanh ghi A với dữ liệu ở thanh ghi Rn:
• Cú pháp: XRL A,Rn
• Lệnh này chiếm dung lượng bộ nhớ ROM là: 1 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: thực hiện phép logic EX-OR dữ liệu ở thanh ghi A với dữ liệu ở thanh ghi Rn, kết quả được lưu trữ ở thanh ghi A
• Ví dụ:
mov A,#0F2h
mov R3,#0E0h
XRL A,R3
Kết quả : A = #12h
14. Lệnh EX-OR dữ liệu trên thanh ghi A với dữ liệu của ô nhớ có địa chỉ direct:
• Cú pháp: XRL A,direct
• Lệnh này chiếm dung lượng bộ nhớ ROM là 2 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: thực hiện phép logic EX-OR dữ liệu ở thanh ghi A với dữ liệu của ô nhớ có địa chỉ direct, kết quả được lưu trữ ở thanh ghi A
• Ví dụ:
mov A,#012h
mov 10h,#0E0h
XRL A,10h
Kết quả : A = #0F2h
15. Lệnh EX-OR dữ liệu trên thanh ghi A với dữ liệu của ô nhớ gián tiếp:
• Cú pháp: XRL A,@Ri
• Lệnh này chiếm dung lượng bộ nhớ ROM là 1 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: thực hiện phép logic EX-OR dữ liệu ở thanh ghi A với dữ liệu của ô nhớ có địa chỉ bằng giá trị của thanh ghi Ri, kết quả được lưu trữ ở thanh ghi A
• Ví dụ:
mov A,#08h
mov 10h,#0E9h
mov R0,#10h
XRL A,@R0
Kết quả : A = #0E1h
16. Lệnh EX-OR dữ liệu trên thanh ghi A với dữ liệu xác định:
• Cú pháp: XRL A,#data
• Lệnh này chiếm dung lượng bộ nhớ ROM là 2 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: thực hiện phép logic EX-OR dữ liệu ở thanh ghi A với dữ liệu cho trước, kết quả được lưu trữ ở thanh ghi A
• Ví dụ:
mov A,#12h
XRL A,#12h
Kết quả : A = #0
17. Lệnh EX-OR dữ liệu của ô nhớ có địa chỉ direct với dữ liệu trên thanh ghi A:
• Cú pháp: XRL direct,A
• Lệnh này chiếm dung lượng bộ nhớ ROM là 2 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: thực hiện phép logic EX-OR dữ liệu ở thanh ghi A với dữ liệu của ô nhớ có địa chỉ direct, kết quả được lưu trữ ở ô nhớ có địa chỉ direct.
• Ví dụ:
mov A,#0F2h
mov 50h,#0E0h
XRL 50h,A
Kết quả : 50h = #12h
18. Lệnh EX-OR dữ liệu trên ô nhớ có địa chỉ direct với dữ liệu xác định:
• Cú pháp: XRL direct,#data
• Lệnh này chiếm dung lượng bộ nhớ ROM là 3 Byte
• Thời gian thực hiện: 2 chu kì máy
• Công dụng: thực hiện phép logic EX-OR dữ liệu của ô nhớ có địa chỉ direct với dữ liệu cho trước, kết quả được lưu trữ ở ô nhớ có địa chỉ direct.
• Ví dụ:
mov 50h,#0E0h
XRL 50h,#01h
Kết quả : 50h = #0E1h
19. Lệnh bù giá trị dữ liệu trên thanh ghi A:
• Cú pháp: CPL A
• Lệnh này chiếm dung lượng bộ nhớ ROM là 1 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: lấy bù giá trị lưu giữ ở thanh ghi A, các bit có giá trị là 1 chuyển thành 0 và ngược lại các bit có giá trị là 0 chuyển thành 1.
• Ví dụ: mov A,#01100111b ;(tương đương 67h)
CPL A
Kết quả : A = #10011000b (tương đương 98h)
20. Lệnh xóa dữ liệu trên thanh ghi A:
• Cú pháp: CLR A
• Lệnh này chiếm dung lượng bộ nhớ ROM là 1 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: tất cả các bit của thanh ghi A đều được xác lập giá trị 0 .
• Ví dụ:
mov A,#01100111b
CLR A
Kết quả : A = #0
21. Lệnh xoay trái dữ liệu trên thanh ghi A:
• Cú pháp: RL A
• Lệnh này chiếm dung lượng bộ nhớ ROM là 1 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: thanh ghi A gồm tám bit A7 A6 A5 A4 A3 A2 A1 A0. Khi thực hiện lệnh xoay trái RL A giá trị của các bit được chuyển trang bit ở bên trái nó, giá trị của bit A0 chuyển sang bit A1, giá trị của bit A1 chuyển sang bit A2, tương tự với các bit còn lại, và giá trị của bit A7 chuyển sang bit A0. Minh họa các bit trong thanh ghi A khi thực hiện lệnh như trong hình dưới
Các bit ở thanh ghi A — A7 A6 A5 A4 A3 A2 A1 A0
Quá trình xoay dữ liệu từ A0 đến A6 — <— <— <— <— <— <— <—
Giá trị dữ liệu A7 chuyển sang bit A0 — A7 ——————————————————>A0
• Ví dụ:
Mov A,#01001001b
RL A
Kết quả sau khi các lệnh được thực hiện A mang giá trị là 10010010b
Giá trị thanh ghi A
Trước khi thực hiện lệnh xoay trái 0 1 0 0 1 0 0 1
Sau khi thực hiện lệnh xoay trái 1 0 0 1 0 0 1 0
22. Lệnh xoay trái dữ liệu trên thanh ghi A cùng với cờ nhớ C:
• Cú pháp: RLC A
• Lệnh này chiếm dung lượng bộ nhớ ROM là 1 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: thanh ghi A gồm tám bit A7 A6 A5 A4 A3 A2 A1 A0. Khi thực hiện lệnh xoay trái A với cờ nhớ RLC A giá trị của các bit được chuyển trang bit ở bên trái nó, giá trị của bit A0 chuyển sang bit A1, giá trị của bit A1 chuyển sang bit A2, tương tự với các bit còn lại, và giá trị của bit A7 chuyển sang cờ nhớ C, giá trị ở cờ nhớ C chuyển sang bit A0
Các bit ở thanh ghi A cùng với cờ C — C A7 A6 A5 A4 A3 A2 A1 A0
Quá trình xoay dữ liệu từ A0 đến A6 — <— <— <— <— <— <— <— <—
Giá trị ở C chuyển sang bit A0 — C ———————————————————>A0
• Ví dụ: giả sử cờ nhớ C đang mang giá trị 1
Mov A,#11001001b
RLC A
Kết quả sau khi các lệnh được thực hiện A mang giá trị là 10010011b và C mang giá trị 1
Cờ nhớ C Giá trị thanh A
Trước khi thực hiện lệnh xoay trái với C 1 1 1 0 0 1 0 0 1
Sau khi thực hiện lệnh xoay trái với C 1 1 0 0 1 0 0 1 1
23. Lệnh xoay phải dữ liệu trên thanh ghi A:
• Cú pháp: RR A
• Lệnh này chiếm dung lượng bộ nhớ ROM là 1 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: thanh ghi A gồm tám bit A7 A6 A5 A4 A3 A2 A1 A0. Khi thực hiện lệnh xoay phải RR A giá trị của các bit được chuyển trang bit ở bên phải nó, giá trị của bit A7 chuyển sang bit A6, giá trị của bit A6 chuyển sang bit A5, tương tự với các bit còn lại, và giá trị của bit A0 chuyển sang bit A7. Minh họa các bit trong thanh ghi A khi thực hiện lệnh như trong hình dưới
Các bit ở thanh ghi A — A7 A6 A5 A4 A3 A2 A1 A0
Quá trình xoay dữ liệu từ A7 đến A1 — —> —> —> —> —> —> —>
Giá trị dữ liệu A0 chuyển sang bit A7 — A7 <——————————————————A0
• Ví dụ:
Mov A,#01001001b
RL A
Kết quả sau khi các lệnh được thực hiện A mang giá trị là 10100100b
Giá trị thanh A
Trước khi thực hiện lệnh xoay phải 0 1 0 0 1 0 0 1
Sau khi thực hiện lệnh xoay phải 1 0 1 0 0 1 0 0
24. Lệnh xoay phải dữ liệu trên thanh ghi A cùng với cờ nhớ C:
• Cú pháp: RRC A
• Lệnh này chiếm dung lượng bộ nhớ ROM là 1 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: thanh ghi A gồm tám bit A7 A6 A5 A4 A3 A2 A1 A0. Khi thực hiện lệnh xoay phải A với cờ nhớ -RRC A -giá trị của các bit được chuyển trang bit ở bên phải nó, giá trị của bit A7 chuyển sang bit A6, giá trị của bit A6 chuyển sang bit A5, tương tự với các bit còn lại, và giá trị của bit A0 chuyển sang cờ nhớ C, giá trị ở cờ nhớ C chuyển sang bit A7
Các bit ở thanh ghi A cùng với cờ C — C A7 A6 A5 A4 A3 A2 A1 A0
Quá trình xoay dữ liệu từ C đến A1 — —> —> —> —> —> —> —> —>
Giá trị ở A0 chuyển sang bit C — C <———————————————————A0
• Ví dụ: giả sử cờ nhớ C đang mang giá trị 1
Mov A,#11001001b
RLC A
Kết quả sau khi các lệnh được thực hiện A mang giá trị là 11100100b và C mang giá trị 1
Cờ nhớ C Giá trị thanh A
Trước khi thực hiện lệnh xoay trái với C 1 1 1 0 0 1 0 0 1
Sau khi thực hiện lệnh xoay trái với C 1 1 1 1 0 0 1 0 0
25. Lệnh xoay 4 bit trên thanh ghi A:
• Cú pháp: SWAP A
• Lệnh này chiếm dung lượng bộ nhớ ROM là 1 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: hoán chuyển dữ liệu ở 4 bit thấp lên 4 bit cao và 4 bit cao xuống 4 bit thấp
Các bit ở thanh ghi A — A7 A6 A5 A4 A3 A2 A1 A0
Dữ liệu trước khi thực hiên lệnh — X7 X6 X5 X4 X3 X2 X1 X0
Dữ liệu sau khi thực hiên lệnh — X3 X2 X1 X0 X7 X6 X5 X4
• Ví dụ:
mov A,#0E7h
SWAP A
Kết quả : A = # 7Eh

2.5.NHÓM LỆNH RẼ NHÁNH Trang 5

Phần này liên quan đến các câu lệnh được lưu giữ trên ROM, vì vậy cần xem lại phần bộ nhớ ROM trước khi xem phần này.
Phần phụ chú:
Nhãn: Kí hiệu: rel
Nhãn là một chuỗi kí tự do người dùng tự đặt dùng để đánh dấu các đoạn chương trình, nhãn này biểu thị địa chỉ của lệnh khi được lưu trên ROM.
Nhãn chỉ được bắt đầu bằng một kí tự chữ hoặc dấu "_" ,không được bắt đầu bằng số ,không có khoảng trắng và kết thúc bằng dấu hai chấm ":"
Trong chương trình nhãn không được đặt trùng tên với nhau, và không được trùng với các từ khóa mà chương trình đã sử dụng.
Ví dụ : Các nhãn đúng X1: ;S_2: ;_5:s10: ;...
Các nhãn sai 1X: ; S_2 ;S 5: ;DW: ,LPT :...
Chương trình con: là những đoạn chương trình thực hiện một số lệnh nào đó và được viết ngoài chương trình chính, các chương trình con này được đặt tên bằng một nhãn và kết thúc bằng lệnh RET, chương trình con có thể gọi một chương trình con khác. Chương trình con được chương trình chính sử dụng khi cần thiết bằng các lệnh gọi chương trình con; khi có lệnh gọi chương trình con, Vi điều khiển chuyển về thực hiện các đoạn chương trình của chương trình con, sau khi thực hiện chương trình con Vi điều khiển tiếp tục trở về thực hiện các câu lệnh trong chương trình chính.
Chương trình con giúp cho chương trình mạch lạc, dễ hiểu hơn, nếu trong chương trình chính có các đoạn chương trình được lặp đi lặp lại nhiều lần thì các đoạn chương trình đó thường được viết thành một chương trình con và truy xuất bằng một câu lệnh gọi chương trình con. Việc sử dụng chương trình con giúp cho việc tìm lỗi và chỉnh sửa chương trình dễ hơn, nếu chương trình chính sử dụng nhiều lần chương trình con, khi cần sửa đổi chỉ cần thay đổi các câu lệnh trong chương trình con.
Chương trình con bắt đầu bằng một nhãn và kết thúc bằng lệnh Reti, chương trình con có thể đặt ở đầu hoặc cuối chương trình.
2.5.1. Lệnh gọi chương trình con dùng địa chỉ tuyệt đối
• Cú pháp: ACall addr11
• Lệnh này chiếm dung lượng bộ nhớ ROM là 2 Byte
• Thời gian thực hiện: 2 chu kì máy
• Công dụng: Khi lệnh được thực hiện, Vi điều khiển chuyển về thực hiện các câu lệnh của chương trình con bắt đầu từ địa chỉ addr11 trên Rom, địa chỉ addr11 có thể thay bằng nhãn bắt đầu của một chương trình con. Câu lệnh được thực hiện khi địa chỉ addr11 cách lệnh gọi không quá 2 KByte .
• Ví dụ: ACall 45A6H
2.5.2. Lệnh gọi chương trình con dùng địa chỉ tuyệt đối
• Cú pháp: ACall addr16
• Lệnh này chiếm dung lượng bộ nhớ ROM là 3 Byte
• Thời gian thực hiện: 2 chu kì máy
• Công dụng: Khi lệnh được thực hiện, Vi điều khiển chuyển về thực hiện các câu lệnh của chương trình con bắt đầu từ địa chỉ addr16 trên Rom, địa chỉ addr16 có thay bằng nhãn bắt đầu chương trình con. Câu lệnh có thể gọi chương trình con ở bất kì vị trí nào trên Rom vì khoảng cách từ lệnh gọi đến chương trình con là 64 KByte.
2.5.3. Lệnh kết thúc chương trình con
• Cú pháp: Ret
• Lệnh này chiếm dung lượng bộ nhớ ROM là 1 Byte
• Thời gian thực hiện: 2 chu kì máy
• Công dụng: Lệnh này dùng kết thúc chương trình con, khi gặp lệnh này Vi điều khiển quay về thực hiện lệnh ở chương trình chính.
2.5.4. Lệnh kết thúc chương trình con phục vụ ngắt
• Cú pháp: Reti
• Lệnh này chiếm dung lượng bộ nhớ ROM là 1 Byte
• Thời gian thực hiện: 2 chu kì máy
• Công dụng: Lệnh này dùng kết thúc chương trình con ngắt, khi gặp lệnh này Vi điều khiển quay về thực hiện lệnh ở chương trình chính.
2.5.5. Lệnh nhảy ngắn đến địa chỉ tuyệt đối
• Cú pháp: AJMP addr11
• Lệnh này chiếm dung lượng bộ nhớ ROM là 2 Byte
• Thời gian thực hiện: 2 chu kì máy
• Công dụng: Khi lệnh được thực hiện, Vi điều khiển chuyển về thực hiện các câu lệnh của chương trình bắt đầu tại địa chỉ addr11 trên Rom, địa chỉ addr11 có thể thay bằng nhãn . Câu lệnh chỉ được thực hiện khi vị trí lưu chương trình cần thực hiện cách lệnh gọi không quá 2 KByte
2.5.6. Lệnh nhảy dài đến địa chỉ tuyệt đối
• Cú pháp: LJMP addr16
• Lệnh này chiếm dung lượng bộ nhớ ROM là 3 Byte
• Thời gian thực hiện: 2 chu kì máy
• Công dụng: Khi lệnh được thực hiện, Vi điều khiển chuyển về thực hiện các câu lệnh của chương trình bắt đầu tại địa chỉ addr11 trên Rom, địa chỉ addr11 có thể thay bằng nhãn . Câu lệnh có thể gọi chương trình ở bất kì vị trí nào trên Rom vì khoảng cách từ lệnh gọi đến chương trình con là 64 KByte
2.5.7. Lệnh nhảy tương đối
• Cú pháp: SJMP rel
• Lệnh này chiếm dung lượng bộ nhớ ROM là 2 Byte
• Thời gian thực hiện: 2 chu kì máy
• Công dụng: Khi lệnh được thực hiện, Vi điều khiển chuyển đến thực hiện các câu lệnh của chương trình được đánh dấu bằng nhãn. Câu lệnh chỉ được thực hiện địa chỉ của nhãn cách lệnh gọi không quá 128 Byte.(cả tới hoặc lùi )
2.5.8. Lệnh nhảy gián tiếp
• Cú pháp: JMP @A+DPTR
• Lệnh này chiếm dung lượng bộ nhớ ROM là 2 Byte
• Thời gian thực hiện: 2 chu kì máy
• Công dụng: Khi lệnh được thực hiện, Vi điều khiển chuyển đến thực hiện các câu lệnh của chương trình có địa chỉ trên ROM bằng giá trị của A cộng với giá trị lưu giữ trên DPTR
2.5.9. Lệnh nhảy thuận với cờ Zero
• Cú pháp: JZ rel
• Lệnh này chiếm dung lượng bộ nhớ ROM là 2 Byte
• Thời gian thực hiện: 2 chu kì máy
• Công dụng:
Nếu cờ Zero có giá trị 1(tức thanh ghi A có giá trị 0), Vi điều khiển sẽ nhảy đến thực hiện chương trình tại địa chỉ mà nhãn được đặt
Nếu cờ Zero có giá trị 0(tức thanh ghi A có giá trị khác 0), Vi điều khiển thực hiện lệnh kế tiếp (không thực hiện lệnh nhảy)
2.5.10. Lệnh nhảy nghịch với cờ Zero
• Cú pháp: JNZ rel
• Lệnh này chiếm dung lượng bộ nhớ ROM là 2 Byte
• Thời gian thực hiện: 2 chu kì máy
• Công dụng:
Nếu cờ Zero có giá trị 0(tức thanh ghi A có giá trị khác 0), Vi điều khiển sẽ nhảy đến thực hiện chương trình tại địa chỉ mà nhãn được đặt
Nếu cờ Zero có giá trị 1(tức thanh ghi A có giá trị 0), Vi điều khiển thực hiện lệnh kế tiếp (không thực hiện lệnh nhảy)
2.5.11. Lệnh nhảy thuận với cờ C
• Cú pháp: JC rel
• Lệnh này chiếm dung lượng bộ nhớ ROM là 2 Byte
• Thời gian thực hiện: 2 chu kì máy
• Công dụng:
Nếu cờ C có giá trị 1, Vi điều khiển sẽ nhảy đến thực hiện chương trình tại địa chỉ mà nhãn được đặt
Nếu cờ C có giá trị 0, Vi điều khiển thực hiện lệnh kế tiếp (không thực hiện lệnh nhảy)
2.5.12. Lệnh nhảy nghịch với cờ Zero
• Cú pháp: JNC rel
• Lệnh này chiếm dung lượng bộ nhớ ROM là 2 Byte
• Thời gian thực hiện: 2 chu kì máy
• Công dụng:
Nếu cờ C có giá trị 0, Vi điều khiển sẽ nhảy đến thực hiện chương trình tại địa chỉ mà nhãn được đặt
Nếu cờ C có giá trị 1, Vi điều khiển thực hiện lệnh kế tiếp (không thực hiện lệnh nhảy)
2.5.13. Lệnh nhảy thuận với giá trị của bit nhớ
• Cú pháp: JB bit,rel
• Lệnh này chiếm dung lượng bộ nhớ ROM là 3 Byte
• Thời gian thực hiện: 2 chu kì máy
• Công dụng:
Nếu bit nhớ có giá trị 1, Vi điều khiển sẽ nhảy đến thực hiện chương trình tại địa chỉ mà nhãn được đặt
Nếu bit nhớ có giá trị 0, Vi điều khiển thực hiện lệnh kế tiếp (không thực hiện lệnh nhảy)
2.5.14. Lệnh nhảy nghịch với giá trị của bit nhớ
• Cú pháp: JNC bit,rel
• Lệnh này chiếm dung lượng bộ nhớ ROM là 3 Byte
• Thời gian thực hiện: 2 chu kì máy
• Công dụng:
Nếu bit nhớ có giá trị 0, Vi điều khiển sẽ nhảy đến thực hiện chương trình tại địa chỉ mà nhãn được đặt
Nếu bit nhớ có giá trị 1, Vi điều khiển thực hiện lệnh kế tiếp (không thực hiện lệnh nhảy)
2.5.15. Lệnh nhảy thuận với giá trị của bit nhớ và xóa bit
• Cú pháp: JBC bit,rel
• Lệnh này chiếm dung lượng bộ nhớ ROM là 3 Byte
• Thời gian thực hiện: 2 chu kì máy
• Công dụng:
Nếu bit nhớ có giá trị 1, Vi điều khiển sẽ nhảy đến thực hiện chương trình tại địa chỉ mà nhãn được đặt, đồng thời xóa giá trị chứa trong bit nhớ đó tức là đưa bit nhớ đó về giá trị 0
Nếu bit nhớ có giá trị 0, Vi điều khiển thực hiện lệnh kế tiếp (không thực hiện lệnh nhảy)
2.5.16. Lệnh nhảy có điều kiện(so sánh giá trị của thanh ghi A và Rn)
• Cú pháp: CJNE A,direct,rel
• Lệnh này chiếm dung lượng bộ nhớ ROM là 3 Byte
• Thời gian thực hiện: 2 chu kì máy
• Công dụng:
Vi điều khiển nhảy đến thực hiện chương trình tại địa chỉ mà nhãn được đặt nếu giá trị của thanh ghi A khác giá trị của ô nhớ có địa chỉ direct, nếu bằng nhau Vi điều khiển không nhảy và thực hiện lệnh kế
Ảnh hưởng của lệnh đến cờ nhớ C:
Nếu giá trị của thanh ghi A ≥ giá trị của ô nhớ có địa chỉ direct thì bit C có giá trị 0
Nếu giá trị của thanh ghi A < giá trị của ô nhớ có địa chỉ direct thì bit C có giá trị 1
2.5.17. Lệnh nhảy có điều kiện(so sánh giá trị của thanh ghi A và dữ liệu cho trước)
• Cú pháp: CJNE A,#data,rel
• Lệnh này chiếm dung lượng bộ nhớ ROM là 3 Byte
• Thời gian thực hiện: 2 chu kì máy
• Công dụng:
Vi điều khiển sẽ nhảy đến thực hiện chương trình tại địa chỉ mà nhãn được đặt, nếu giá trị của thanh ghi A khác giá trị dữ liệu cho trước, nếu bằng nhau Vi điều khiển không nhảy và thực hiện lệnh kế
Ảnh hưởng của lệnh đến cờ nhớ C:
Nếu giá trị của thanh ghi A ≥ giá trị dữ liệu cho trước thì bit C có giá trị 0
Nếu giá trị của thanh ghi A < giá trị dữ liệu cho trước thì bit C có giá trị 1
2.5.18. Lệnh nhảy có điều kiện(so sánh giá trị của thanh ghi Rn và dữ liệu cho trước)
• Cú pháp: CJNE Rn,#data,rel
• Lệnh này chiếm dung lượng bộ nhớ ROM là 3 Byte
• Thời gian thực hiện: 2 chu kì máy
• Công dụng:
Vi điều khiển sẽ nhảy đến thực hiện chương trình tại địa chỉ mà nhãn được đặt nếu giá trị của thanh ghi Rn khác giá trị dữ liệu cho trước, nếu bằng nhau Vi điều khiển không nhảy và thực hiện lệnh kế.
Ảnh hưởng của lệnh đến cờ nhớ C:
Nếu giá trị của thanh ghi A ≥ giá trị dữ liệu cho trước thì bit C có giá trị 0
Nếu giá trị của thanh ghi A < giá trị dữ liệu cho trước thì bit C có giá trị 1
2.5.18. Lệnh nhảy có điều kiện(so sánh giá trị của ô nhớ có địa chỉ gián tiếp và dữ liệu cho trước)
• Cú pháp: CJNE @Ri,#data,rel
• Lệnh này chiếm dung lượng bộ nhớ ROM là 3 Byte
• Thời gian thực hiện: 2 chu kì máy
• Công dụng:
Vi điều khiển nhảy đến thực hiện chương trình tại địa chỉ mà nhãn được đặt nếu giá trị của ô nhớ có địa chỉ bằng giá trị của Ri khác giá trị dữ liệu cho trước, nếu bằng nhau Vi điều khiển không nhảy và thực hiện lệnh kế
Ảnh hưởng của lệnh đến cờ nhớ C:
Nếu giá trị của ô nhớ có địa chỉ gián tiếp ≥ giá trị dữ liệu cho trước thì bit C có giá trị 0
Nếu giá trị của ô nhớ có địa chỉ gián tiếp < giá trị dữ liệu cho trước thì bit C có giá trị 1
2.5.19. Lệnh nhảy có điều kiện kết hợp với lệnh giảm trên thanh ghi Rn
• Cú pháp: DJNZ Rn,rel
• Lệnh này chiếm dung lượng bộ nhớ ROM là 2 Byte
• Thời gian thực hiện: 2 chu kì máy
• Công dụng:
Giảm giá trị của thanh ghi Rn xuống 1 đơn vị, và
-Nếu giá trị trong thanh ghi Rn khác 0, Vi điều khiển nhảy đến thực hiện chương trình tại địa chỉ mà nhãn được đặt.
-Nếu giá trị trong thanh ghi Rn bằng 0, Vi điều khiển thực hiện lệnh kế tiếp
2.5.20. Lệnh nhảy có điều kiện kết hợp với lệnh giảm trên ô nhớ có địa chỉ direct
• Cú pháp: DJNZ direct,rel
• Lệnh này chiếm dung lượng bộ nhớ ROM là 3 Byte
• Thời gian thực hiện: 2 chu kì máy
• Công dụng:
Giảm giá trị của ô nhớ có địa chỉ direct xuống 1 đơn vị
Nếu giá trị trong ô nhớ có địa chỉ direct khác 0, Vi điều khiển nhảy đến thực hiện chương trình tại địa chỉ mà nhãn được đặt.
Nếu giá trị trong ô nhớ có địa chỉ direct bằng 0, Vi điều khiển thực hiện lệnh kế tiếp
2.5.21. Lệnh delay 1 chu kì máy
• Cú pháp: NOP
• Lệnh này chiếm dung lượng bộ nhớ ROM là 1 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: delay trong 1 chu kì máy
2.6.NHÓM LỆNH XỬ LÍ BIT Trang 6
Qui ước: trong câu lệnh "bit" đại diện cho một địa chỉ của bit nhớ
2.6.1. Lệnh xoá cờ nhớ C
• Cú pháp: CLR C
• Lệnh này chiếm dung lượng bộ nhớ ROM là 1 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: Xóa cờ nhớ C - tức là đưa giá trị của cờ nhớ C về 0
2.6.2. Lệnh xoá bit
• Cú pháp: CLR bit
• Lệnh này chiếm dung lượng bộ nhớ ROM là 2 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: Xóa giá trị của bit nhớ có địa chỉ xác định - tức là đưa giá trị bit đó về 0
2.6.3. Lệnh thiết đặt cờ nhớ C
• Cú pháp: SetB C
• Lệnh này chiếm dung lượng bộ nhớ ROM là 1 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: thiết đặt cờ nhớ C - tức là đưa giá trị của cờ nhớ C lên 1
2.6.4. Lệnh thiết đặt giá trị cho bit nhớ
• Cú pháp: SetB bit
• Lệnh này chiếm dung lượng bộ nhớ ROM là 2 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: Thiết đặt giá trị bit nhớ có địa chỉ xác định - tức là đưa giá trị bit đó lên 1
2.6.5. Lệnh bù cờ nhớ C
• Cú pháp: CPL C
• Lệnh này chiếm dung lượng bộ nhớ ROM là 1 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: đổi giá trị của cờ nhớ C, nếu trước đó C có giá trị 0 chuyển thành 1, và ngược lại nếu trước đó C có giá trị 1 chuyển thành 0
2.6.6. Lệnh bù bit
• Cú pháp: CPL bit
• Lệnh này chiếm dung lượng bộ nhớ ROM là 2 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: đổi giá trị của bit có địa chỉ xác định, nếu trước đó bit đó có giá trị 0 chuyển thành 1, và ngược lại nếu trước đó bit đó có giá trị 1 chuyển thành 0
2.6.7. Lệnh And cờ nhớ C với bit
• Cú pháp: ANL C,bit
• Lệnh này chiếm dung lượng bộ nhớ ROM là 2 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: Thực hiện phép And cờ nhớ C và bit có địa chỉ xác định, kết quả lưu ở C
2.6.8. Lệnh And cờ nhớ C với bit đã được lấy bù
• Cú pháp: ANL C,/bit
• Lệnh này chiếm dung lượng bộ nhớ ROM là 2 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: Thực hiện phép And cờ nhớ C và bit có địa chỉ xác định đã được lấy bù, kết quả lưu ở C
2.6.9. Lệnh OR cờ nhớ C với bit
• Cú pháp: ORL C,bit
• Lệnh này chiếm dung lượng bộ nhớ ROM là 2 Byte
• Thời gian thực hiện: 2 chu kì máy
• Công dụng: Thực hiện phép And cờ nhớ C và bit có địa chỉ xác định, kết quả lưu ở C
2.6.10. Lệnh OR cờ nhớ C với bit đã được lấy bù
• Cú pháp: ORL C,/bit
• Lệnh này chiếm dung lượng bộ nhớ ROM là 2 Byte
• Thời gian thực hiện: 2 chu kì máy
• Công dụng: Thực hiện phép And cờ nhớ C và bit có địa chỉ xác định đã được lấy bù, kết quả lưu ở C
2.6.11. Lệnh chuyển giá trị bit có địa chỉ xác định vào cờ nhớ C
• Cú pháp: Mov C,bit
• Lệnh này chiếm dung lượng bộ nhớ ROM là 2 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: Thực hiện chuyển giá trị của bit có địa chỉ xác định vào cờ nhớ C
2.6.12. Lệnh chuyển giá trị cờ nhớ C vào bit có địa chỉ xác định
• Cú pháp: Mov bit,C
• Lệnh này chiếm dung lượng bộ nhớ ROM là 2 Byte
• Thời gian thực hiện: 2 chu kì máy
• Công dụng: Thực hiện chuyển giá trị của cờ nhớ C vào bit có địa chỉ xác định

HẾT <<<<<<<<<<<<<< em sẽ tìm thêm các pác ddocj tạm nhá

lập trình 89S cho các new programer........(tt)

tiếp phần tập lệnh
2.3 NHÓM LỆNH SỐ HỌC
Để theo dõi các lệnh trong phần này, các bạn xem lại phần: các ô nhớ có chức năng đặc biệt và chú ý phần 1.1.11 Thanh ghi trạng thái chương trình PSW
Phần phụ chú: ảnh hưởng của phép cộng và trừ lên thanh trạng thái PSW.
Cờ nhớ C:

C=1 nếu phép toán cộng xảy ra tràn hoặc phép trừ có mượn
C=0 nếu phép toán cộng không tràn hoặc phép trừ không có mượn.
Phép cộng xảy ra tràn là phép cộng mà kết quả lớn hơn 255 (hay FFH hay 11111111b), lúc này C=1
Ví dụ: phép cộng không tràn
Số cộng 38H 56 0 0 1 1 1 0 0 0 b
Số cộng +3AH 58 0 0 1 1 1 0 1 0 b
Kết quả 72H 114 0 1 1 1 0 0 1 0 b
Cờ nhớ C 0 0
Phép cộng tràn
Số cộng 6CH 108 0 1 1 0 1 1 0 0 b
Số cộng +9FH 159 1 0 0 1 1 1 1 1 b
Kết quả 10BH 267 1 0 0 0 0 1 0 1 1 b
Cờ nhớ C 1 1
Phần được tô màu xanh là 8 bit của thanh ghi A sau khi kết quả được thực hiện, phần màu đỏ trong kết quả là giá trị bị tràn, giá trị này không lưu ở thanh ghi A mà lưu ở thanh ghi PSW, tại cờ C
Số trừ 9FH 159 1 0 0 1 1 1 1 1 b
Số bị trừ -6CH 108 0 1 1 0 1 1 0 0 b
Kết quả 33H 51 0 0 1 1 0 0 1 1 b
Cờ nhớ C 0 0

Số trừ 6CH 108 0 1 1 0 1 1 0 0 b
Số bị trừ -9FH 159 1 0 0 1 1 1 1 1 b
Kết quả CDH -51 1 1 0 0 1 1 0 1 b
Cờ nhớ C 1 1 -phép trừ trên có số muợn

2.3.1. Lệnh cộng dữ liệu trên thanh ghi A với dữ liệu trên thanh ghi Rn:
• Cú pháp: Add A,Rn
• Lệnh này chiếm dung lượng bộ nhớ ROM là 1 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: Cộng giá trị dữ liệu trên thanh ghi A với giá trị dữ liệu trên thanh ghi Rn, sau khi thực hiện lệnh kết quả được lưu ở thanh ghi A. Lệnh này có ảnh hưởng đến thanh thanh trạng thái PSW
• Ví dụ:
Mov A,#20H
Mov R1,#08H
Add A,R1
Kết quả : A có giá trị là 28H
R1 vẫn giữ nguyên giá trị là 08H
Cờ C = 0
Vidu2:
Mov A,#0E9H
Mov R6,#0BAH
Add A,R6
Kết quả : A = #0A3h
R6 = #0BAh
Cờ C = 1
2.3.2. Lệnh cộng dữ liệu trên thanh ghi A với dữ liệu ở ô nhớ có địa chỉ direct:
• Cú pháp: Add A,direct
• Lệnh này chiếm dung lượng bộ nhớ ROM là 2 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: Cộng giá trị dữ liệu trên thanh ghi A với giá trị dữ liệu trên ô nhớ có địa chỉ direct, sau khi thực hiện lệnh kết quả được lưu ở thanh ghi A. Lệnh này có ảnh hưởng đến thanh thanh trạng thái PSW
• Ví dụ:
Mov 50h,#20H
Mov A,#0E8H
Add A,50H
Kết quả : A = #08H
50H = #20H
C = 1
2.3.3. Lệnh cộng dữ liệu trên thanh ghi A với dữ liệu của ô nhớ có địa chỉ gián tiếp:
• Cú pháp: Add A,@Ri
• Lệnh này chiếm dung lượng bộ nhớ ROM là 1 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: Cộng giá trị dữ liệu trên thanh ghi A với giá trị dữ liệu của ô nhớ có địa chỉ bằng giá trị của thanh ghi Ri, sau khi thực hiện lệnh kết quả được lưu ở thanh ghi A. Lệnh này có ảnh hưởng đến thanh thanh trạng thái PSW
• Ví dụ:
AC = 1 ;cờ C đang mang giá trị 1
Mov 50H,#60H
Mov R2,#50H
Mov A,#01H
Add A,@R2
Kết quả : A = #61H
R2 = #50H
C = 0 ;cờ C mang giá trị 0
2.3.4. Lệnh cộng dữ liệu trên thanh ghi A với dữ liệu xác định:
• Cú pháp: Add A,#data
• Lệnh này chiếm dung lượng bộ nhớ ROM là 2 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: Cộng giá trị dữ liệu trên thanh ghi A với một giá trị xác định, sau khi thực hiện lệnh kết quả được lưu ở thanh ghi A. Lệnh này có ảnh hưởng đến thanh thanh trạng thái PSW
• Ví dụ:
Mov A,#05h
Add A,#06h
Kết quả : A = #0Bh
C = 0
2.3.5. Lệnh cộng dữ liệu trên thanh ghi A với dữ liệu trên thanh ghi Rn có số nhớ ở cờ C:
• Cú pháp: AddC A,Rn
• Lệnh này chiếm dung lượng bộ nhớ ROM là 1 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: Cộng giá trị dữ liệu trên thanh ghi A với giá trị dữ liệu trên thanh ghi Rn và cộng thêm giá trị của số nhớ trên cờ C, sau khi thực hiện lệnh kết quả được lưu ở thanh ghi A. Lệnh này có ảnh hưởng đến thanh thanh trạng thái PSW
• Ví dụ: C = 1
Mov A,#08h
Mov R1,#10h
Addc A,R1
Kết quả : A = #19h ;cộng cả cờ C
R1 = #10h
C =0
2.3.6. Lệnh cộng dữ liệu trên thanh ghi A với dữ liệu ở ô nhớ có địa chỉ direct và giá trị số nhớ ở cờ C:
• Cú pháp: AddC A,direct
• Lệnh này chiếm dung lượng bộ nhớ ROM là 2 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: Cộng giá trị dữ liệu trên thanh ghi A với giá trị dữ liệu của ô nhớ có địa chỉ direct và cộng thêm giá trị của số nhớ trên cờ C , sau khi thực hiện lệnh kết quả được lưu ở thanh ghi A. Lệnh này có ảnh hưởng đến thanh thanh trạng thái PSW
• Ví dụ: C = 0
Mov A,#0A5h
Mov 10h,#96h
Addc A,10h
Kết quả : A = #3Bh
10h = #96h
C =1
2.3.7. Lệnh cộng dữ liệu trên thanh ghi A với dữ liệu của ô nhớ có địa chỉ gián tiếp và số nhớ ở cờ C:
• Cú pháp: AddC A,@Ri
• Lệnh này chiếm dung lượng bộ nhớ ROM là 1 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: Cộng giá trị dữ liệu trên thanh ghi A với giá trị dữ liệu của ô nhớ có địa chỉ bằng giá trị của thanh ghi Ri và cộng thêm giá trị của số nhớ trên cờ C, sau khi thực hiện lệnh kết quả được lưu ở thanh ghi A. Lệnh này có ảnh hưởng đến thanh thanh trạng thái PSW
• Ví dụ:
C = 1
Mov A,#05h
Mov 50h,#10h
Mov R2,#50h
Addc a,@R2
Kết quả : A = #16h
C = 0
2.3.8. Lệnh cộng dữ liệu trên thanh ghi A với dữ liệu xác định và số nhớ ở cờ C:
• Cú pháp: AddC A,#data
• Lệnh này chiếm dung lượng bộ nhớ ROM là 2 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: Cộng giá trị dữ liệu trên thanh ghi A với giá trị xác định và cộng thêm giá trị của số nhớ trên cờ C, sau khi thực hiện lệnh kết quả được lưu ở thanh ghi A. Lệnh này có ảnh hưởng đến thanh thanh trạng thái PSW
• Ví dụ:
C = 1
Mov A,#05h
Addc A,#16h
Kết quả : A = #1Ch
C = 0
2.3.9. Lệnh trừ dữ liệu trên thanh ghi A với dữ liệu trên thanh ghi Rn và số nhớ ở cờ C:
• Cú pháp: SubB A,Rn
• Lệnh này chiếm dung lượng bộ nhớ ROM là 1 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: Trừ giá trị dữ liệu trên thanh ghi A với giá trị dữ liệu trên thanh ghi Rn và trừ cho giá trị nhớ trên cờ C, sau khi thực hiện lệnh kết quả được lưu ở thanh ghi A. Lệnh này có ảnh hưởng đến thanh thanh trạng thái PSW
• Ví dụ: C = 1
Mov A,#0E5h
Mov R3,#9Fh
Subb A,R3
kết quả : A = 45h
C = 0
2.3.10. Lệnh trừ dữ liệu trên thanh ghi A với dữ liệu ở ô nhớ có địa chỉ direct và số nhớ ở cờ C:
• Cú pháp: SubB A,direct
• Lệnh này chiếm dung lượng bộ nhớ ROM là 2 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: Trừ giá trị dữ liệu trên thanh ghi A với giá trị dữ liệu của ô nhớ có địa chỉ direct và trừ cho giá trị nhớ trên cờ C , sau khi thực hiện lệnh kết quả được lưu ở thanh ghi A. Lệnh này có ảnh hưởng đến thanh thanh trạng thái PSW
• Ví dụ:
C = 0
Mov A,#0E5h
Mov 05h,#9Fh
Subb A,05h
kết quả : A = 46h
C = 0
2.3.11. Lệnh trừ dữ liệu trên thanh ghi A với dữ liệu của ô nhớ có địa chỉ gián tiếp và số nhớ ở cờ C:
• Cú pháp: SubB A,@Ri
• Lệnh này chiếm dung lượng bộ nhớ ROM là 1 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: Trừ giá trị dữ liệu trên thanh ghi A với giá trị dữ liệu của ô nhớ có địa chỉ bằng giá trị của thanh ghi Ri và trừ cho giá trị nhớ trên cờ C, sau khi thực hiện lệnh kết quả được lưu ở thanh ghi A. Lệnh này có ảnh hưởng đến thanh thanh trạng thái PSW
• Ví dụ:
C = 1
Mov A,#0E5h
Mov 4Fh,#50h
Mov R3,#4Fh
Subb A,@R3
kết quả : A = 94h
C = 0
2.3.12. Lệnh trừ dữ liệu trên thanh ghi A với dữ liệu xác định và số nhớ ở cờ C:
• Cú pháp: SubB A,#data
• Lệnh này chiếm dung lượng bộ nhớ ROM là 2 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: Trừ giá trị dữ liệu trên thanh ghi A với giá trị xác định và trừ thêm giá trị nhớ trên cờ C, sau khi thực hiện lệnh kết quả được lưu ở thanh ghi A. Lệnh này có ảnh hưởng đến thanh thanh trạng thái PSW
• Ví dụ:
C = 0
Mov A,#05h
Subb A,#4Fh
kết quả : A = 0B6h
C = 1
2.3.13.Lệnh tăng giá trị dữ liệu trên thanh ghi A lên 1 đơn vị:
• Cú pháp: Inc A
• Lệnh này chiếm dung lượng bộ nhớ ROM là 1 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: Tăng giá trị dữ liệu lưu giữ trên thanh ghi A lên 1 đơn vị, không ảnh hưởng đến các cờ nhớ trên PSW
Ví dụ: Mov A,#05h
Inc A
Kết quả : A = #06h
2.3.14.Lệnh tăng giá trị dữ liệu trên thanh ghi Rn lên 1 đơn vị:
• Cú pháp: Inc Rn
• Lệnh này chiếm dung lượng bộ nhớ ROM là 1 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: Tăng giá trị dữ liệu lưu giữ trên thanh ghi Rn lên 1 đơn vị, không ảnh hưởng đến các cờ nhớ trên PSW
• Ví dụ:
Mov R7,#0Fh
Inc R7
Kết quả : R7 = #10h
2.3.15.Lệnh tăng giá trị dữ liệu ở ô nhớ có địa chỉ direct lên 1 đơn vị:
• Cú pháp: Inc direct
• Lệnh này chiếm dung lượng bộ nhớ ROM là 2 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: Tăng giá trị dữ liệu ở một ô nhớ có địa chỉ direct lên 1 đơn vị, không ảnh hưởng đến các cờ nhớ trên PSW
• Ví dụ:
Mov 50h,#0FFh
Inc 50h
Kết quả : 50h = #00
2.3.16.Lệnh tăng giá trị dữ liệu ở ô nhớ có địa chỉ gián tiếp lên 1 đơn vị:
• Cú pháp: Inc @Ri
• Lệnh này chiếm dung lượng bộ nhớ ROM là 1 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: Tăng giá trị dữ liệu ở ô nhớ có địa chỉ bằng giá trị dữ liệu trên Ri lên 1 đơn vị, không ảnh hưởng đến các cờ nhớ trên PSW
• Ví dụ:
Mov 0Fh,#05h
Mov R0,#0Fh
Inc @R0
Kết quả : R0 = #06h
0Fh = #05h
2.3.17.Lệnh tăng giá trị của con trỏ dữ liệu DPTR lên 1 đơn vị:
• Cú pháp: Inc DPTR
• Lệnh này chiếm dung lượng bộ nhớ ROM là 1 Byte
• Thời gian thực hiện: 2 chu kì máy
• Công dụng: Tăng giá trị dữ liệu của thanh ghi con trỏ dữ liệu DPTR lên 1 đơn vị, không ảnh hưởng đến các cờ nhớ trên PSW
• Ví dụ:
Mov DPTR,#5Fh
Inc DPTR
Kết quả : DPTR = #060h
2.3.18.Lệnh giảm giá trị dữ liệu trên thanh ghi A xuống 1 đơn vị:
• Cú pháp: Dec A
• Lệnh này chiếm dung lượng bộ nhớ ROM là 1 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: Giảm giá trị dữ liệu lưu giữ trên thanh ghi A xuống 1 đơn vị, không ảnh hưởng đến các cờ nhớ trên PSW
• Ví dụ:
Mov A,#05h
Dec A
Kết quả : A = #04h
2.3.19.Lệnh giảm giá trị dữ liệu trên thanh ghi Rn xuống 1 đơn vị:
• Cú pháp: Dec Rn
• Lệnh này chiếm dung lượng bộ nhớ ROM là 1 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: Giảm giá trị dữ liệu lưu giữ trên thanh ghi Rn xuống 1 đơn vị, không ảnh hưởng đến các cờ nhớ trên PSW
• Ví dụ:
Mov R6,#0Fh
Dec R6
Kết quả : R6 = #0Eh
2.3.20.Lệnh giảm giá trị dữ liệu ở ô nhớ có địa chỉ direct xuống 1 đơn vị:
• Cú pháp: Dec direct
• Lệnh này chiếm dung lượng bộ nhớ ROM là 1 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: Giảm giá trị dữ liệu ở ô nhớ có địa chỉ direct xuống 1 đơn vị, không ảnh hưởng đến các cờ nhớ trên PSW
• Ví dụ:
Mov 7Fh,#0
Dec 7Fh
Kết quả : 7Fh = #0FFh
2.3.21.Lệnh giảm giá trị dữ liệu ở ô nhớ có địa chỉ gián tiếp xuống 1 đơn vị:
• Cú pháp: Dec @Ri
• Lệnh này chiếm dung lượng bộ nhớ ROM là 1 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: Giảm giá trị dữ liệu ở ô nhớ có địa chỉ bằng giá trị dữ liệu trên Ri xuống1 đơn vị, không ảnh hưởng đến các cờ nhớ trên PSW
• Ví dụ:
Mov 60h,#05h
Mov R1,#60h
Dec @R1
Kết quả : R1 = #04h
60h = #05h
2.3.22.Lệnh nhân thanh ghi A với thanh ghi B:
• Cú pháp: Mul AB
• Lệnh này chiếm dung lượng bộ nhớ ROM là 1 Byte
• Thời gian thực hiện: 4 chu kì máy
• Công dụng: Nhân hai dữ liệu là số nguyên không dấu ở thanh ghi A với thanh ghi B, kết quả là một dữ liệu 16 bit. Byte thấp của kết quả lưu ở thanh ghi A và byte cao của kết quả lưu ở thanh ghi B. Nếu tích số lớn hơn 255(0FFH), cờ tràn OV ở thanh trạng thái PSW được thiết lập lên 1, ngược lại nếu tích số nhỏ hơn 255(0FFH),cờ tràn OV được thiết lấp về 0. Cờ nhớ C luôn ở giá trị 0.
• Ví dụ: Mov A,#0B9h
Mov B,#F7h
Mul AB
Kết quả : A = #7Fh
B = #0B2h
2.3.23.Lệnh chia thanh ghi A với thanh ghi B:
• Cú pháp: Div AB
• Lệnh này chiếm dung lượng bộ nhớ ROM là 1 Byte
• Thời gian thực hiện: 4 chu kì máy
• Công dụng: Chia hai dữ liệu là số nguyên không dấu ở thanh ghi A với thanh ghi B, dữ liệu ở thanh ghi A là số chia còn ở thanh ghi B là số bị chia, kết quả là một dữ liệu 8 bit được lưu ở thanh ghi A.số dư lưu trữ trong thanh ghi B Cờ nhớ C luôn ở giá trị 0.
Cờ tràn OV được thiết lập giá trị 1 khi thanh ghi B mang giá trị là 00H-phép chia không thể thực hiện.
• Ví dụ: Mov A,#50h
Mov B,#10h
DIV AB
Kết quả : A = #5h
B = #0h
2.3.24.Lệnh hiệu chỉnh thập phân nội dung của thanh ghi A đối với phép cộng:
• Cú pháp: DA A
• Lệnh này chiếm dung lượng bộ nhớ ROM là 1 Byte
• Thời gian thực hiện: 4 chu kì máy
• Công dụng: hiệu chỉnh dữ liệu là giá trị lưu giữ ở thanh ghi A từ số Hex (số nhị phân) thành số BCD (số thập phân viết dưới dạng nhị phân). Lí do có lệnh hiệu chỉnh này vì khi cộng hai giá trị là số BCD bằng các lệnh cộng, vi điều khiển chỉ hiểu hai số cộng là số nhị phân bình thường, kết quả sau lệnh cộng là một số nhị phân bình thường, không phải là một số BCD, vì vậy kết quả cần được hiệu chỉnh để dữ liệu cuối là một số BCD. Khi thực hiện lệnh, cờ nhớ C được xác lập lên 1 nếu phép cộng có kết quả vượt qua 99(số BCD). Kết quả cuối cùng, số BCD có hàng đơn vị nằm ở 4 bit thấp trên thanh ghi A, hàng chục ở 4 bit cao của thanh ghi A, hàng trăm là 1 nếu cờ C mang giá trị 1, là 0 nếu cờ C mang giá trị 0.
• Ví dụ 1: Mov A,#10h
DA A
Kết quả : A = #10h

Ví dụ 2: Mov A,#0Eh
DA A
Kết quả : A = #14h
2.4.NHÓM LỆNH LOGIC Trang 4
1. Lệnh And dữ liệu ở thanh ghi A với dữ liệu ở thanh ghi Rn:
• Cú pháp: ANL A,Rn
• Lệnh này chiếm dung lượng bộ nhớ ROM là: 1 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: thực hiện phép logic AND dữ liệu ở thanh ghi A với dữ liệu ở thanh ghi Rn, kết quả được lưu trữ ở thanh ghi A
• Ví dụ:
mov A,#0Fh
mov R1,#0F0h
ANL A,R1
Kết quả : A = #0H
2. Lệnh And dữ liệu trên thanh ghi A với dữ liệu của ô nhớ có địa chỉ direct:
• Cú pháp: ANL A,direct
• Lệnh này chiếm dung lượng bộ nhớ ROM là 2 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: thực hiện phép logic AND dữ liệu ở thanh ghi A với dữ liệu ở ô nhớ có địa chỉ direct, kết quả được lưu trữ ở thanh ghi A
• Ví dụ:
mov A,#0FFh
mov 10h,#010h
ANL A,10h
Kết quả : A = #010h
3. Lệnh And dữ liệu trên thanh ghi A với dữ liệu của ô nhớ gián tiếp:
• Cú pháp: ANL A,@Ri
• Lệnh này chiếm dung lượng bộ nhớ ROM là 1 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: thực hiện phép logic AND dữ liệu ở thanh ghi A với dữ liệu của ô nhớ có địa chỉ bằng giá trị của thanh ghi Ri, kết quả được lưu trữ ở thanh ghi A
• Ví dụ:
mov A,#0Fh
mov 70h,#0E1h
mov R1,#070h
ANL A,@R1
Kết quả : A = #01h
4. Lệnh And dữ liệu trên thanh ghi A với dữ liệu xác định:
• Cú pháp: ANL A,#data
• Lệnh này chiếm dung lượng bộ nhớ ROM là 2 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: thực hiện phép logic AND dữ liệu ở thanh ghi A với dữ liệu cho trước, kết quả được lưu trữ ở thanh ghi A
• Ví dụ:
mov A,#0Eh
ANL A,#11h
Kết quả : A = #00
5. Lệnh And dữ liệu của ô nhớ có địa chỉ direct với dữ liệu trên thanh ghi A:
• Cú pháp: ANL direct,A
• Lệnh này chiếm dung lượng bộ nhớ ROM là 2 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: thực hiện phép logic AND dữ liệu ở thanh ghi A với dữ liệu của ô nhớ có địa chỉ direct, kết quả được lưu trữ ở ô nhớ có địa chỉ direct.
• Ví dụ:
mov A,#08h
mov R1,#0F7h
ANL R1,A
Kết quả : R1 = #0
6. Lệnh And dữ liệu trên ô nhớ có địa chỉ direct với dữ liệu xác định:
• Cú pháp: ANL direct,#data
• Lệnh này chiếm dung lượng bộ nhớ ROM là 2 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: thực hiện phép logic AND dữ liệu của ô nhớ có địa chỉ direct với dữ liệu cho trước, kết quả được lưu trữ ở ô nhớ có địa chỉ direct.
• Ví dụ:
mov R1,#0F7h
ANL R1,#1Fh
Kết quả : R1 = #017h
7. Lệnh OR dữ liệu ở thanh ghi A với dữ liệu ở thanh ghi Rn:
• Cú pháp: ORL A,Rn
• Lệnh này chiếm dung lượng bộ nhớ ROM là: 1 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: thực hiện phép logic OR dữ liệu ở thanh ghi A với dữ liệu ở thanh ghi Rn, kết quả được lưu trữ ở thanh ghi A
• Ví dụ: mov A,#0Fh
mov R1,#0F0h
ORL A,R1
Kết quả : A = #0FFh
8. Lệnh OR dữ liệu trên thanh ghi A với dữ liệu của ô nhớ có địa chỉ direct:
• Cú pháp: ORL A,direct
• Lệnh này chiếm dung lượng bộ nhớ ROM là 2 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: thực hiện phép logic OR dữ liệu ở thanh ghi A với dữ liệu của ô nhớ có địa chỉ direct, kết quả được lưu trữ ở thanh ghi A
• Ví dụ: mov A,#0Eh
mov 50h,#0F0h
ORL A,50h
Kết quả : A = #0FEh
9. Lệnh OR dữ liệu trên thanh ghi A với dữ liệu của ô nhớ gián tiếp:
• Cú pháp: ORL A,@Ri
• Lệnh này chiếm dung lượng bộ nhớ ROM là 1 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: thực hiện phép logic OR dữ liệu ở thanh ghi A với dữ liệu của ô nhớ có địa chỉ bằng giá trị của thanh ghi Ri, kết quả được lưu trữ ở thanh ghi A
• Ví dụ:
mov A,#18h
mov 30h,#0F0h
mov R1,#30h
ORL A,@R1
Kết quả : A = #0F8h
10. Lệnh OR dữ liệu trên thanh ghi A với dữ liệu xác định:
• Cú pháp: ORL A,#data
• Lệnh này chiếm dung lượng bộ nhớ ROM là 2 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: thực hiện phép logic OR dữ liệu ở thanh ghi A với dữ liệu cho trước, kết quả được lưu trữ ở thanh ghi A
• Ví dụ:
mov A,#00h
ORL A,#10h
Kết quả : A = #010h
còn nữa >>>>>>>>>->>>>>>>>>

lập trình 89S cho các new programer........(tt)

bổ sung thêm tập lệnh đầy đủ của 8051
em mới tìm ra nên post lun để các pác tham khảo
Tập lệnh trong Vi điều khiển được chia làm 5 nhóm:
• Nhóm lệnh di chuyển dữ liệu
• Nhóm lệnh số học
• Nhóm lệnh logic
• Nhóm lệnh rẽ nhánh
• Nhóm lệnh xử lí bit
Trước khi xem phần dưới, các bạn cần xem lại bài trước nắm rõ phần cứng, đặc biệt là vùng nhớ Ram của vi điều khiển. Chú ý các thuật ngữ sau:
• Các byte RAM 8 bit của vi điều khiển được gọi là "ô nhớ", nếu các ô nhớ có chức năng đặc biệt thường được gọi là "thanh ghi", nếu là bit thì được gọi là "bit nhớ".
• dữ liệu của một ô nhớ là trạng thái (0 hoặc 1) cần thiết lập cho các bit của ô nhớ (8 bit)
2.2. NHÓM LỆNH DI CHUYỂN
2.2.1. Lệnh chuyển dữ liệu từ một thanh ghi Rn vào thanh ghi A:
• Cú pháp: Mov A,Rn
• Lệnh này chiếm dung lượng bộ nhớ ROM là 2 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: Chuyển dữ liệu của thanh ghi Rn vào thanh ghi A, dữ liệu trên thanh ghi Rn không đổi
• Ví dụ: Giả sử thanh ghi R5 mang dữ liệu với giá trị là 0A5H (10100101B)
Lệnh Mov A,R5
Sau khi lệnh được thực hiện A mang dữ liệu giá trị A5H, Rn không đổi
giá trị thanh ghi A trước khi thực hiện lệnh không cần quan tâm
2.2.2. Lệnh chuyển dữ liệu từ ô nhớ có địa chỉ direct vào thanh ghi A:
• Cú pháp: Mov A,direct
• Lệnh này chiếm dung lượng bộ nhớ ROM là 2 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: chuyển dữ liệu của ô nhớ có địa chỉ bằng direct vào thanh ghi A.
• Ví dụ: Giả sử thanh ghi có địa chỉ 33H mang dữ liệu với giá trị là 09H (00001001B)
Lệnh Mov A,33H
Sau khi lệnh được thực hiện A mang dữ liệu giá trị 09H
2.2.3. Lệnh chuyển dữ liệu từ ô nhớ có địa chỉ gián tiếp vào thanh ghi A:
• Cú pháp: Mov A,@Ri
• Lệnh này chiếm dung lượng bộ nhớ ROM là 1 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: chuyển dữ liệu của ô nhớ 'có địa chỉ bằng giá trị của thanh ghi Ri' vào thanh ghi A.
• Ví dụ: Giả sử trước khi thực hiện lệnh ô nhớ có địa chỉ 33H mang dữ liệu với giá trị là 09H (00001001B) và thanh ghi R1 được thiết lập giá trị là 33H
Lệnh Mov A,@R1
Khi lệnh được thực hiện A nhận dữ liệu từ ô nhớ có vị trí bằng giá trị được thiết lập trong thanh ghi R1, tức là A nhận dữ liệu từ ô nhớ có địa chỉ là 33H, chú ý: trước đó ô nhớ 33H mang dữ liệu là 09H.
Sau khi lệnh được thực hiện A mang giá trị là 09H (00001001B)
2.2.4. Lệnh đưa dữ liệu vào thanh ghi A
• Cú pháp: Mov A,#data
• Lệnh này chiếm dung lượng bộ nhớ ROM là 2 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: thiết lập dữ liệu cho thanh ghi A
• Ví dụ: Muốn thanh ghi A mang dữ liệu có giá trị là 56H ta thực hiện lệnh
Mov A,#56H
Sau khi lệnh được thực hiện A mang giá trị là 56H
2.2.5. Lệnh chuyển dữ liệu từ A vào thanh ghi Rn
• Cú pháp: Mov Rn,A
• Lệnh này chiếm dung lượng bộ nhớ ROM là 1 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: chuyển dữ liệu từ thanh ghi A vào thanh ghi Rn (n=0-7)
• Ví dụ:
Mov A,#56H
Mov R1,A
Sau khi các lệnh được thực hiện R1 mang giá trị là 56H
2.2.6. Lệnh chuyển dữ liệu từ một ô nhớ có địa chỉ direct vào thanh ghi Rn
• Cú pháp: Mov Rn,direct
• Lệnh này chiếm dung lượng bộ nhớ ROM là 2 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: chuyển dữ liệu của ô nhớ có địa chỉ direct vào thanh ghi Rn (n=0-7)
• Ví dụ: giả sử ô nhớ 55H mang dữ liệu có giá trị là A3H
Mov R4,55H
Sau khi các lệnh được thực hiện R4 mang giá trị là A3H
2.2.7. Thiết đặt dữ liệu cho thanh ghi Rn
• Cú pháp: Mov Rn,#data
• Lệnh này chiếm dung lượng bộ nhớ ROM là 2 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: thiết đặt dữ liệu cho thanh ghi Rn
• Ví dụ: Muốn thanh ghi Rn mang dữ liệu có giá trị là 37H ta thực hiện lệnh
Mov A,#37H
Sau khi lệnh được thực hiện A mang giá trị là 37H
2.2.8. Lệnh chuyển dữ liệu từ thanh ghi A vào một ô nhớ có địa chỉ direct
• Cú pháp: Mov direct,A
• Lệnh này chiếm dung lượng bộ nhớ ROM là 2 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: chuyển dữ liệu từ thanh ghi A vào một ô nhớ có địa chỉ direct.
• Ví dụ:
Mov A,#77H
Mov 69H,A
Sau khi các lệnh được thực hiện ô nhớ 69H mang giá trị là 77H (giá trị của các bit được thiết lập trong ô nhớ 69H là 01110111B )
2.2.9. Lệnh chuyển dữ liệu từ thanh ghi Rn vào một ô nhớ có địa chỉ direct
• Cú pháp: Mov direct,Rn
• Lệnh này chiếm dung lượng bộ nhớ ROM là 2 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: chuyển dữ liệu từ thanh ghi A vào một ô nhớ có địa chỉ direct
• Ví dụ:
Mov Rn,#78H
Mov 7AH,Rn
Sau khi các lệnh được thực hiện ô nhớ 7AH mang giá trị là 78H
2.2.10. Lệnh chuyển dữ liệu từ một ô nhớ có địa chỉ direct này vào một ô nhớ có địa chỉ direct khác
• Cú pháp: Mov direct,direct
• Lệnh này chiếm dung lượng bộ nhớ ROM là 3 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: chuyển dữ liệu từ ô nhớ có địa chỉ direct này vào một ô nhớ có địa chỉ direct khác
• Ví dụ:giả sử thanh ghi 20H mang dữ liệu có giá trị là FFH
Mov 22H,20H
Sau khi lệnh được thực hiện thanh ghi 22H mang giá trị là FFH
2.2.11. Lệnh đưa dữ liệu vào ô nhớ có địa chỉ direct
• Cú pháp: Mov direct,#data
• Lệnh này chiếm dung lượng bộ nhớ ROM là 3 Byte
• Thời gian thực hiện: 2 chu kì máy
• Công dụng: thiết lập dữ liệu cho ô nhớ có địa chỉ direct
• Ví dụ:
Mov 52H,#43H
Sau khi các lệnh được thực hiện ô nhớ 52H mang giá trị là 43H
2.2.12. Lệnh chuyển dữ liệu từ một ô nhớ có địa chỉ gián tiếp vào ô nhớ có địa chỉ direct
• Cú pháp: Mov direct,@Ri
• Lệnh này chiếm dung lượng bộ nhớ ROM là 2 Byte
• Thời gian thực hiện: 2 chu kì máy
• Công dụng: Chuyển dữ liệu của ô nhớ có địa chỉ bằng giá trị của thanh ghi Ri vào ô nhớ có địa chỉ direct
• Ví dụ:
Mov 30H,#46H
Mov R0,#30H
Mov 23H, @R0
Sau khi các lệnh được thực hiện ô nhớ 23H mang giá trị là 46H
2.2.13. Lệnh chuyển dữ liệu từ thanh ghi A vào ô nhớ có địa chỉ gián tiếp
• Cú pháp: Mov @Ri,A
• Lệnh này chiếm dung lượng bộ nhớ ROM là 1 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: Chuyển dữ liệu của thanh ghi A vào ô nhớ có địa chỉ bằng giá trị của thanh ghi Ri
• Ví dụ:
Mov A,#33H
Mov R1,#22H
Mov @R0,A
Sau khi lệnh được thực hiện ô nhớ 22H mang giá trị là 33H
2.2.14. Lệnh chuyển dữ liệu từ một ô nhớ có địa chỉ direct vào ô nhớ có địa chỉ gián tiếp
• Cú pháp: Mov @Ri,direct
• Lệnh này chiếm dung lượng bộ nhớ ROM là 2 Byte
• Thời gian thực hiện: 2 chu kì máy
• Công dụng: Chuyển dữ liệu của ô nhớ có địa chỉ direct vào ô nhớ có địa chỉ bằng giá trị của thanh ghi Ri
• Ví dụ:
Mov 4BH,#2AH
Mov R0,#2AH
Mov @R0,4BH
Sau khi lệnh được thực hiện ô nhớ 2AH mang giá trị là 2AH
2.2.15. Lệnh đưa dữ liệu vào ô nhớ có địa chỉ gián tiếp
• Cú pháp: Mov @Ri,#data
• Lệnh này chiếm dung lượng bộ nhớ ROM là 2 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: Thiết đặt dữ liệu cho ô nhớ có địa chỉ bằng giá trị của thanh ghi Ri
• Ví dụ:
Mov R0,#3BH
Mov @R0,#27H
Sau khi lệnh được thực hiện ô nhớ 3BH mang giá trị là 27H
2.2.16. Lệnh đưa dữ liệu vào con trỏ dữ liệu DPTR
• Cú pháp: Mov DPTR,#data16
• Lệnh này chiếm dung lượng bộ nhớ ROM là 3 Byte
• Thời gian thực hiện: 2 chu kì máy
• Công dụng: Thiết đặt dữ liệu cho con trỏ dữ liệu với dữ liệu 16 bit, thực chất dữ liệu được lưu ở hai thanh ghi DPL (byte thấp-địa chỉ byte 82H) và DPH (byte cao-địa chỉ byte 83H).
• Ví dụ: Mov DPTR,#3A5FH
Sau khi lệnh được thực hiện DPTR mang giá trị là 3A5FH
DPL mang giá trị 5FH và DPL mang giá trị 3AH
2.2.17. Lệnh trao đổi dữ liệu giữa ô nhớ có địa chỉ direct với thanh ghi A
• Cú pháp: XCH A,direct
• Lệnh này chiếm dung lượng bộ nhớ ROM là 2 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: Trao đổi dữ liệu của thanh ghi A với ô nhớ có địa chỉ direct, tức là sau khi thực hiện lệnh ô nhớ có địa chỉ direct mang dữ liệu của thanh ghi A trước đó và thanh ghi A mang dữ liệu của ô nhớ có địa chỉ direct.
• Ví dụ: Mov A,#0FAH
Mov 50H,#60H
XCH A,50H
Kết quả :A mang giá trị là 60H
50H mang giá trị là 0FAH
2.2.18. Lệnh trao đổi dữ liệu giữa thanh ghi Rn và thanh ghi A
• Cú pháp: XCH A,Rn
• Lệnh này chiếm dung lượng bộ nhớ ROM là 1 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: Trao đổi dữ liệu của thanh ghi A với thanh ghi Rn.
2.2.19. Lệnh trao đổi dữ liệu giữa thanh ghi có địa chỉ gián tiếp và thanh ghi A
• Cú pháp: XCH A,@Ri
• Lệnh này chiếm dung lượng bộ nhớ ROM là 1 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: Trao đổi dữ liệu của thanh ghi A với ô nhớ có địa chỉ bằng giá trị lưu giữ trong thanh ghi Ri
2.2.20. Lệnh trao đổi dữ liệu 4 bit giữa thanh ghi có địa chỉ gián tiếp và thanh ghi A
• Cú pháp: XCHD A,@Ri
• Lệnh này chiếm dung lượng bộ nhớ ROM là 1 Byte
• Thời gian thực hiện: 1 chu kì máy
• Công dụng: Trao đổi dữ liệu của 4 bit thấp ở thanh ghi A với dữ liệu của 4 bit thấp ở ô nhớ có địa chỉ bằng giá trị lưu giữ trong thanh ghi Ri
2.2.21. Lệnh truy xuất dữ liệu từ ROM nội
• Cú pháp: MovC A,@A+DPTR
• Lệnh này chiếm dung lượng bộ nhớ ROM là 1 Byte
• Thời gian thực hiện: 2 chu kì máy
• Công dụng: Chuyển dữ liệu từ bộ nhớ ROM có địa chỉ bằng giá trị của A cộng với DPTR vào thanh ghi A
Các lệnh còn lại trong nhóm lệnh di chuyển
MovC A,@A+PC
MovC A,@i
MovX A,@DPTR
MovX A,@Ri
MovX @DPTR,A
PUSH direct
POP direct
còn nữa em sẽ post sau cho bài đỡ dài

lập trình 89S cho các new programer........(tt)

Viết chương trình cho VDK nhận tín hiệu từ công tắt , cảm biến quang ,.......
bài viết đơn giản nhất và dễ hiểu nhất .Các pác xem kĩ và sáng tạo tí sẽ cho ra những project hay như robot do đường,đóng mở cửa tự động,tắt mở đèn tự động,báo trộm......
/////////////////////////////////////// part 4 \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;code nhận tín hịu công tắt xuất ra led
;đề tài : nhận tín hiệu công tắt ở Port 0(P0) xuất tìn hiệu tương ứng ra LED nối vào Port 1(P1)

ORG 0000H ;Cái này đã giới thiệu ở pài trước rồi khỏi nhắc lại nhá mình sẽ ghi chú những cái mới
SJMP MAIN ;Và ko lặp lại phần trước
ORG 0030H
;KHỞI TẠO
MOV P1,#0FFH ;TẮT HẾT LED Ở PORT 1
MOV P0,#0FFH ;ĐUA CÔNG TẮT LÊN MỨC 1 ĐỀ NHẬN TÍN HỊU MỨC THẤP
MAIN:
LCALL RUN
SJMP MAIN

RUN:
LCALL KEY ;gọi chương trình con "Key" nhận nút bấm
RET

KEY:
JNB P0.0,KEY1 ; nhận tín hịu công tắt mức thấp thì nhảy wa "KEY1"
JNB P0.1,KEY2 ; nhận tín hịu công tắt mức thấp thì nhảy wa "KEY2"
JNB P0.2,KEY3 ; nhận tín hịu công tắt mức thấp thì nhảy wa "KEY3"
JNB P0.3,KEY4 ; cái này em ko giải thich nữa nhé
JNB P0.4,KEY5 ; cái này em ko giải thich nữa nhé
JNB P0.5,KEY6 ; cái này em ko giải thich nữa nhé
RET ; KẾT THÚC VÀ QUAY LẠI ĐỌC TÍN HỊU TIP

KEY1:
CLR P1.0 ;ĐƯA PORT NÀY XUỐNG THẤP (0)
RET
KEY2:
SETB P1.0 ;ĐƯA PORT NÀY LÊN CAO (1)
RET
KEY3:
CLR P1.1 ;ĐƯA PORT NÀY XUỐNG THẤP (0)
RET
KEY4:
SETB P1.1 ;ĐƯA PORT NÀY LÊN CAO (1)
RET
KEY5:;TAT HET LED
SETB P1.0
SETB P1.1
RET
KEY6:;BAT HET LED
CLR P1.0
CLR P1.1
RET
;______________________________________________________________________________
END

lập trình 89S cho các new programer........(tt)

sau đây tui sẽ trình bày một số chương trình đơn giản

Unit1

lập trình led nháy
;LƯU Ý NHỮNG GHI CHÚ SẼ DC ĐỂ SAU DẤU ";"
INCLUDE 89C52.MC ;"89C52.MC" LÀ CHIP SỬ DỤNG nếu sử dụng soft batronix pro để dịch
ORG 0000H ;SAU KHI RESET THÌ CHƯƠNG TRỈNH SẼ BẮT ĐẦU TÙ ĐÂY CHO DỤ ĐANG CHẠY Ở ĐÂU
SJMP MAIN ;LỆNH NHẢY NGẮN NHẢY ĐẾN CT CHÍNH NHÃN "MAIN"
ORG 0030H ;TRÁNH VÙNG CHỨA ĐỊA CHỈ CỦA CÁC NGẮT

MAIN: ;CT CHÍNH THIX DẶT TÊN J THÌ ĐẶT NHƯNG PHẢI Ở SAU DẤU ":" và bắt đầu bằng chữ rồi mới tới số và ko có ký tự đặc biệt
LCALL NHAY ;LỆNH NHẢY DÀI ĐẾN NHÃN CẦN THỰC HIỆN
SJMP MAIN ;THỰC HIỆN NHÌU LẦN VÀ KO CÓ GIỚI HẠN

NHAY: ;NHÃN CHUONG TRÌNH
MOV P0,#11111110B ;GIÁ TRỊ THẬP PHÂN CÓ THỂ THAY BẰNG MÃ HEX(BẮT ĐẦU BẰNG 0 NẾU SAU ĐÓ LÀ 1 CHỮ KẾT THÚC = CHỮ H EX: "0FFH"
LCALL DELAY ; GOI HAM TRỄ ĐỂ CHUYỂN TRẠNG THÁI
MOV P0,#11111101B
LCALL DELAY
MOV P0,#11111011B
LCALL DELAY
MOV P0,#11110111B
LCALL DELAY
MOV P0,#11101111B
LCALL DELAY
MOV P0,#11011111B
LCALL DELAY
MOV P0,#10111111B
LCALL DELAY
MOV P0,#01111111B
LCALL DELAY
RET ;LỆNH KẾT THÚC CT CON

DELAY: ; HÀM TRỄ 1 GIÂY (1S)
mov r1,#10 ;THAY ĐỔI GIÁ TRỊ "#10" NÀY ĐỄ TĂNG OR GIẢM TỐC ĐỘ(ĐỘ TRỄ)
noop1:
mov r2,#50 ;THAY ĐỔI GIÁ TRỊ "#50" NÀY ĐỄ TĂNG OR GIẢM TỐC ĐỘ(ĐỘ TRỄ)
noop2:
mov r3,#20 ;THAY ĐỔI GIÁ TRỊ "#20" NÀY ĐỄ TĂNG OR GIẢM TỐC ĐỘ(ĐỘ TRỄ)
noop3:
nop
nop
djnz r3,noop3
djnz r2,noop2
djnz r1,noop1

ret
;______________________________________________________________________________________
END ;LỆNH BÁO KẾT THÚC CHƯƠNG TRÌNH
Trên là chương trình led nháy dần ở PORT 0 (P0)
Good Luck!!!!!!\
By Phatdt

lập trình 89S cho các new programer........(tt)

sau đây mình viết típ cho phần trước
//////////////////////////////////////part 2\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
tập lệnh số học

1) ADD A, R0

2) ADD A, R1

3) ADD A, R2

4) ADD A, R3

5) ADD A, R4

6) ADD A, R5

7) ADD A, R6

8) ADD A, R7

9) ADD A, direct

10) ADD A, @R0

11) ADD A, @R1

12) ADD A, #data

13) ADDC A, R0

14) ADDC A, R1

14) ADDC A, R2

15) ADDC A, R3

16) ADDC A, R4

17) ADDC A, R5

18) ADDC A,R6

19) ADDC A, R7

20) ADDC A, direct

21) ADDC A, @R0

22) ADDC A, @R1

23) ADDC A, #data

24) SUBB A, R0

25) SUBB A, R1

26) SUBB A, R2

27) SUBB A, R3

28) SUBB A, R4

29) SUBB A, R5

30) SUBB A, R6

31) SUBB A, R7

32) SUBB A, direct

33) SUBB A, @R0

34) SUBB A, @R1

35) SUBB A, #data

36) INC A

37) INC R0

38) INC R1

39) INC R2

40) INC R3

41) INC R4

42) INC R5

43) INC R6

44) INC R7

45) INC direct

46) INC @R0

47) INC @R1

48) INC DPTR

49) DEC A

50) DEC R0

51) DEC R1

52) DEC R2

53) DEC R3

54) DEC R4

55) DEC R5

56) DEC R6

57) DEC R7

58) DEC direct

60) DEC @R0

61) DEC @R1

62) MUL AB

63) DIV AB

64) DA A

Nhóm lệnh logic:

65) ANL A, R0

66) ANL A, R1

67) ANL A, R2

68) ANL A, R3

69) ANL A, R4

70) ANL A, R5

71) ANL A, R6

72) ANL A, R7

73) ANL A, direct

74) ANL A, @R0

75) ANL A, @R1

76) ANL A, #data

77) ANL direct, A

78) ANL direct, #data

79) ORL A, R0

80) ORL A, R1

81) ORL A, R2

82) ORL A, R3

83) ORL A, R4

84) ORL A, R5

85) ORL A, R6

86) ORL A, R7

87) ORL A, direct

88) ORL A, @R0

89) ORL A, @R1

90) ORL direct, A

91) ORL direct, #data

92) XRL A, R0

93) XRL A, R1

94) XRL A, R2

95) XRL A, R3

96) XRL A, R4

97) XRL A, R5

98) XRL A, R6

99) XRL A, R7

100) XRL A, direct

101) XRL A, @R0

102) XRL A, @R1

103) XRL A, #data

104) XRL direct, A

105) XRL direct, #data

106) CLR A

107) CPL A

108) RL A

109) RLC A

110) RR A

111) RRC A

112) SWAP A

Nhóm lệnh sao chép:

113) MOV A, R0

114) MOV A, R1

115) MOV A, R2

116) MOV A, R3

117) MOV A, R4

118) MOV A, R5

119) MOV A, R6

120) MOV A, R7

121) MOV A, direct

122) MOV A, @R0

123) MOV A, @R1

124) MOV A, #data

125) MOV R0, A

126) MOV R1, A

127) MOV R2, A

128) MOV R3, A

129) MOV R4, A

130) MOV R5, A

131) MOV R6, A

132) MOV R7, A

133) MOV R0, direct

134) MOV R1, direct

135) MOV R2, direct

136) MOV R3, direct

137) MOV R4, direct

138) MOV R5, direct

139) MOV R6, direct

140) MOV R7, direct

141) MOV R0, #data

142) MOV R1, #data

143) MOV R2, #data

144) MOV R3, #data

145) MOV R4, #data

146) MOV R5, #data

147) MOV R5, #data

148) MOV R6, #data

149) MOV R7, #data

150) MOV direct, A

151) MOV direct, R0

152) MOV direct, R1

153) MOV direct, R2

154) MOV direct, R3

155) MOV direct, R4

156) MOV direct, R5

157) MOV direct, R6

158) MOV direct, R7

159) MOV direct, direct

160) MOV direct, @R0

161) MOV direct, @R1

162) MOV direct, #data

163) MOV @R0, direct

164) MOV @R1, direct

165) MOV @R0, A

166) MOV @R1, A

167) MOV @R0, #data

168) MOV @R1, #data

169) MOVC A, @A+DPTR

170) MOVC A, @A+PC

171) MOVX A, @R0

172) MOVX A, @R1

173) MOVX A, @DPTR

174) MOVX @R0, A

175) MOVX @R1, A

176) MOVX @DPTR, A

178) MOVX DPTR, #data16

179) PUSH direct

180) POP direct

181) XCH A, R0

182) XCH A, R1

183) XCH A, R2

184) XCH A, R3

185) XCH A, R4

186) XCH A, R5

187) XCH A, R6

188) XCH A, R7

189) XCH A, direct

190) XCH A, @R0

191) XCH A, @R1

192) XCHD A, @R0

193) XCHD A, @R1

Nhóm lệnh sử lý:

194) CLR C

195) CLR bit

196) CPL C

197) CPL bit

198) SETB C

199) SETB bit

200) ANL C, bit

201) ANL C, /bit

202) ORL C, bit

203) ORL C, /bit

204) MOV C, bit

205) MOV bit, C

206) JB bit, rel

207) JNB bit, rel

208) JBC bit, rel

209) JC rel

210) JNC rel

Nhóm lệnh rẽ nhánh:

211) ACALL addr11

212) LCALL addr16

213) RET

214) RETI

215) AJMP addr11

216) LJMP addr16

217) SJMP rel

218) JMP @A+DPTR

219) JZ rel

220) JNZ rel

221) CJNE A, direct, rel

222) CJNE A, #data, rel

223) CJNE R0, #data, rel

224) CJNE R1, #data, rel

225) CJNE R2, #data, rel

226) CJNE R3, #data, rel

227) CJNE R4, #data, rel

228) CJNE R5, #data, rel

229) CJNE R6, #data, rel

230) CJNE R7, #data, rel

231) CJNE @R0, #data, rel

232) CJNE @R1, #data, rel

233) DJNZ R0,rel

234) DJNZ R1, rel

235) DJNZ R2, rel

236) DJNZ R3, rel

237) DJNZ R4, rel

238) DJNZ R5, REL

239) DJNZ R6, rel

240) DJNZ R7, rel

241) DJNZ direct, rel

242) NOP

weo đây là tập lệnh cho dòng 8051 thôi nhá
có thắc mắc thì post comment tui sẽ giải đáp
`````````````````````````````````````` By Phadt`````````````````````````````````

lập trình 89S cho các new programer........

Chào các pác em học cũng ko lâu lắm nhưng có chút kinh nghiệm xin mạng phép chỉ giáo các pác
nếu có j liên quan tới bài viết này mà các pác ko hài lòng, thì post comment hay gửi mail cho em để em sửa chữa cho hoàn thiện
trước đây em phải tìm trên google nhưng lớp VDK online ---> ko dc cái j ngoài những kết quả ko không như ý ,những lớp học đòi hỏi phải tổ chức hay đến nhưng lớp học .Thú thật Vũng Tàu ko có lớp dạy ngoài nên cũng po tay
nay em xin viết 1 bài hướng dẫn về lập trình VDK (em chưa wa lớp học nào nên chỉ học trên mạng thôi)những kiến thức của em ko dc chắc lắm những cũng tạm sài dc
sau đây là ảnh và sơ đồ chân của chip AT89S52 40 chân

///////////////////////////////////////////////Part 1\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
em thì học thực hành là chủ yếu sau dây là 255 câu lệnh thường dùng

ADD A,Rn ( 8 LỆNH THAY ĐỔI TỪ R0 ĐẾN R7 )

ADD A,DIRECT

ADD A,@Ri (2 LỆNH THAY ĐỔI TỪ R0 ĐẾN R1 )

ADD A,#DATA

ADDC A,Rn (8 LỆNH)

ADDC A,DIRECT

ADDC A,@Ri ( 2 LỆNH)

ADDC ,A,#DATA

SUBB A,Rn (8 lệnh )

SUBB A,DIRECT

SUBB A,@Ri ( 2 LỆNH)

SUBB A, #DATTA

INC A , Rn (8 lệnh)

INC A ,DIRECT

INC A ,@Ri (2 LỆNH )

INC A ,#DATTA

INC DPTR

DEC A

DEC Rn ( 8 lệnh)

DEC @RI (2 LỆNH)

DEC DIRECT

MUL AB

MUL BA

DIV AB

DIV BA

DA A

DA B

ANL A,Rn (8 lệnh)

ANL A, DIRECT

ANL A,@Ri ( 2 lệnh)

ANL A,#DATTA

ANL DIRECT, A

ANL DIRECT ,#DATTA

ORL A,Rn (8 lệnh)

ORL A, DIRECT

ORL A,@Ri ( 2 lệnh)

ORL A,#DATTA

ORL DIRECT, A

ORL DIRECT ,#DATTA

XRL A,Rn (8 lệnh)

XRL A, DIRECT

XRL A,@Ri ( 2 lệnh)

XRL A,#DATTA

XRL DIRECT, A

XRL DIRECT ,#DATTA

CPL A

CLR A

RL A

RLC A

RR A

RRC A

SWAP A

MOV A,Rn ( 8 lệnh )

MOV A,DIRECT

MOV A,@Ri ( 2 LỆNH)

MOV A,#DATTA

MOV Rn ,A (8 LỆNH)

MOV Rn ,DIRECT (8 LỆNH)

MOV Rn ,#DATTA (8 LỆNH )

MOV DIRECT ,A

MOV DIRECT ,DIRECT

MOV DIRECT,Rn (8 lệnh)

MOV DIRECT , @Ri ( 2 lệnh)

MOV DIRECT ,#DATA

MOV @RI ,A (2 LỆNH)

MOV @Ri ,DIRECT ( 2 LỆNH)

MOV @Ri, #DATTA (2 LỆNH)

MOVC A, @A+DPTR

MOVC A, @A+PC

MOVX A ,@Ri (2 lệnh)

MOVX A,@DPTR

MOVX @DPTR ,A

MOVX @Ri ,A ( 2 LỆNH )

MOV DTPR ,#DATTA16

PUSH DIRECT

POP DIRECT

XCH A, Rn (8 lệnh)

XCH A,DIRECT

XCH A, @Ri ( 2 LỆNH)

XCHD A,@Ri (2 lệnh)

CLR B

CLR BIT

CPL C

CPL BIT

SETB C

SETB BIT

ANL C,BIT

ANL BIT ,C

ORL C, BIT

ORL BIT, C

MOV C,BIT

MOV BIT,C

JB BIT, REL

JN BIT,REL

JBC BIT,REL

JC REL

JNC REL

ACALL ADDR11

ACALL ADDR16

RET

RETI

AJMP ADDR11

LJMP ADDR16

SJMP REL

JMP @A,DPTR

JZ REL

JNZ REL

CJNE A,DIRECT,REL

CJNE A,#DATA,REL

CJNE Rn,#DATA,REL (8 LỆNH)

CJNE @Ri,#DATTA,REL (2 LỆNH)

DINZ Rn,REL (8 LỆNH)

DINZ DIRECT,REL

nhìu we phải cắt làm nhìu part các pác coppy về làm tư lịu nhá


Máy Tình Bỏ Túi dùng 89s52 + ram + lcd..............

;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< PK CODE >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;-------------------- Project máy tính Bỏ Túi dùng 89S52 và LCD ----------------------
;PROJECT ĐÃ DC (TEST)

;CODE DC CHIA LÀM 24 PHẦN TÔI RÁP VÀO RỒI CHỈ CẦN DỊCH LÀ CHẠY DC
;----------------------------------------------------------------- lien quan ban phim
maQuet equ 11111110b ;xuat ra cot
cotPhim equ p2 ;tu p2.0 den p2.4
hangPhim equ p3 ;tu p0.0 den p0.4

;----------------------------------------------------------------- lien quan Lcd
mode4bit equ 28h
curBat equ 0eh
curNhapNhay equ 0fh
curKoNhapNhay equ 0eh
khoangTrang equ 20h
xoaLcd equ 01h
lcdPort equ p1 ;4 duong du lieu ra lcd
lcdMask equ 0f0h
dataMask equ 0fh
dauDong1 equ 80h
cuoiDong1 equ 8fh
apCuoiDong1 equ 8eh
dauDong2 equ 0c0h
cuoiDong2 equ 0cfh
kyTuChia equ 0fdh ;ma ASCII cua ky tu chia
kyTuSangTrai equ 0 ;ghi trong CGRAM
kyTuSangTraiHetRam equ 7fh
kyTuSangPhai equ 1
kyTuSangPhaiHetRam equ 7eh
kyTuDau equ 2
kyTu2nho equ 3
kyTu3nho equ 4
kyTuCan equ 5
kyTu10nho equ 6
kyTu10nhoAm equ 7
byte0cgram equ 1000000b
byte1cgram equ 1001000b
byte2cgram equ 1010000b
byte3cgram equ 1011000b
byte4cgram equ 1100000b
byte5cgram equ 1101000b
byte6cgram equ 1110000b
byte7cgram equ 1111000b

rs bit p1.1
rw bit p1.2
e bit p1.3

;----------------------------------------------------------------- lien quan vung nho bit
ctrl bit 20h.0
hetRam bit 20h.1
nho bit 20h.2
so1am bit 20h.3
so2am bit 20h.4
so3am bit 20h.5
soXam bit 20h.6
soMuAm bit 20h.7
soMu1Am bit 21h.0
soMu2Am bit 21h.1
soMu3Am bit 21h.2
ol bit 21h.3
kqAm bit 21h.4
soMuKqAm bit 21h.5
bool bit 21h.6
chia0 bit 21h.7
can2am bit 22h.0

;----------------------------------------------------------------- lien quan vung nho noi
maxSo equ 10
phimVuaNhan equ 30h
maPhim equ 31h ;ma phim cua phim vua nhan
troLcd equ 32h
soCot equ 33h ;so byte cua lcdx
viTriLoi equ 34h
viTriPhepTinh1 equ 35h
phepTinh1 equ 36h
viTriPhepTinh2 equ 37h
phepTinh2 equ 38h
viTriPhepTinh3 equ 39h
phepTinh3 equ 3ah
viTriA0 equ 3bh
soMu1 equ 3ch
soMu2 equ 3dh
soMu3 equ 3eh
soMuKq equ 2ch
soMu equ 2fh
reset1 equ 2eh
reset2 equ 2dh
bo equ 3fh ;byte bo = rong

lcd equ 40h ;(40h byte: 40h->80h)
lcdTruoc equ 80h ;(40h byte: 80h->0c0h)
maxLcdTruoc equ 40h
lcdSau equ 0c0h ;(40h byte: 0c0h->100h)
maxLcdSau equ 40h
maxLcd equ 40h ;so byte toi da ma vung Lcd chua duoc
maxVungNhoNoi equ 0c0h ;toan vung nho noi (tru cac byte nho rieng)
lcdTam equ 80h ;(40h byte: 80h->0c0h)
lcdNAtruoc equ 80h ;(40h byte: 80h->0c0h)
lcdNAsau equ 0c0h ;(40h byte: 0c0h->100h)
lcdCongTruDau equ 80h ;(40h byte: 80h->0c0h)
lcdRutGon equ 0c0h ;(40h byte: 0c0h->100h)
vungSo equ 80h
maxVungSo equ 80h
so1 equ 84h
so2 equ 90h
so3 equ 9ch
kq equ 0f0h ;10 byte
phu equ 0b4h ;20 byte or 10 byte
tich equ 0cch ;20 byte
thuong equ 0e4h ;10 byte
phuMu2 equ 0e4h ;10 byte
cuoiPhuMu2 equ phuMu2+maxSo-1
can2kq equ 0f0h ;10 byte
cb2 equ 0e4h ;10 byte
can2phu equ 0a8h ;10 byte
cuoiCan2phu equ can2phu+maxSo-1
cbSo1 equ 0d8h ;10 byte
cuoiCbSo1 equ cbSo1+maxSo-1
so2mr equ 0cch ;20 byte
cuoiSo1 equ so1+maxSo-1
cuoiSo2 equ so2+maxSo-1
cuoiSo3 equ so3+maxSo-1
cuoiKq equ kq+maxSo-1
cuoiTich equ tich+2*maxSo-1
cuoiPhu equ phu+2*maxSo-1
cuoiSo2mr equ so2mr+2*maxSo-1

;----------------------------------------------------------------- lien quan vung nho ngoai
dcRamCao equ p2
ram equ 0
maxRam equ 200h
lcdx equ 0 ;(0c0h byte: 0->0c0h)
maxLcdx equ 3*maxLcd
kqx equ 0cch

;----------------------------------------------------------------- tong quat
het equ 0eeh
rong equ 0ffh
x equ 0ddh ;bat chap
y equ 0cch ;ko quan trong
koLoi equ 0ffh

;----------------------------------------------------------------- ma phim cua cac phim
mpCtrl equ 0
mpTrai equ 1
mpPhai equ 2
mpDel equ 3
mpOn equ 4
mp7 equ 5
mp8 equ 6
mp9 equ 7
mpChia equ 8
mpMo equ 9
mp4 equ 0ah
mp5 equ 0bh
mp6 equ 0ch
mpNhan equ 0dh
mpDong equ 0eh
mp1 equ 0fh
mp2 equ 10h
mp3 equ 11h
mpTru equ 12h
mpDau equ 13h
mp0 equ 14h
mpPhay equ 15h
mpBang equ 16h
mpCong equ 17h
mpK equ 18h
mpCan2 equ 19h
mpCan3 equ 1ah
mpMu2 equ 1bh
mpMu3 equ 1ch
mp10mu equ 1dh
mpKtraDongMoXong equ 1eh
mpNhanAnTruoc equ 1fh
mpNhanAnSau equ 20h
mpMoCan equ 26h
mpTruDau equ 27h

pSo equ 0ah
pCongTru equ 9
pNhanChia equ 8
pMo equ 7
pDong equ 6
pPhay equ 5
pDau equ 4
pK equ 3
pCan equ 2
pMu equ 1
p10mu equ 0

so1roi equ 0f1h
so2roi equ 0f2h
;--------------------------------------- PHẦN 2 MÃ SỐ --------------------------------------------
KHOI_TAO: db curBat,xoaLcd,het ;khoi tao lcd
MAPHIM_PHIMVUANHAN: db 'CTPDO','789/(','456x)','123-A','0,=+K','rshbm' ;lay ten phim cua ma phim
MAPHIM_LOAIPHIM: db 3,3,3,2,4, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,1,0,0, 0,0,0,0,0 ;lay loai phim tuong ung voi ma phim
MAPHIM_LOAIPHIMHIENTHI:
db x,x,x,x,x, pSo,pSo,pSo,pNhanChia,pMo, pSo,pSo,pSo,pNhanChia,pDong
db pSo,pSo,pSo,pCongTru,pDau, pSo,pPhay,x,pCongTru,pK, pCan,pCan,pMu,pMu,p10mu
MAPHIM_LOAIPHIMMOCAN:
db x,x,x,x,x, y,y,y,y,mpMoCan, y,y,y,y,mpDong, y,y,y,y,y, y,y,x,y,y, mpMoCan,mpMoCan,y,y,y
MAPHIM_TENPHIM: db x,x,x,x,x, '789',kyTuChia,'(456x)123-',kyTuDau,'0,',x,'+K', x,x,kyTu2nho,kyTu3nho,x ;lay ten phim de xuat ra lcd
MAPHIM_DAUCONGTRU: db x,x,x,x,x, y,y,y,y,y, y,y,y,y,y, y,y,y,mpTruDau,mpTruDau, y,y,x,mpCong,y, y,y,y,y,y
MAPHIM_BCD: db x,x,x,x,x, 7,8,9,x,x, 4,5,6,x,x, 1,2,3,x,x, 0,x,x,x,x, x,x,x,x,x

KY_TU_DAC_BIET:
SANG_TRAI: db 2,6,0fh,1fh,0fh,6,2,0 ;0
SANG_PHAI: db 8,0ch,1eh,01fh,1eh,0ch,8,0 ;1
DAU_AM: db 0,0,0,0eh,0,0,0,0 ;2
SO2_NHO: db 0eh,11h,2,4,1fh,0,0,0 ;3
SO3_NHO: db 0eh,11h,6,11h,0eh,0,0,0 ;4
CAN: db 7,4,4,4,14h,0ch,4,0 ;5
SO10_NHO: db 0,0,17h,15h,15h,15h,17h,0 ;6
SO10_NHO_AM: db 0,0fh,0,17h,15h,15h,17h,0,het ;7
CHUOI_CAN2: db kyTuCan,'(',het
CHUOI_CAN3: db kyTu3nho,kyTuCan,'(',het
CHUOI_10MU: db 'x',kyTu10nho,het
CHUOI_10MU_AM: db 'x',kyTu10nhoAm,het

KTRA_DUNG_DAU: db pSo,pMo,pPhay,pDau,pK,pCan,pCongTru,p10mu,het
KTRA_DUNG_TRUOC: db 6,0fah,4,6ah, 7,0feh,7,0feh, 3,95h,7,94h, 4,6ah,7,0feh, 4,6ah,7,0ffh, 7,0b5h
KTRA_DUNG_CUOI: db pSo,pDong,pPhay,pK,pMu,het

MP_SO: db mp0,mp1,mp2,mp3,mp4,mp5,mp6,mp7,mp8,mp9,het
MP_SO_PHAY: db mp0,mp1,mp2,mp3,mp4,mp5,mp6,mp7,mp8,mp9,mpPhay,het
MP_SO_PHAY_DAU: db mp0,mp1,mp2,mp3,mp4,mp5,mp6,mp7,mp8,mp9,mpPhay,mpDau,het
MP_SO_PHAY_DAU_10MU: db mp0,mp1,mp2,mp3,mp4,mp5,mp6,mp7,mp8,mp9,mpPhay,mpDau,mp10mu,het
MP_SO_DAU: db mp0,mp1,mp2,mp3,mp4,mp5,mp6,mp7,mp8,mp9,mpDau,het
MP_NHAN_AN_TRUOC: db mp0,mp1,mp2,mp3,mp4,mp5,mp6,mp7,mp8,mp9,mpDong,mpK,het
MP_NHAN_AN_SAU: db mpMo,mpK,mpCan2,mpCan3,het
MP_CONG_DU: db mpMo,mpCan2,mpCan3,mpNhan,mpChia,het
MP_TRUOC_DAU: db mpNhan,mpChia,mpCan2,mpCan3,mpMo,mp10mu,het
MP_RONG_DONG: db rong,mpDong,het
MP_MO_CAN: db mpMo,mpCan2,mpCan3,het
P_MO_CAN: db pMo,pCan,het
MP_TINH: db mpCong,mpTru,mpNhan,mpChia,mpMu2,mpMu3,het
MP_NHAN_CHIA: db mpNhan,mpChia,het
MP_CONG_TRU: db mpCong,mpTru,het
MP_MU: db mpMu2,mpMu3,het
MP_SO_KHAC_0: db mp1,mp2,mp3,mp4,mp5,mp6,mp7,mp8,mp9,het
MP_0_PHAY_DAU: db mp0,mpPhay,mpDau,het
MP_0_RONG: db 0,rong,het
MP_TRU_DAU: db mpTru,mpDau,het

P_DAU_CONGTRU: db pDau,pCongTru,het
P_SO_DAU_CONGTRU: db pSo,pDau,pCongTru,het
TB_TRAN_SO: db 'Tran so',het
TB_CHIA0: db 'Chia 0',het
TB_CAN2AM: db 'Can bac 2 so am',het
;------------------------------- PHẦN 3 CT CHÍNH --------------------------------------------
org 0
call khoiTao
; mov a,#cuoiDong2
; call lenh
; mov a,#kyTu10nhoAm
; call duLieu
; mov a,#dauDong2
; call lenh
; mov a,#'x'
; call duLieu
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
jmp CHO_NHAN
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
mov a,#dauDong1
call xoaVeDauDong
mov a,#dauDong2
call xoaVeDauDong
mov a,#dauDong1
call lenh
mov a,#'a'
call duLieu
mov a,#cuoiDong1
call lenh
mov a,#'c'
call duLieu
mov a,#dauDong2
call lenh
mov a,#'b'
call duLieu
mov a,#cuoiDong2
call lenh
mov a,#'d'
call duLieu

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
jmp $
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
CHO_NHAN: call xdPhim
cjne a,#0ffh,CO_PHIM
jmp CHO_NHAN

CO_PHIM: mov maPhim,a
mov dptr,#MAPHIM_PHIMVUANHAN
movc a,@a+dptr
mov phimVuaNhan,a

mov a,maPhim
call xdLoai
mov dptr,#XU_LY_PHIM
jmp @a+dptr

XU_LY_PHIM: acall phimHt
ajmp CHO_NHAN
acall phimBang
ajmp CHO_NHAN
acall phimXoa
ajmp CHO_NHAN
acall phimDich
ajmp CHO_NHAN
acall phimOn
ajmp CHO_NHAN

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
$ic (datTen.asm)
$ic (maSo.asm)
$ic (xdPhim.asm)
$ic (xdLoai.asm)
$ic (khoiTao.asm)
$ic (phimOn.asm)
$ic (xuLyLcd.asm)
$ic (hamTT.asm)
$ic (hamHT.asm)
$ic (phimXoa.asm)
$ic (phimDich.asm)
$ic (phimHt.asm)
$ic (phimBang.asm)
$ic (xuLyDL.asm)
$ic (kTraLoi.asm)
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
;------------------------------------------- PHẦN 4 HÀM HIỂN THỊ --------------------------------
byte2cot: mov dptr,#lcdx
mov r3,#high(maxLcdx)
mov r2,#low(maxLcdx)
mov a,#rong
call setVungNhoNgoai

mov r1,#lcd
mov r0,#lcdx
mov dcRamCao,#0

B2C_BDAU: cjne @r1,#rong,B2C_CHUYEN
mov a,r0
ret

B2C_CHUYEN: cjne @r1,#mpCan2,B2C_KO_PHIM_CAN2
mov dptr,#CHUOI_CAN2
call ghiKyTuDai
jmp B2C_TANG_R1

B2C_KO_PHIM_CAN2: cjne @r1,#mpCan3,B2C_KO_PHIM_CAN3
mov dptr,#CHUOI_CAN3
call ghiKyTuDai
jmp B2C_TANG_R1

B2C_KO_PHIM_CAN3: cjne @r1,#mp10mu,B2C_KO_PHIM_10MU
mov dptr,#CHUOI_10MU
call ghiKyTuDai
jmp B2C_TANG_R1

B2C_KO_PHIM_10MU: mov dptr,#MAPHIM_TENPHIM
mov a,@r1
movc a,@a+dptr
movx @r0,a
inc r0
B2C_TANG_R1: inc r1
jmp B2C_BDAU

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
ghiKyTuDai: clr a
movc a,@a+dptr
cjne a,#het,GKTD_TIEP
ret

GKTD_TIEP: movx @r0,a
inc r0
inc dptr
jmp ghiKyTuDai

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
ghiToanVungLcdx: mov r0,#lcdx
GTVLX_BDAU: movx a,@r0
cjne a,#rong,GTVLX_XUAT
ret

GTVLX_XUAT: call duLieu
inc r0
jmp GTVLX_BDAU

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
soCotDenR0: mov r1,#lcd
clr a

SCDR0_BDAU: mov r3,a
mov a,r1
cjne a,0,SCDR0_TIEP
mov a,r3
ret

SCDR0_TIEP: mov a,r3
cjne @r1,#mpCan2,SCDR0_KO_PHIM_CAN2
add a,#2
jmp SCDR0_TANG_R0

SCDR0_KO_PHIM_CAN2: cjne @r1,#mpCan3,SCDR0_KO_PHIM_CAN3
add a,#3
jmp SCDR0_TANG_R0

SCDR0_KO_PHIM_CAN3: cjne @r1,#mp10mu,SCDR0_KO_PHIM_10MU
add a,#2
jmp SCDR0_TANG_R0

SCDR0_KO_PHIM_10MU: inc a
SCDR0_TANG_R0: inc r1
jmp SCDR0_BDAU

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
muiTenTrai: jb hetRam,MTT_HET_RAM
mov a,#kyTusangTrai
jmp MTT_XUAT
MTT_HET_RAM: mov a,#kyTusangTraiHetRam
MTT_XUAT: call duLieu
ret

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
muiTenPhai: jb hetRam,MTP_HET_RAM
mov a,#kyTusangPhai
jmp MTP_XUAT
MTP_HET_RAM: mov a,#kyTusangPhaiHetRam
MTP_XUAT: call duLieu
ret

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
;arg: r2=so byte can ghi ra lcd
; r0->byte dau tien trong vung lcdx can ghi
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
ghiTuDau: movx a,@r0
call duLieu
inc r0
djnz r2,ghiTuDau
ret


;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
;arg: r2=so byte can ghi ra lcd
; r0->byte cuoi cung trong vung lcdx can ghi
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
ghiTuCuoi: mov a,r0
clr c
subb a,r2
inc a ;a=r0-r2+1
mov r0,a
call ghiTuDau
ret
;-------------------------------- PHẦN 5 HÀM TT --------------------------------------------------
setVungNhoNoi:
setSo: mov @r0,a
inc r0
djnz r2,setVungNhoNoi
ret

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
clrSo: clr a
call setSo
ret

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
;fun: lam rong r3:r2 byte cua vung nho ngoai bat dau tu dptr
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
setVungNhoNgoai: inc r2
inc r3
SVNN_BDAU: djnz r2,SVNN_SET
djnz r3,SVNN_SET
ret

SVNN_SET: movx @dptr,a
movx @dptr,a
inc dptr
jmp SVNN_BDAU

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
dichTrai1buoc: mov 1,r0
inc r1
DT1B_BDAU: cjne @r1,#rong,DT1B_KO_RONG
mov @r0,#rong
ret

DT1B_KO_RONG: call mov10inc
jmp DT1B_BDAU

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
dichPhai1buoc: push 0
call soByte
pop 0
mov r2,a
add a,r0
mov r0,a

mov 1,r0
dec r1

call mov10dec2
ret
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
mov10inc: mov a,@r1
mov @r0,a
inc r0
inc r1
ret
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
mov10dec: mov a,@r1
mov @r0,a
dec r0
dec r1
ret
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
mov10inc2: mov a,@r1
mov @r0,a
inc r0
inc r1
djnz r2,mov10inc2
ret

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
mov10dec2: mov a,@r1
mov @r0,a
dec r0
dec r1
djnz r2,mov10dec2
ret

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
;fun: so byte khac rong, tinh tu r0
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
soByte: mov a,r0
SB_BDAU: cjne @r0,#rong,SB_TIEP
xch a,r0
clr c
subb a,r0
ret

SB_TIEP: inc r0
jmp SB_BDAU

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
dichTraiR1R0: cjne @r1,#rong,DTRR_DICH_TIEP
call xoaTuR0denHet
ret

DTRR_DICH_TIEP: call mov10inc
jmp dichTraiR1R0

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xoaTuR0denHet: mov @r0,#rong
inc r0
cjne @r0,#rong,xoaTuR0denHet
ret

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xoaTraiR2byteTuR0: mov @r0,#rong
dec r0
djnz r2,xoaTraiR2byteTuR0
ret

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
rongVungNhoTuR0: cjne @r0,#rong,RVNTR0_TIEP
ret

RVNTR0_TIEP: mov @r0,#rong
inc r0
jmp rongVungNhoTuR0

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
n2x: mov a,@r1
cjne a,#rong,N2X_TIEP
ret

N2X_TIEP: movc a,@a+dptr
mov @r0,a
inc r0
inc r1
jmp n2x

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
byte2bit: cjne a,#8,$+3
jc B2B_A_BE
mov r6,#0
add a,#-8
call byte2bit2
mov r5,a
ret

B2B_A_BE: mov r5,#0
call byte2bit2
mov r6,a
ret

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
byte2bit2: jnz B2B2_KHOI_TAO
inc a
ret

B2B2_KHOI_TAO: mov r2,a
mov a,#1
B2B2_TIEP: rl a
djnz r2,B2B2_TIEP
ret

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
chuyenVungNho:
chuyenVungNhoNoi:
chuyenSo: mov a,@r1
cjne a,#rong,CVN_CHUYEN
ret

CVN_CHUYEN: mov @r0,a
inc r0
inc r1
jmp chuyenVungNho

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
minAr7: cjne a,7,$+3
jc MINAR7_A_BE
ret

MINAR7_A_BE: mov r7,a
ret

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
kTraLoaiMaPhim: clr a
movc a,@a+dptr
cjne a,#het,KTLMP_KTRA
clr c
ret

KTLMP_KTRA: cjne a,b,KTLMP_TANG_TRO
setb c
ret

KTLMP_TANG_TRO: inc dptr
jmp kTraLoaiMaPhim

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
soSanhDau: anl a,#11b
jz SSD_CUNG_DAU
cjne a,#3,SSD_KHAC_DAU
SSD_CUNG_DAU: setb c
ret

SSD_KHAC_DAU: clr c
ret
;---------------------------------- PHẦN 6 Khởi Tạo -----------------------------------------
khoiTao: mov a,reset1
cjne a,#78h,TEST1
mov a,reset2
cjne a,#34h,TEST1
;jmp TEST2

TEST1: mov reset1,#78h
mov reset2,#34h
;----------------------------------------------------------------- khoi tao Lcd mode 4 bit
mov tmod,#01h ;t0 mode 1 count 16bit
mov th0,#high(-50000) ;50ms>40ms
mov tl0,#low(-50000)
setb tr0 ;bat dau dem

jnb tf0,$ ;cho du 50ms
clr tr0 ;ngung dem

clr rw
clr rs
mov a,#mode4bit ;mode 4 bit
call nibble
mov a,#mode4bit
call lenh

;----------------------------------------------------------------- ghi CGRAM
call ghiKyTuDacBiet
TEST2: mov dptr,#KHOI_TAO
call chuoiLenh
;----------------------------------------------------------------- lam rong vung nho
khoiTaox: mov bo,#rong ;vung nho noi

mov r0,#lcd
mov r2,#maxVungNhoNoi
mov a,#rong
call setVungNhoNoi

mov dptr,#ram
mov r2,#low(maxRam)
mov r3,#high(maxRam)
mov a,#rong
call setVungNhoNgoai

;----------------------------------------------------------------- khoi tao cac thanh phan khac
mov troLcd,#lcd ;troLcd-> lcd
clr ctrl ;vo hieu ctrl
ret

;---------------------------------- PHẦN 7 XD PHÍM -----------------------------------------
xdPhim: mov r2,#10
XDP_KT_NHAN: call quetPhim
cjne a,#0ffh,XDP_CO_NHAN
jmp XDP_TRO_VE
XDP_CO_NHAN: djnz r2,XDP_KT_NHAN
push acc

XDP_CHUA_BUONG: mov r2,#10
XDP_KT_BUONG: call quetPhim
cjne a,#0ffh,XDP_CHUA_BUONG
djnz r2,XDP_KT_BUONG
pop acc
XDP_TRO_VE: ret

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
quetPhim: mov r4,#0 ;r4 la maPhim
mov r3,#maQuet ;maQuet=1111.1110
QP_XUAT_MA_QUET:
mov a,r3
anl a,#00011111b
mov r5,a

mov a,cotPhim
anl a,#11100000b
orl a,r5 ;ko lam thay doi cac chan .5 .6 .7

mov cotPhim,a

mov a,hangPhim
anl a,#00111111b

cjne a,#00111111b,QP_CHUYEN_HANG ;co nhan phim ko?

cjne r3,#011101111b,QP_CHUYEN_COT
mov a,#0ffh
ret

QP_CHUYEN_COT: inc r4
mov a,r3
rl a
mov r3,a
jmp QP_XUAT_MA_QUET

QP_CHUYEN_HANG:
rrc a
jnc QP_XD_PHIM_XONG

push acc
mov a,r4
add a,#5
mov r4,a
pop acc ;maPhim+=5

jmp QP_CHUYEN_HANG
QP_XD_PHIM_XONG:
mov a,r4
ret

;---------------------------------- PHẦN 8 XD LOẠI -----------------------------------------
xdLoai: mov dptr,#MAPHIM_LOAIPHIM
movc a,@a+dptr ;a=(loai phim)

mov b,#4
mul ab ;a=(loai phim) x 4
ret

;---------------------------------- PHẦN 9 PHÍM HIỂN THỊ -----------------------------------------
phimHt: mov r0,#lcd+maxLcd-2
cjne @r0,#rong,PHT_XONG

mov r0,troLcd
cjne @r0,#rong,PHT_DICH_PHAI

PHT_LUU_MA_PHIM: mov r0,troLcd
mov @r0,maPhim
inc troLcd
call htDong1
PHT_XONG: ret

PHT_DICH_PHAI: call dichPhai1buoc
jmp PHT_LUU_MA_PHIM

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
$ic (htDong1.asm)

;---------------------------------- PHẦN 10 PHÍM DỊCH -----------------------------------------
phimDich: mov a,maPhim
cjne a,#mpCtrl,PD_KO_PHIM_CTRL
cpl ctrl
PD_XONG: call htDong1
ret

PD_KO_PHIM_CTRL: mov r0,troLcd
cjne a,#mpTrai,PD_KO_PHIM_TRAI
cjne r0,#lcd,PD_TRAI_DICH
jmp PD_XONG

PD_TRAI_DICH: jb ctrl,PD_TRAI_DICH_CTRL
dec troLcd
jmp PD_XONG

PD_TRAI_DICH_CTRL: mov a,#lcd
xch a,r0
clr c
subb a,r0
cjne a,#10,$+3
jc PD_TRAI_RESET_TROLCD
mov a,troLcd
clr c
subb a,#10
mov troLcd,a
jmp PD_XONG

PD_TRAI_RESET_TROLCD:
mov troLcd,#lcd
jmp PD_XONG

PD_KO_PHIM_TRAI: cjne @r0,#rong,PD_PHAI_DICH
jmp PD_XONG

PD_PHAI_DICH: jb ctrl,PD_PHAI_DICH_CTRL
inc troLcd
jmp PD_XONG

PD_PHAI_DICH_CTRL: mov r0,troLcd
call soByte
cjne a,#10,$+3
jc PD_PHAI_CUOI_LCD
mov a,troLcd
add a,#10
mov troLcd,a
jmp PD_XONG

PD_PHAI_CUOI_LCD: add a,troLcd
mov troLcd,a
jmp PD_XONG

;---------------------------------- PHẦN 11 PHÍM DEL -----------------------------------------
phimXoa: mov r0,#lcd
cjne @r0,#rong,PX_BDAU
ret

PX_BDAU: mov r0,troLcd
jb ctrl,PX_CTRL
cjne @r0,#rong,PX_DICH_TRAI
dec r0
mov @r0,#rong
dec troLcd
jmp PX_XONG

PX_DICH_TRAI: mov 1,r0
inc r1
call dichTraiR1R0
jmp PX_XONG

PX_CTRL: cjne @r0,#rong,PX_CTRL_XOA_PHAI
mov r0,#lcd
call soByte
cjne a,#11,$+3
jc PX_CTRL_XOA_SACH
mov r0,troLcd
dec r0
mov r2,#10
call xoaTraiR2byteTuR0
mov a,troLcd
clr c
subb a,#10
mov troLcd,a
jmp PX_XONG

PX_CTRL_XOA_SACH: mov r0,#lcd
call rongVungNhoTuR0
mov troLcd,#lcd
jmp PX_XONG

PX_CTRL_XOA_PHAI: call soByte
cjne a,#11,$+3
jc PX_CTRL_XOA_DEN_HET
mov a,troLcd
mov r0,a
add a,#10
mov r1,a
call dichTraiR1R0
jmp PX_XONG

PX_CTRL_XOA_DEN_HET: call xoaTuR0denHet

PX_XONG: call htDong1
ret

;---------------------------------- PHẦN 12 PHÍM ON -----------------------------------------
phimOn: mov bo,#rong ;vung nho noi

mov r0,#lcd
mov r2,#maxVungNhoNoi
mov a,#rong
call setVungNhoNoi

mov dptr,#ram
mov r2,#low(maxRam-135h)
mov r3,#high(maxRam-135h)
mov a,#rong
call setVungNhoNgoai

;----------------------------------------------------------------- khoi tao cac thanh phan khac
mov troLcd,#lcd ;troLcd-> lcd
clr ctrl ;vo hieu ctrl

mov a,#xoaLcd
call lenh
ret

;---------------------------------- PHẦN 13 PHÍM BẰNG -----------------------------------------
phimBang: call kTraLoi
cjne a,#koLoi,PB_HIEN_THI_LOI
call xuLyDL
call tinhToan
ret

PB_HIEN_THI_LOI: call hienThiLoi
ret

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
hienThiLoi: add a,#lcd
mov troLcd,a
call htDong1
ret

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
$ic (tinhToan.asm)
$ic (htDong2.asm)

;---------------------------------- PHẦN 14 HT DÒNG 1 -----------------------------------------
htDong1: jb ctrl,HTD1_CURSOR_NHAP_NHAY
mov a,#curKoNhapNhay
jmp HTD1_CHON_TRO
HTD1_CURSOR_NHAP_NHAY:
mov a,#curNhapNhay
HTD1_CHON_TRO: call lenh
mov a,#dauDong1
call xoaVeDauDong

mov r0,#lcd
cjne @r0,#rong,HTD1_BDAU
ret

HTD1_BDAU: mov r0,#lcd+maxLcd-11
cjne @r0,#rong,HTD1_HET_RAM
clr hetRam
jmp HTD1_BDAU1
HTD1_HET_RAM: setb hetRam

HTD1_BDAU1: mov dcRamCao,#0
call byte2cot
mov soCot,a
cjne a,#16,$+3
jc HTD1_KO_DAY_DONG
mov r0,troLcd
cjne @r0,#rong,HTD1_KO_DAY_DONG_TRAI
call muiTenTrai ;day dong trai
mov r2,#14
mov r0,soCot
dec r0
call ghiTuCuoi
ret

HTD1_KO_DAY_DONG: call ghiToanVungLcdx

mov r0,troLcd
call soCotDenR0
add a,#dauDong1
call lenh
ret

HTD1_KO_DAY_DONG_TRAI:
inc r0
cjne @r0,#rong,HTD1_KO_VUA_DAY_DONG_TRAI
call muiTenTrai ;vua day dong trai
mov r2,#15
mov r0,soCot
dec r0
call ghiTuCuoi
mov a,#cuoiDong1
call lenh
ret

HTD1_KO_VUA_DAY_DONG_TRAI:
mov r0,troLcd
call soCotDenR0
cjne a,#15,$+3
jc HTD1_DAY_DONG_PHAI
push acc
call muiTenTrai ;day dong trai phai
pop 0
;dec r0
mov r2,#14
call ghiTuCuoi
call muiTenPhai
mov a,#apCuoiDong1
call lenh
ret

HTD1_DAY_DONG_PHAI: push acc
mov r2,#15
mov r0,#lcdx
call ghiTuDau
call muiTenPhai
pop acc
add a,#dauDong1
call lenh
ret

;---------------------------------- PHẦN 15 XL LCD -----------------------------------------
duLieu: call sanSang
clr rw
setb rs
jmp DL_L
lenh: call sanSang
clr rw
clr rs
DL_L: push acc
call nibble
pop acc
swap a
call nibble
ret

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
nibble: orl lcdPort,#lcdMask ;lcdMask=0fh
orl a,#dataMask ;dataMask=0f0h
anl lcdPort,a
setb e
clr e
ret

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
sanSang: clr rs
setb rw
orl lcdPort,#lcdMask
jmp SS_1
SS_0: clr e
setb e
SS_1: clr e
setb e
jb lcdPort.7,SS_0
clr e
setb e
ret

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
chuoiLenh: clr a
movc a,@a+dptr
cjne a,#het,CL_TIEP
ret

CL_TIEP: call lenh
inc dptr
jmp chuoiLenh

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
ghiCgram: mov a,r0
call lenh ;thiet dat dia chi CGRAM
clr a
movc a,@a+dptr
cjne a,#het,GCG_GHI_DAU_AM
ret

GCG_GHI_DAU_AM: call duLieu
inc r0
inc dptr
jmp ghiCgram

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
ghiKyTuDacBiet: mov r0,#byte0cgram
mov dptr,#KY_TU_DAC_BIET
call ghiCgram
ret

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xoaVeDauDong: push acc
call lenh ;dua con tro ve dau dong 1 hoac 2
mov r2,#16
XVDD_TIEP: mov a,#khoangTrang
call duLieu
djnz r2,XVDD_TIEP
pop acc
call lenh
ret

;---------------------------------- PHẦN 16 XỪ LÝ DL -----------------------------------------
xuLyDL: call xuLyDau
call rutGonDau
call rutGonCongDu
call phanBietTruAm
call lcd2nhanAn
ret

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
danhDauNhanAn: inc r0
mov 4,@r0
mov r3,#0
cjne @r0,#rong,DDNA_KTRA
ret

DDNA_KTRA: mov a,r3
movc a,@a+dptr
cjne a,#het,DDNA_KTRA_TIEP
jmp danhDauNhanAn

DDNA_KTRA_TIEP: cjne a,4,DDNA_TIM_TIEP
mov @r0,b
jmp danhDauNhanAn

DDNA_TIM_TIEP: inc r3
jmp DDNA_KTRA

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xuLyDau: mov dptr,#MAPHIM_DAUCONGTRU
mov r0,#lcdCongTruDau
mov r1,#lcd
call n2x

mov r0,#lcdCongTruDau-1
XLD_BDAU: inc r0
clr nho
cjne @r0,#rong,XLD_KTRA
ret

XLD_KTRA: cjne @r0,#mpTruDau,XLD_KTRA_TIEP
cpl nho
mov @r0,#mpCong
XLD_TANG_R0: inc r0
jmp XLD_KTRA

XLD_KTRA_TIEP: cjne @r0,#mpCong,XLD_KTRA_NHO
jmp XLD_TANG_R0

XLD_KTRA_NHO: jnb nho,XLD_BDAU
dec r0
mov @r0,#mpTru
inc r0
jmp XLD_BDAU

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
rutGonDau: mov r0,#lcdRutGon
call rongVungNhoTuR0

mov r0,#lcdRutGon
mov r1,#lcdCongTruDau
RGD_BDAU: cjne @r1,#rong,RGD_KO_RONG
ret

RGD_KO_RONG: cjne @r1,#mpCong,RGD_KO_CONG
inc r1
cjne @r1,#mpCong,RGD_KO_CONG_2
jmp RGD_BDAU

RGD_KO_CONG_2: cjne @r1,#mpTru,RGD_KO_TRU_2
jmp RGD_GHI_TRU

RGD_KO_CONG: cjne @r1,#mpTru,RGD_KO_TRU
RGD_GHI_TRU: mov @r0,#mpTru
RGD_TANG_TRO: inc r0
inc r1
jmp RGD_BDAU

RGD_KO_TRU: mov a,r1
add a,#lcd-lcdCongTruDau
push 0
mov r0,a
mov a,@r0
pop 0
mov @r0,a
jmp RGD_TANG_TRO

RGD_KO_TRU_2: mov @r0,#mpCong
inc r0
jmp RGD_KO_TRU

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
rutGonCongDu: mov r0,#lcdTam
call rongVungNhoTuR0

mov r0,#lcdTam
mov r1,#lcdRutGon
RGCD_BDAU: cjne @r1,#rong,RGCD_KO_RONG

mov r0,#lcdTam
cjne @r0,#mpCong,RGCD_XONG
call dichTrai1buoc
RGCD_XONG: ret

RGCD_KO_RONG: mov dptr,#MP_CONG_DU
mov b,@r1
call kTraLoaiMaPhim
jc RGCD_CONG_DU
RGCD_KO_CONG_DU: mov a,@r1
mov @r0,a
RGCD_TANG_TRO: inc r0
inc r1
jmp RGCD_BDAU

RGCD_CONG_DU: inc r1
cjne @r1,#mpCong,RGCD_KO_CONG
dec r1
mov a,@r1
mov @r0,a
inc r1
jmp RGCD_TANG_TRO

RGCD_KO_CONG: dec r1
jmp RGCD_KO_CONG_DU

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
phanBietTruAm: mov r0,#lcdTam-1
PBTA_BDAU: inc r0
PBTA_KTRA: cjne @r0,#rong,PBTA_KO_RONG
mov r0,#lcdTam
cjne @r0,#mpTru,PBTA_XONG
mov @r0,#mpDau
PBTA_XONG: ret

PBTA_KO_RONG: mov dptr,#MP_TRUOC_DAU
mov b,@r0
call kTraLoaiMaPhim
jnc PBTA_BDAU

PBTA_MP_TRUOC_DAU: inc r0
cjne @r0,#mpTru,PBTA_KTRA
mov @r0,#mpDau
jmp PBTA_BDAU

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
lcd2nhanAn: mov dptr,#lcdx
mov r3,#high(maxLcdx)
mov r2,#low(maxLcdx)
mov a,#rong
call setVungNhoNgoai

mov dcRamCao,#high(lcdx)
mov r0,#low(lcdx)-1
mov r1,#lcdTam-1

L2NA_BDAU: inc r1
L2NA_TANG_R0: inc r0
L2NA_KTRA_RONG: cjne @r1,#rong,L2NA_KO_RONG
ret

L2NA_KO_RONG: mov a,@r1
movx @r0,a
mov dptr,#MP_NHAN_AN_TRUOC
mov b,@r1
call kTraLoaiMaPhim
jnc L2NA_BDAU

inc r0
inc r1
mov dptr,#MP_NHAN_AN_SAU
mov b,@r1
call kTraLoaiMaPhim
jnc L2NA_KTRA_RONG

mov a,#mpNhan
movx @r0,a
jmp L2NA_TANG_R0

;---------------------------------- PHẦN 17 KT LỖI -----------------------------------------
kTraLoi: mov r0,#lcdTruoc
mov r2,#maxLcdTruoc+maxLcdSau
mov a,#rong
call setVungNhoNoi
mov dptr,#MAPHIM_LOAIPHIMHIENTHI
mov r1,#lcd
mov r0,#lcdTam
call n2x

call kTraDungTruoc
mov r7,a
call kTraDungDau
call minAr7
call kTraDungCuoi
call minAr7
call kTraDauPhay
call minAr7
call kTra10Mu
call minAr7
;call kTra10MuPhay
;call minAr7
call kTraDongMo
call minAr7
mov a,r7
ret

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
kTraDungTruoc: mov r1,#lcdTruoc
mov r0,#lcdSau
call chuyenVungNho

mov dptr,#KTRA_DUNG_TRUOC
mov r0,#lcdTruoc
mov r1,#lcdSau+1

KTDT_BDAU: cjne @r1,#rong,KTDT_KTRA
mov a,#koLoi
ret

KTDT_KTRA: mov a,@r1
mov b,#2
mul ab ;a=2*@r1
push acc
movc a,@a+dptr
mov r3,a
pop acc
inc a ;a=2*@r1+1
movc a,@a+dptr
mov r4,a

mov a,@r0
call byte2bit

mov a,r3
orl a,r5
cjne a,3,KTDT_LOI
mov a,r4
orl a,r6
cjne a,4,KTDT_LOI
inc r0
inc r1
jmp KTDT_BDAU

KTDT_LOI: mov a,r1
add a,#-lcdSau
ret

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
kTraDungDau: mov dptr,#KTRA_DUNG_DAU
mov r0,#lcdTam
mov 3,@r0
call kTraDungDauCuoi
ret

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
kTraDungCuoi: mov dptr,#KTRA_DUNG_CUOI
mov r0,#lcdTam
call soByte
dec a
mov r4,a
add a,#lcdTam
mov r0,a
mov 3,@r0
call kTraDungDauCuoi
jz KTDC_VI_TRI_LOI
ret

KTDC_VI_TRI_LOI: mov a,r4
ret

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
kTraDungDauCuoi: clr a
movc a,@a+dptr
cjne a,#het,KTDDC_TIEP
clr a
ret

KTDDC_TIEP: cjne a,3,KTDDC_TANG_TRO
mov a,#koLoi
ret

KTDDC_TANG_TRO: inc dptr
jmp kTraDungDauCuoi

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
kTraDauPhay: mov r0,#lcdTam-1
clr nho
KTDP_BDAU: inc r0
cjne @r0,#rong,KTDP_KTRA_PHAY
mov a,#koLoi
ret

KTDP_KTRA_PHAY: cjne @r0,#pPhay,KTDP_KTRA_SO
jb nho,KTDP_LOI
setb nho
jmp KTDP_BDAU

KTDP_LOI: mov a,r0
clr c
subb a,#lcdTam
ret

KTDP_KTRA_SO: cjne @r0,#pSo,KTDP_XONG_CHUOI
jmp KTDP_BDAU

KTDP_XONG_CHUOI: clr nho
jmp KTDP_BDAU

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
kTra10mu: mov r0,#lcdTam-1
KT10M_BDAU: inc r0
cjne @r0,#rong,KT10M_KO_RONG
mov a,#koLoi
ret

KT10M_KO_RONG: cjne @r0,#p10mu,KT10M_BDAU
inc r0

mov dptr,#P_DAU_CONGTRU
mov b,@r0
call kTraLoaiMaPhim
jnc KT10M_KO_DAU

inc r0
KT10M_KO_DAU: inc r0
cjne @r0,#pSo,KT10M_BDAU
inc r0
cjne @r0,#pSo,KT10M_BDAU
mov a,r0
add a,#-lcdTam
ret

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
kTra10muPhay: mov r0,#lcdTam-1
KT10MP_BDAU: inc r0
cjne @r0,#rong,KT10MP_KO_RONG
mov a,#koLoi
ret

KT10MP_KO_RONG: cjne @r0,#p10mu,KT10MP_BDAU
KT10MP_TIEP: inc r0
cjne @r0,#pPhay,KT10MP_KO_PHAY
mov a,r0
add a,#-lcdTam
ret

KT10MP_KO_PHAY: mov dptr,#P_SO_DAU_CONGTRU
mov b,@r0
call kTraLoaiMaPhim
jnc KT10MP_BDAU
jmp KT10MP_TIEP

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
kTraDongMo: mov r0,#lcdTam-1
KTDM_BDAU: inc r0
cjne @r0,#rong,KTDM_KTRA_DONG
mov a,#koLoi
ret

KTDM_KTRA_DONG: cjne @r0,#pDong,KTDM_BDAU
mov 1,r0
KTDM_TIM_MO: dec r1
cjne @r1,#rong,KTDM_TIEP
mov a,r0
add a,#-lcdTam
ret

KTDM_TIEP: mov dptr,#P_MO_CAN
mov b,@r1
call kTraLoaiMaPhim
jnc KTDM_TIM_MO
mov @r0,#mpKtraDongMoXong
mov @r1,#mpKtraDongMoXong
jmp KTDM_BDAU

;---------------------------------- PHẦN 18 TÍNH TOÁN -----------------------------------------
tinhToan: mov dcRamCao,#high(lcdx)
clr so1am
clr so2am
clr so3am
clr soXam
clr ol
clr chia0
clr can2am
mov r2,#maxVungSo
mov a,#rong
mov r0,#vungSo
call setVungNhoNoi

call moCanTrongCung
cjne r0,#-1,TT_CO_MO_CAN
TT_BDAU: call phepTinhThu1 ;ko mo can
jc TT_PTT1_CO
;ko co phep tinh

mov r0,#low(lcdx)
movx a,@r0
cjne a,#so1roi,TT_CHUYENLCDX

TT_LUU_KQ: mov r1,#so1
mov r0,#kq
call chuyenSo
mov c,so1am
mov kqAm,c
mov soMuKq,soMu1
mov c,soMu1Am
mov soMuKqAm,c

call htDong2
call luuKqx
ret
TT_CHUYENLCDX: call chuyenLcdx2so1
jmp TT_LUU_KQ


TT_PTT1_CO: mov b,phepTinh1
mov dptr,#MP_MU
call kTraLoaiMaPhim
jnc TT_PTT1_KO_MU
mov a,#1 ;so1=so1^2,3
call xulyMu
jmp TT_BDAU

TT_PTT1_KO_MU: mov dptr,#MP_NHAN_CHIA
call kTraLoaiMaPhim
jnc TT_PTT1_KO_NHAN_CHIA
mov a,#12h ;so1=so1x/so2
call xuLyNhanChia
jmp TT_BDAU

TT_PTT1_KO_NHAN_CHIA:
call phepTinhThu2
jc TT_PTT2_CO
call xuLyCongTru
jmp TT_LUU_KQ

TT_PTT2_CO: mov b,phepTinh2
mov dptr,#MP_MU
call kTraLoaiMaPhim
jnc TT_PTT2_KO_MU
mov a,#2 ;so2=so2^2,3
call xuLyMu
jmp TT_BDAU

TT_PTT2_KO_MU: mov dptr,#MP_NHAN_CHIA
call kTraLoaiMaPhim
jnc TT_PTT2_KO_NHAN_CHIA
mov a,#23h ;so2=so2x/so3
call xuLyNhanChia
jmp TT_BDAU

TT_PTT2_KO_NHAN_CHIA:
call xuLyCongTru
jmp TT_BDAU

TT_CO_MO_CAN: movx a,@r0
cjne a,#mpCan2,TT_CMC_KO_CAN2
call can2
call TT_LUU_KQ
ret

TT_CMC_KO_CAN2: ret

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
moCanTrongCung: mov r0,#-1
mov dcRamCao,#high(lcdx)
mov r1,#low(lcdx)-1

MCTC_BDAU: inc r1
mov dptr,#MP_RONG_DONG
movx a,@r1
mov b,a
call kTraLoaiMaPhim
jnc MCTC_KTRA_MOCAN
ret

MCTC_KTRA_MOCAN: mov dptr,#MP_MO_CAN
call kTraLoaiMaPhim
jnc MCTC_BDAU
mov 0,r1
jmp MCTC_BDAU

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
phepTinhThu1: mov dcRamCao,#high(lcdx)
mov r0,#low(lcdx)
call timPhepTinh
jc PTT1_CO
ret

PTT1_CO: mov viTriPhepTinh1,r0
movx a,@r0
mov phepTinh1,a
setb c
ret

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
phepTinhThu2: mov r0,viTriPhepTinh1
call timPhepTinh
jc PTT2_CO
ret

PTT2_CO: mov viTriPhepTinh2,r0
movx a,@r0
mov phepTinh2,a
setb c
ret

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
timPhepTinh: inc r0
movx a,@r0
cjne a,#rong,TPT_KO_RONG
clr c
ret

TPT_KO_RONG: mov dptr,#MP_TINH
mov b,a
call kTraLoaiMaPhim
jnc timPhepTinh
ret

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xuLyMu: cjne a,#1,XLM_KHAC_SO1
mov a,phepTinh1
cjne a,#mpMu2,XLM_KHAC_MU2

call tachSo1
mov r1,#so1
mov r0,#so2
call chuyenSo
call danhDau1
clr so1am
mov soMu2,soMu1
call congSoMu12
mov r0,#cuoiSo1
mov r1,#cuoiSo2
call nhan
mov soMu1,a
mov r0,#so1
call tich2so
ret

XLM_KHAC_MU2: call tachSo1
mov r1,#so1
mov r0,#so2
call chuyenSo
mov soMu2,soMu1
call congSoMu12
mov r0,#cuoiSo1
mov r1,#cuoiSo2
call nhan
mov soMu1,a
mov r0,#so1
call tich2so

mov r1,#so1
mov r0,#so2
call chuyenSo
mov soMu2,soMu1
call tachSo1
call congSoMu12
mov r0,#cuoiSo1
mov r1,#cuoiSo2
call nhan
mov soMu1,a
mov r0,#so1
call tich2so
call danhDau1
XLM_KHAC_SO1: ret

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xuLyNhanChia: cjne a,#12h,XLNC_TACH23
call tachSo1
call tachSo2
call danhDau12

mov r0,#cuoiSo1 ;luu kq vao @r0
mov r1,#cuoiSo2
mov a,phepTinh1
cjne a,#mpNhan,XLNC_KO_NHAN
call congSoMu12
call nhan
jb acc.7,XLNC_AM1
clr soMu1am
XLNC_LUU_SM: mov soMu1,a
mov r0,#so1
call tich2so
jmp XLNC_XLDAU12

XLNC_AM1: cpl a
inc a
setb soMu1am
jmp XLNC_LUU_SM

XLNC_KO_NHAN: mov r0,#so1
mov r1,#so2
call xdSoLon
jnc XLNC_CHIA_SO1_LON_BANG
inc soMu2
XLNC_CHIA_SO1_LON_BANG:
call truSoMu12
jb acc.7,XLNC_CHIA_SMAM
clr soMu1am
XLNC_CHIA_SMAM_LUU: mov soMu1,a
mov r0,#cuoiSo1
mov r1,#cuoiSo2
call chia
mov r0,#so1
mov r1,#thuong
call chuyenSo

XLNC_XLDAU12: mov c,so1am
mov acc.0,c
mov c,so2am
mov acc.1,c
call soSanhDau
jc XLNC_CUNG_DAU
setb so1am
ret

XLNC_CUNG_DAU: clr so1am
ret

XLNC_CHIA_SMAM: setb soMu1am
cpl a
inc a
jmp XLNC_CHIA_SMAM_LUU

XLNC_TACH23: call tachSo2
call tachSo3
call danhDau23

mov r0,#cuoiSo2 ;luu kq vao @r0
mov r1,#cuoiSo3
mov a,phepTinh2
cjne a,#mpNhan,XLNC_KO_NHAN23
call congSoMu23
call nhan
jmp XLNC_XLDAU23

XLNC_KO_NHAN23: mov r0,#so2
mov r1,#so3
call xdSoLon
jnc XLNC_CHIA23_SO2_LON_BANG
inc soMu3

XLNC_CHIA23_SO2_LON_BANG:
call truSoMu23
jb acc.7,XLNC_CHIA23_SMAM
clr soMu2am
XLNC_CHIA23_SMAM_LUU:
mov soMu2,a
mov r0,#cuoiSo2
mov r1,#cuoiSo3
call chia
mov r0,#so2
mov r1,#thuong
call chuyenSo

XLNC_XLDAU23: mov c,so2am
mov acc.0,c
mov c,so3am
mov acc.1,c
call soSanhDau
jc XLNC_CUNG_DAU23
setb so2am
ret

XLNC_CUNG_DAU23: clr so2am
ret

XLNC_CHIA23_SMAM: setb soMu2am
cpl a
inc a
jmp XLNC_CHIA23_SMAM_LUU
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xuLyCongTru: call tachSo1
call tachSo2
call canBangSo

mov a,phepTinh1
cjne a,#mpTru,XLCT_KO_TRU
cpl so2am

XLCT_KO_TRU: mov c,so1am
mov acc.0,c
mov c,so2am
mov acc.1,c
call soSanhDau
jc XLCT_CUNG_DAU

;call canBangSo
mov r0,#so1
mov r1,#so2
call xdSoLon
cjne a,#2,XLCT_SO2_KO_LON_HON

mov c,so2am
mov so1am,c
mov r1,#cuoiSo2
mov r0,#cuoiSo1
call tru
ret

XLCT_SO2_KO_LON_HON: mov r1,#cuoiSo1
mov r0,#cuoiSo2
call tru ;r0->so nho hon ;luu ket qua vao @r0
mov r1,#so2
mov r0,#so1
call chuyenSo
ret

XLCT_CUNG_DAU: call cong
ret

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xdSoLon: mov a,@r0
cjne a,#rong,XDSL_TIEP
clr a ;hai so bang nhau
clr c
ret

XDSL_TIEP: mov 3,@r1
cjne a,3,XDSL_KHAC
inc r0
inc r1
jmp xdSoLon

XDSL_KHAC: jc XDSL_SO1_BE
mov a,#1 ;so1 lon hon
clr c
ret

XDSL_SO1_BE: mov a,#2 ;so2 lon hon
setb c
ret

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
chuyenLcdx2so1:

; mov dptr,#lcdx
; movx a,@dptr
; cjne a,#mpDau,CL2S1_KO_AM
; setb so1am
; inc dptr

; CL2S1_KO_AM: movx a,@dptr
; cjne a,#mp10mu,CL2S1_KO_10MU

call tachSo1
ret

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
danhDau1: mov dptr,#lcdx
DD1_TIEP: mov a,#so1roi
movx @dptr,a
inc dptr
mov a,dpl
cjne a,viTriPhepTinh1,DD1_TIEP
mov a,#so1roi
movx @dptr,a
ret

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
danhDau12: mov r0,#low(lcdx)
DD12_TIEP: mov a,#so1roi
movx @r0,a
inc r0
mov a,r0
cjne a,viTriPhepTinh1,DD12_TIEP

DD12_TIEP2: mov a,#so1roi
movx @r0,a
inc r0
movx a,@r0
mov b,a
mov dptr,#MP_SO_PHAY_DAU_10MU
call kTraLoaiMaPhim
jc DD12_TIEP2
ret

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
danhDau23: mov r0,viTriPhepTinh2
DD23_TIEP: mov a,#so2roi
movx @r0,a
dec r0
movx a,@r0
mov b,a
mov dptr,#MP_SO_PHAY_DAU_10MU
call kTraLoaiMaPhim
jc DD23_TIEP

mov r0,viTriPhepTinh2
DD23_TIEP2: mov a,#so2roi
movx @r0,a
inc r0
movx a,@r0
mov b,a
mov dptr,#MP_SO_PHAY_DAU_10MU
call kTraLoaiMaPhim
jc DD23_TIEP2
ret

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
congSoMu12: mov a,soMu1
jb soMu1am,CSM12_1AM
CSM12_TIEP: mov r3,a

mov a,soMu2
jb soMu2am,CSM12_2AM
CSM12_TRO_VE: add a,r3
ret

CSM12_1AM: cpl a
inc a
jmp CSM12_TIEP

CSM12_2AM: cpl a
inc a
jmp CSM12_TRO_VE

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
truSoMu12: mov a,soMu1
jb soMu1am,TSM12_1AM
TSM12_TIEP: mov r3,a

mov a,soMu2
jnb soMu2am,TSM12_2DUONG
TSM12_TRO_VE: add a,r3
ret

TSM12_1AM: cpl a
inc a
jmp TSM12_TIEP

TSM12_2DUONG: cpl a
inc a
jmp TSM12_TRO_VE

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
congSoMu23: mov a,soMu2
jb soMu2am,CSM23_1AM
CSM23_TIEP: mov r3,a

mov a,soMu3
jb soMu3am,CSM23_2AM
CSM23_TRO_VE: add a,r3
ret

CSM23_1AM: cpl a
inc a
jmp CSM23_TIEP

CSM23_2AM: cpl a
inc a
jmp CSM23_TRO_VE

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
truSoMu23: mov a,soMu2
jb soMu2am,TSM23_1AM
TSM23_TIEP: mov r3,a

mov a,soMu3
jb soMu3am,TSM23_2AM
TSM23_TRO_VE: add a,r3
ret

TSM23_1AM: cpl a
inc a
jmp TSM23_TIEP

TSM23_2AM: cpl a
inc a
jmp TSM23_TRO_VE

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
luuKqx: mov dptr,#kqx
mov r1,#kq
LKQX_TIEP: mov a,@r1
movx @dptr,a
inc r1
inc dptr
cjne @r1,#rong,LKQX_TIEP
ret

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
$ic (tachSo.asm)
$ic (cong.asm)
$ic (tru.asm)
$ic (nhan.asm)
$ic (chia.asm)
$ic (can2.asm)

;---------------------------------- PHẦN 19 TÁCH SỐ -----------------------------------------
tachSo1: mov dcRamCao,#high(lcdx)
mov r7,#low(lcdx)
mov r6,#so1
call tachSo
mov c,soXam
mov so1am,c
mov c,soMuAm
mov soMu1Am,c
mov soMu1,soMu
ret

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
tachSo2: mov r0,#low(lcdx)
call timDauSo
mov 7,r0
mov r6,#so2
call tachSo
mov c,soXam
mov so2am,c
mov c,soMuAm
mov soMu2Am,c
mov soMu2,soMu
ret

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
tachSo3: mov r0,viTriPhepTinh1
call timDauSo
mov 7,r0
mov r6,#so3
call tachSo
mov c,soXam
mov so3am,c
mov c,soMuAm
mov soMu3Am,c
mov soMu3,soMu
ret

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
tachSo: mov r2,#maxSo
mov 0,r6
clr a
call setSo

mov 0,r7
movx a,@r0
cjne a,#mpCan2,TS_KO_CAN2
inc r7
mov 0,r7
movx a,@r0
;jmp TS_KO_K

TS_KO_CAN2: cjne a,#mpK,TS_KO_K
mov dptr,#kqx
mov 0,r6

TS_CHUYEN: movx a,@dptr
mov @r0,a
inc dptr
inc r0
cjne @r0,#rong,TS_CHUYEN

mov c,kqAm
mov soXam,c
mov c,soMuKqAm
mov soMuAm,c
mov soMu,soMuKq
ret

TS_KO_K: cjne a,#mpDau,TS_KO_DAU
setb soXam
TS_KO_DAU: call timA0
jc TS_CO_A0
ret

TS_CO_A0: call xdSoMu
jc TS_SO_QUA_BE
jb ol,TS_SO_QUA_BE
call ghiAi
TS_SO_QUA_BE: ret

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
timA0: mov 0,r7
movx a,@r0
cjne a,#mp10mu,TA0_KO_10MU
mov viTriA0,#-1
setb c
ret

TA0_KO_10MU: mov dptr,#MP_SO_KHAC_0
movx a,@r0
mov b,a
call kTraLoaiMaPhim
jnc TA0_KO_PHIM_SO_KHAC_0
mov viTriA0,r0
setb c
ret

TA0_KO_PHIM_SO_KHAC_0:
mov dptr,#MP_0_PHAY_DAU
movx a,@r0
mov b,a
call kTraLoaiMaPhim
jc TA0_0_PHAY_DAU
clr c
ret

TA0_0_PHAY_DAU: inc r0
jmp TA0_KO_10MU

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xdSoMu: mov a,viTriA0
cjne a,#-1,XDSM_KHAC_AM_1
mov soMu,#0
jmp XDSM_TIM_10MU

XDSM_KHAC_AM_1: call timViTriDauPhay
mov a,viTriA0
cjne a,0,$+3
jc XDSM_VTA0_BE
jmp XDSM_TRU

XDSM_VTA0_BE: inc a
XDSM_TRU: xch a,r0
clr c
subb a,r0
mov soMu,a

XDSM_TIM_10MU: call timSoMu10mu
add a,soMu

jb acc.7,XDSM_AM
clr soMuAm
cjne a,#100,$+3
jc XDSM_SOMU_BE_100
setb ol
ret

XDSM_SOMU_BE_100: mov soMu,a
clr c
ret

XDSM_AM: setb soMuAm
cpl a
inc a ;a=-a
cjne a,#100,$+3
jc XDSM_SOMU_AM_BE_100
setb c ;so mu <-99
ret

XDSM_SOMU_AM_BE_100: mov soMu,a
clr c
ret

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
timViTriDauPhay: mov 0,r7
dec r0
TVTDP_BDAU: inc r0
movx a,@r0
cjne a,#mpPhay,TVTDP_KHAC_PHAY
ret

TVTDP_KHAC_PHAY: mov dptr,#MP_SO_DAU
mov b,a
call kTraLoaiMaPhim
jc TVTDP_BDAU
ret

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
timSoMu10mu: mov 0,r7
dec r0
TSM10M_BDAU: inc r0
movx a,@r0
cjne a,#mp10mu,TSM10M_KO_10MU
inc r0
clr nho
movx a,@r0
cjne a,#mpDau,TSM10M_KO_DAU
inc r0
setb nho
TSM10M_KO_DAU: mov dptr,#MAPHIM_BCD
movx a,@r0
movc a,@a+dptr
mov r3,a
inc r0

mov dptr,#MP_SO
movx a,@r0
mov b,a
call kTraLoaiMaPhim
jnc TSM10M_KO_SO
mov dptr,#MAPHIM_BCD
movx a,@r0
movc a,@a+dptr
mov r4,a

mov a,r3
mov b,#10
mul ab
add a,r4

TSM10M_KTRA_NHO: jnb nho,TSM10M_DUONG
cpl a
inc a ;a=-a
TSM10M_DUONG: ret

TSM10M_KO_SO: mov a,r3
jmp TSM10M_KTRA_NHO

TSM10M_KO_10MU: mov dptr,#MP_SO_PHAY_DAU
mov b,a
call kTraLoaiMaPhim
jc TSM10M_BDAU
clr a
ret

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
ghiAi: mov r1,viTriA0
mov 0,r6
cjne r1,#-1,GAI_KO_AM_1A
mov @r0,#1
ret

GAI_KO_AM_1A: mov r2,#maxSo
GAI_KO_AM_1: mov dptr,#MAPHIM_BCD
movx a,@r1
movc a,@a+dptr
mov @r0,a
djnz r2,GAI_TANG_TRO
ret

GAI_TANG_TRO: inc r0
inc r1

mov dptr,#MP_SO
movx a,@r1
mov b,a
call kTraLoaiMaPhim
jc GAI_KO_AM_1

movx a,@r1
cjne a,#mpPhay,GAI_KO_PHAY
dec r0
jmp GAI_TANG_TRO

GAI_KO_PHAY: ret

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
timDauSo: inc r0
movx a,@r0
cjne a,#rong,TDS_KO_RONG
ret

TDS_KO_RONG: mov dptr,#MP_SO_PHAY_DAU_10MU
mov b,a
call kTraLoaiMaPhim
jc timDauSo

inc r0
ret

;---------------------------------- PHẦN 20 CỘNG -----------------------------------------
cong: ;call canBangSo
; clr nho
mov r2,#maxSo
mov r1,#cuoiSo2
mov r0,#cuoiSo1

; CONG_TIEP: mov a,@r1
; mov c,nho
; addc a,@r0
; cjne a,#10,$+3
; jc CONG_A_BE10
; clr c
; subb a,#10
; setb nho
; CONG_LUU: mov @r0,a
; dec r0
; dec r1
; djnz r2,CONG_TIEP
call congz
jb nho,CONG_VUOT
ret

CONG_VUOT: jb soMu1am,CONG_SM1_AM
mov a,soMu1
cjne a,#99,$+3
jc CONG_KO_TRAN ;soMu1<99
setb ol
ret

CONG_SM1_AM:
CONG_KO_TRAN: mov a,#1
mov r0,#cuoiSo1
call dichPhaiSo
mov r0,#so1
mov @r0,#1
inc soMu1
ret

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
canBangSo: mov a,soMu1
mov c,soMu1am
mov nho,c
call cong99
mov r3,a

mov a,soMu2
mov c,soMu2am
mov nho,c
call cong99
mov r4,a


mov a,r3
cjne a,4,CBS_SM1_KHAC
ret

CBS_SM1_KHAC: jc CBS_SM1_BE
clr c ;soMu1 lon hon soMu2
subb a,r4
mov r0,#cuoiSo2
call dichPhaiSo
ret

CBS_SM1_BE: mov a,r4
clr c
subb a,r3
mov r0,#cuoiSo1
call dichPhaiSo
mov soMu1,soMu2
mov c,soMu2am
mov soMu1am,c
ret

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
cong99: jb nho,CONG99_AM
add a,#99
ret

CONG99_AM: mov b,#99
xch a,b
clr c
subb a,b
ret

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
dichPhaiSo: cjne a,#maxSo,$+3
jc DPS_TDAT
DPS_XOA: mov @r0,#0
dec r0
cjne @r0,#rong,DPS_XOA
ret

DPS_TDAT: mov r1,a
mov a,r0
clr c
subb a,r1
mov r1,a ;r1=r0-a

DPS_BDAU: cjne @r1,#rong,DPS_DICH
jmp DPS_XOA

DPS_DICH: mov a,@r1
mov @r0,a
dec r0
dec r1
jmp DPS_BDAU

;---------------------------------- PHẦN 21 TRỪ -----------------------------------------
tru: clr nho
mov r2,#maxSo

TRU_TIEP: mov a,@r1
mov c,nho
subb a,@r0
jc TRU_CO_NHO
clr nho

TRU_LUU: mov @r0,a
dec r0
dec r1
djnz r2,TRU_TIEP
ret

TRU_CO_NHO: add a,#10
setb nho
jmp TRU_LUU

;---------------------------------- PHẦN 22 NHÂN -----------------------------------------
nhan: push acc
mov 6,r0 ;so thu 1
mov 7,r1 ;so thu 2
call nhanAi
pop acc

mov r0,#tich
cjne @r0,#0,NHAN_KHAC_0

NHAN_TIEP: jb acc.7,NHAN_SM_AM
cjne a,#100,$+3
jc NHAN_KO_TRAN
setb ol
ret

NHAN_KHAC_0: inc a
jmp NHAN_TIEP
NHAN_SM_AM:
NHAN_KO_TRAN: ret

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
nhanAi: mov r5,#0 ;chi so
clr a
mov r0,#tich
mov r2,#2*maxSo
call setSo

NHANAI_BDAU: mov 3,@r1
push 1
call nhan1chuSo

mov r1,#phu
mov a,r5
call dichTraiAbuoc

mov r0,#cuoiTich
mov r1,#cuoiPhu
call congz

inc r5
pop 1
dec r1
cjne @r1,#rong,NHANAI_BDAU
ret

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
nhan1chuSo: clr a
mov r0,#phu
mov r2,#20
call setSo
cjne r3,#0,N1CS_BDAU
ret

N1CS_BDAU: mov r1,#cuoiPhu
mov r4,#0
mov 0,r6

N1CS_KTRA: mov a,@r0
cjne a,#rong,N1CS_TIEP
mov @r1,4
ret

N1CS_TIEP: mov b,r3
mul ab
add a,r4
mov b,#10
div ab
mov r4,a
mov @r1,b
dec r1
dec r0
jmp N1CS_KTRA

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
dichTraiAbuoc: jnz DTAB_BDAU
ret

DTAB_BDAU: cjne @r1,#0,DTAB_KO_0
inc r1
jmp DTAB_BDAU

DTAB_KO_0: cjne @r1,#rong,DTAB_KO_RONG
ret

DTAB_KO_RONG: clr c
subb a,r1
cpl a
inc a
mov r0,a

DTAB_TIEP: mov a,@r1
mov @r0,a
inc r0
inc r1
cjne @r1,#rong,DTAB_TIEP

DTAB_ZERO: mov @r0,#0
inc r0
cjne @r0,#rong,DTAB_ZERO
ret

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
congz: clr nho
CONGZ_TIEP: mov a,@r1
mov c,nho
addc a,@r0
cjne a,#10,$+3
jc CONGZ_A_BE10
clr c
subb a,#10
setb nho
CONGZ_LUU: mov @r0,a
dec r0
dec r1
cjne @r0,#rong,CONGZ_TIEP
ret

CONGZ_A_BE10: clr nho
jmp CONGZ_LUU

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
tich2so: mov r1,#tich
T2S_KTRA0: cjne @r1,#0,T2S_KHAC_0
inc r1
jmp T2S_KTRA0

T2S_TIEP:
T2S_KHAC_0: cjne @r1,#rong,T2S_KO_RONG
ret

T2S_KO_RONG: mov a,@r1
mov @r0,a
inc r0
inc r1
cjne @r0,#rong,T2S_TIEP

;---------------------------------- PHẦN 23 CHIA -----------------------------------------
chia: mov 6,r0
mov 7,r1
mov a,r1
clr c
subb a,#maxSo
inc a
mov r1,a
cjne @r1,#0,CHIA_BDAU
setb chia0
ret

CHIA_BDAU: mov 1,r7
call chiaAi
ret

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
chiaAi: clr bool
mov r5,#0
mov r0,#thuong
mov r2,#maxSo
call clrSo

mov r0,#phu
mov r2,#2*maxSo
call clrSo
mov r0,#cuoiPhu
mov 1,r6
CHIAAI_CHUYEN: call mov10dec
cjne @r1,#rong,CHIAAI_CHUYEN

mov r0,#so2mr
mov r2,#2*maxSo
call clrSo
mov r0,#cuoiSo2mr
mov 1,r7
CHIAAI_CHUYEN2: call mov10dec
cjne @r1,#rong,CHIAAI_CHUYEN2

CHIAAI_KTRA: mov r0,#phu
mov r1,#so2mr
call xdSoLon
cjne a,#2,CHIAAI_SO2_NHO_BANG
mov a,#1
mov r1,#phu
call dichTraiAbuoc
jnb bool,CHIAAI_KO_ZERO
mov a,r5
add a,#thuong
mov r0,a
mov @r0,#0
inc r5
cjne r5,#maxSo,CHIAAI_KO_ZERO
ret
CHIAAI_KO_ZERO:
setb bool
jmp CHIAAI_KTRA

CHIAAI_SO2_NHO_BANG: mov r4,#0
CHIAAI_SO2_NHO_BANG1:
mov r1,#cuoiPhu
mov r0,#cuoiSo2mr
;push 4
call truz
;pop 4
inc r4
mov r0,#phu
mov r1,#so2mr
call xdSoLon
cjne a,#2,CHIAAI_SO2_NHO_BANG1
mov a,r5
add a,#thuong
mov r0,a
mov @r0,4
inc r5
clr bool
cjne r5,#10,CHIAAI_KTRA
ret

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
truz: clr nho
TRUZ_TIEP: mov a,@r1
mov c,nho
subb a,@r0
jc TRUZ_CO_NHO
clr nho
TRUZ_LUU: mov @r1,a
dec r0
dec r1
cjne @r0,#rong,TRUZ_TIEP
ret

TRUZ_CO_NHO: add a,#10
setb nho
jmp TRUZ_LUU
;---------------------------------- PHẦN 24 HT DÒNG 2 -----------------------------------------
htDong2: mov a,#dauDong2
call xoaVeDauDong
jnb can2am,HTD2_KO_CAN2AM
mov dptr,#TB_CAN2AM
call thongBao
jmp HTD2_TROVE

HTD2_KO_CAN2AM: jnb ol,HTD2_KO_TRAN
mov dptr,#TB_TRAN_SO
call thongBao
jmp HTD2_TROVE

HTD2_KO_TRAN: jnb chia0,HTD2_KO_CHIA0
mov dptr,#TB_CHIA0
call thongBao
jmp HTD2_TROVE

HTD2_KO_CHIA0: jb soMuKqAm,HTD2_SOMUKQAM
mov a,soMuKq ;so mu kq duong
cjne a,#10,$+3
jc HTD2_XUAT_TAT_CA
call xuatMuLon9

HTD2_SOMUKQAM: mov a,soMuKq
cjne a,#10,$+3
jc HTD2_XUAT_TAT_CA_SMKQAM
call xuatMuLon9 ;so mu kq am nho hon 9
jmp HTD2_TROVE

HTD2_XUAT_TAT_CA_SMKQAM:
call xuatMuLonAm10

HTD2_TROVE: call htDong1
ret

HTD2_XUAT_TAT_CA: call xuatMuBe10
jmp HTD2_TROVE

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xuatMuLonAm10: mov r0,#kq
cjne @r0,#0,XMLA10_BDAU
mov a,#cuoiDong2
call lenh
mov a,#'0'
call duLieu
ret

XMLA10_BDAU: call soSoYnghia
add a,soMuKq
;inc a
mov r7,#10
call minAr7
mov a,#cuoiDong2
clr c
subb a,r7
jnb kqAm,XMLA10_KQ_DUONG
call themDauAm

XMLA10_KQ_DUONG: call lenh
mov a,#'0'
call duLieu
mov a,#','
call duLieu

mov a,soMuKq
dec a
jz XMLA10_XUAT_SO_CO_NGHIA
mov r2,a
XMLA10_XUAT_0: mov a,#'0'
call duLieu
djnz r2,XMLA10_XUAT_0

XMLA10_XUAT_SO_CO_NGHIA:
mov a,r7 ;so cot-1
clr c
subb a,soMuKq
mov r2,a

XMLA10_XUAT_SCN: mov a,@r0
add a,#'0'
call duLieu
inc r0
djnz r2,XMLA10_XUAT_SCN

ret

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xuatMuBe10: mov r0,#kq
cjne @r0,#0,XMB10_BDAU
mov a,#cuoiDong2
call lenh
mov a,#'0'
call duLieu
ret

XMB10_BDAU: mov r3,soMuKq
inc r3
inc r3
mov r0,#kq
call soSoYnghia
mov r4,a
cjne a,3,$+3
jc XMB10_NGUYEN
setb nho
mov a,#cuoiDong2
clr c
subb a,r4
jmp XMB10_KTRA_AM

XMB10_NGUYEN: clr nho
mov a,#cuoiDong2
clr c
subb a,soMuKq
XMB10_KTRA_AM: jnb kqAm,XMB10_DUONG
call themDauAm
XMB10_DUONG: call lenh
mov r2,soMuKq
inc r2
XMB10_TIEP: mov a,@r0
add a,#'0'
call duLieu
inc r0
djnz r2,XMB10_TIEP

jb nho,XMB10_XUAT_PHANTP
ret

XMB10_XUAT_PHANTP: mov a,#','
call duLieu
clr nho
mov a,r4
setb c
subb a,soMuKq
mov r2,a
jmp XMB10_TIEP
ret
; XMB10_BDAU: mov r2,soMuKq
; inc r2
; call soSoYnghia
; mov r3,a
; mov 4,r2
; inc r4
; cjne a,4,$+3
; jnc XMB10_CO_PHANTP
; clr nho
; mov a,#cuoiDong2
; jmp XMB10_TRU

; XMB10_CO_PHANTP: setb nho
; mov a,#cuoiDong2-2
; XMB10_TRU: clr c
; subb a,soMuKq

; XMB10_KTRA_AM: jnb kqAm,XMB10_KQ_DUONG
; call themDauAm

; XMB10_KQ_DUONG: call lenh

; XMB10_TIEP: mov a,@r0
; add a,#'0'
; call duLieu
; inc r0
; djnz r2,XMB10_TIEP
; jb nho,XMB10_XUATTP
; ret

; XMB10_XUATTP: mov a,#','
; call duLieu
; mov a,r3
; setb c
; subb a,soMuKq
; mov r2,a
; clr nho
; jmp XMB10_TIEP

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
soSoYnghia: mov a,r0
add a,#10
mov r1,a
SSYN_KTRA: mov dptr,#MP_0_RONG
mov b,@r1
call kTraLoaiMaPhim
jc SSYN_TIEP
mov a,r1
clr c
subb a,r0
inc a
ret

SSYN_TIEP: dec r1
jmp SSYN_KTRA

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xuatMuLon9: mov r0,#kq
cjne @r0,#0,XML9_BDAU
mov a,#cuoiDong2
call lenh
mov a,#'0'
call duLieu
ret

XML9_BDAU: call soSoYnghia
mov r4,a
cjne a,#1,XML9_CO_PHANTP
clr nho
mov a,#cuoiDong2-2
jmp XML9_TRU

XML9_CO_PHANTP: setb nho
mov a,#cuoiDong2-2
clr c
subb a,r4

XML9_TRU: mov r3,soMuKq
cjne r3,#10,$+3
jc XML9_SMKQ_BE10
dec a
XML9_SMKQ_BE10: dec a

jnb kqAm,XML9_KQ_DUONG
call themDauAm
XML9_KQ_DUONG: call lenh
mov r2,#1
XML9_TIEP: mov a,@r0
add a,#'0'
call duLieu
inc r0
djnz r2,XML9_TIEP

jb nho,XML9_XUAT_PHANTP
call xuatSoMuKq
ret

XML9_XUAT_PHANTP: mov a,#','
call duLieu
clr nho
mov 2,r4
dec r2
jmp XML9_TIEP

; XML9_BDAU: mov r2,#1
; mov r0,#kq
; call soSoYnghia
; cjne a,#1,XML9_CO_PHANTP
; clr nho
; add a,#cuoiDong2-3
; jmp XML9_1

; XML9_CO_PHANTP: setb nho
; cpl a
; inc a ;a=-a
; add a,#cuoiDong2-2
; XML9_1: ;add a,#dauDong2+12
; mov r3,soMuKq
; cjne r3,#10,$+3
; jc XML9_SMKQ_BE10
; clr c
; subb a,#2
; jmp XML9_KTRA_AM

; XML9_SMKQ_BE10: dec a
; XML9_KTRA_AM: jnb kqAm,XML9_KQ_DUONG
; call themDauAm
; XML9_KQ_DUONG: call lenh
; XML9_TIEP: mov a,@r0
; add a,#'0'
; call duLieu
; inc r0
; djnz r2,XML9_TIEP
; jb nho,XML9_XUAT_PHANTP
; call xuatSoMuKq
; ret

; XML9_XUAT_PHANTP: mov a,#','
; call duLieu
; push 0
; mov r0,#kq
; call soSoYnghia
; pop 0
inc r0
; dec a
; mov r2,a
; clr nho
; jmp XML9_TIEP

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
themDauAm: push acc
dec a
call lenh
mov a,#kyTuDau
call duLieu
pop acc
ret

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xuatsoMuKq: jb soMuKqAm,XSMKQ_AM
mov dptr,#CHUOI_10MU
XSMKQ_XUAT: call chuoiDuLieu
mov a,soMuKq
mov b,#10
div ab
add a,#'0'
call duLieu
mov a,b
add a,#'0'
call duLieu
ret

XSMKQ_AM: mov dptr,#CHUOI_10MU_AM
jmp XSMKQ_XUAT
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
; xuatCanhPhai: mov r0,#kq
; mov r2,soMuKq
; inc r2
; mov a,#dauDong2+15
; clr c
; subb a,soMuKq
; jnb kqAm,XCP_KQ_DUONG
; dec a
; call lenh
; mov a,kyTuDau
; call duLieu
; inc a

; XCP_KQ_DUONG: call lenh
; cjne @r0,#0,XCP_TIEP
; mov a,#'0'
; call duLieu
; ret

; XCP_TIEP: mov a,@r0
; add a,#30h ;bcd 2 ascii
; call duLieu
; inc r0
; djnz r2,XCP_TIEP
; ret

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
chuoiDuLieu:
thongBao: clr a
movc a,@a+dptr
cjne a,#het,TB_XUAT
ret

TB_XUAT: call duLieu
inc dptr
jmp thongBao
;_______________________________________________________________________________________
END
June 2012
M T W T F S S
May 2012July 2012
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30