DUA DU LIEU GIATRICONG VAO THANH GHI TRUNG GIAN W

Một phần của tài liệu Giáo trình hợp ngữ - Lập trình PIC 16F877A (Trang 70 - 73)

. Lệnh trở về đầu dòng thứ nhất: mã lệnh

49:DUA DU LIEU GIATRICONG VAO THANH GHI TRUNG GIAN W

50: 51:

52: ; CHUONG TRINH CON DELAY 200MS 53: DELAY: 53: DELAY:

54:

0015 0000 NOP 55: nop 0016 0000 NOP 56: nop

0017 30B9 MOVLW 0xb9 57: movlw d'185 0018 00A0 MOVWF 0x20 58: movwf vong1 0019 3004 MOVLW 0x4 59: movlw d'4 001A 00A1 MOVWF 0x21 60: movwf vong2 001B 3002 MOVLW 0x2 61: movlw d'2 001C 00A2 MOVWF 0x22 62: movwf vong3 001D 0BA0 DECFSZ 0x20, F 63: decfsz vong1,f 001E 281D GOTO 0x1d 64: goto $-1

001F 0BA1 DECFSZ 0x21, F 65: decfsz vong2,f 0020 281D GOTO 0x1d 66: goto $-3

0021 0BA2 DECFSZ 0x22, F 67: decfsz vong3,f 0022 281D GOTO 0x1d 68: goto $-5 0023 0008 RETURN 69: return 70: 71: 72: ORG 0X100 73: BANGMA 0100 0782 ADDWF 0x2, F 74: ADDWF PCL,F 0101 34C0 RETLW 0xc0 75: RETLW 0XC0

0102 34F9 RETLW 0xf9 76: RETLW 0XF9 0103 34A4 RETLW 0xa4 77: RETLW 0XA4 0104 34B0 RETLW 0xb0 78: RETLW 0XB0 0105 3499 RETLW 0x99 79: RETLW 0X99 0106 3492 RETLW 0x92 80: RETLW 0X92 0107 3482 RETLW 0x82 81: RETLW 0X82 0108 34F8 RETLW 0xf8 82: RETLW 0XF8 0109 3480 RETLW 0x80 83: RETLW 0X80

010A 3490 RETLW 0x90 84: RETLW 0X90

85:

2007 3490 RETLW 0x90 86: end

Trước khi đi vào phân tích các khả năng có thể xảy ra, ta xem kĩ lại nguyên lý làm việc của thanh ghi PC.

Thanh ghi PC có độ dài 13 bit chia làm 2 thanh ghi PCL (tức 8 bit thấp của thanh ghi PC PC<7:0>) và PCH (5 bit cao của thanh ghi PC- PC<12-8>):

PCH PCL Bit 12 Bit 11 Bit 10 Bit 9 Bit 8 Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0

Trong đó thanh ghi PCL có thể đọc /ghi được

Thanh ghi PCH không thể đọc ghi được. Tuy nhiên có thể ghi được thơng qua thanh ghi PCLATH.

Nghĩa là 5 bit cao của thanh ghi PC, PC<12:8> có thể cập nhật được bằng cách viết vào 5 bit thấp của thanh ghi PCLATH.

Khi chương trình được reset lại từ đầu, các bit PC<12:8> được xóa về 0 Có điều chú ý là:

Nếu có lệnh can thiệp vào thanh ghi PCL thì lập tức các bit cao của thanh ghi PC sẽ được cập nhật từ thanh ghi PCLATH

Như vậy, các bit cao của thanh ghi PC được cập nhật khi xẩy ra 1 trong 2 điều kiện:

- Cập nhật PCL

- Cập nhật PCLATH

Ví dụ 1: khi thực hiện lệnh CALL nhãn

Nếu sau nhãn là lệnh ở địa chỉ k (0<k<2047) Lệnh trên được phân giải dưới dạng CALL k Khi thực hiện lệnh này:

11 bit cao của PC được cập nhật: PC<10:0> =k

Lập tức 2 bit còn lại của PC cũng được cập nhật qua PCLATH: PC<12:11>=PCLATH<4:3>

Ví dụ 2: khi thực hiện lệnh ADDWF PCL,F

Lập tức PCL=PCL+W

Do PCL được cập nhật nên các bit cao của PC cũng được cập nhật qua PCLATH: PCH=PC<12:8>=PCLATH<4:0>

Từ đây trở lại chương trình hiển thị led 7 đoạn sử dụng kĩ thuật bảng.

Để ý đoạn chương trình con BANGMA được khai báo sử dụng bộ nhớ từ địa chỉ 0x100 (ORG 0x100). Xét lệnh ở dòng 34 và 35:

000A 3009 MOVLW 0x9 34: movlw d'9 000B 2100 CALL 0x100 35: CALL BANGMA

Khi thực hiện lệnh ở dòng 34, W=9

Trước thực hiện lệnh ở dòng 35, PCL=PC<7:0>=0x0B, PCLATH=0x00, PCH=PC<12:8>=00000

Nhãn BANGMA ở địa chỉ 0x100

Như vậy lệnh trên phân giải như sau: CALL 0x100

Khi thực hiện lệnh này, 11 bit thấp của PC, PC<10:0>=0x100= 01 0000 0000 2 bit cao của PC, PC<12:11>=PCLATH<43>=00

Vậy PC= 0001 0000 0000=0x100

Một phần của tài liệu Giáo trình hợp ngữ - Lập trình PIC 16F877A (Trang 70 - 73)