Bài giảng Vi xử lý - Chương 3: Họ vi điều khiển 8051 (Phần 2) - Bùi Minh Thành
Nội dung
3.4.1 Các lệnh số học
3.4.2 Các lệnh luận lý
3.4.3 Các lệnh chuyển dữ liệu
3.4.4 Các lệnh với biến Boole
3.4.5 Các lệnh rẽ nhánh chương trình
3.4.6 Một số thí dụ
,@DPTR ;data memory • MOVX @Ri,A • MOVX @DPTR,A • PUSH direct • POP direct • XCH A,source ;exchange bytes • XCHD A,@Ri ;exchange low- order digits 38 What are A & B after prog? MOV 0F0H,#12H ;B=12H MOV R0,#0F0H ; MOV A,#34H ;A=34H XCH A,0F0H ;A=12H, B=34H XCHD A,@R0 ;A=14H, B=32H 39 Read 10F4H & 10F5H into R6,R7 MOV DPTR,#10F4H MOVX A,@DPTR MOV R6,A INC DPTR MOVX A,@DPTR MOV R7,A 40 Chuỗi lệnh trên chiếm 9 byte và thực thi trong 5 µs 41 Minh ha v tác đng ca PUSH và POP • Sau khi reset hệ thống thì SP=07H. • Có 3 cách để truy cập: PUSH (cất vào ngăn xếp), POP (lấy ra khỏi ngăn xếp) và CALL (chuyển điều khiển chương trình và quay về [RET, RETI]). • Để cất thông tin vào ngăn xếp, ta sử dụng lệnh PUSH. Khi đó các bước sau xảy ra 1. SP được tăng thêm 1. 2. Thông tin được đặt vào địa chỉ được trỏ bởi SP. • Để lấy thông tin ra khỏi ngăn xếp, ta sử dụng lệnh POP. Khi đó các bước sau xảy ra 1. SP được giảm đi 1. 2. Thông tin có địa chỉ được trỏ bởi SP được lấy ra. 42 Thí dụ về PUSH và POP MOV R6,#25h MOV R1,#12h MOV R4,#0F3h PUSH 6 PUSH 1 PUSH 4 POP 3 ; lấy từ stack chép vào R3 POP 5 ; lấy từ stack chép vào R5 POP 2 ; lấy từ stack chép vào R2 43 Ảnh hưởng của các lệnh PUSH với ngăn xếp 44 Ảnh hưởng của các lệnh POP với ngăn xếp 45 Chú ý về stack trong 8051 • Ngăn xếp trong 8051 tăng trưởng theo hướng địa chỉ tăng (08H, 09H, ...) • Ngăn xếp chiếm cùng vị trí với băng thanh ghi 1, do đó khi sử dụng ngăn xếp phải cẩn thận khi sử dụng băng thanh ghi 1 (không thể sử dụng được lúc này). Tuy nhiên ta có thể giải quyết vấn đề này bằng cách ghi lại trị bắt đầu mới cho SP (các trị từ 30H đến 7FH). • Khi ngăn xếp tăng trưởng có khả năng lọt vào vùng có địa chỉ bit (từ byte có địa chỉ 30H). 46 Look-up Tables MOV A,#ENTRY CALL LOOK_UP . . LOOK_UP: INC A MOVC A,@A+PC RET TABLE: DB data,data,data,... 47 Thí dụ: Đọc một số X từ Port 1 và xuất giá trị X2 ra Port 2 ORG 0 ; assembler directive MOV DPTR, #LUT ; 300H là địa chỉ đầu bảng MOV A, #0FFH MOV P1, A ; Lập trình cổng P1 để nhập dữ liệu Again: MOV A, P1 ; Đọc X MOVC A, @A+DPTR ; Lấy X2 bằng tra bảng MOV P2, A ; Xuất X2 ra P2 SJMP Again ; Lặp lại mãi mãi đoạn Again đến SJMP ORG 300H ; Bảng tra bắt đầu ở 0300H LUT: DB 0, 1, 4, 9, 16, 25, 36, 49, 64, 81 DB 100, 121, 144, 169, 196, 225 ; LUT=Look-Up Table=Bảng tra cứu 48 EXAMPLE Write the 8051 instruction to perform the following operations. (a) Move the contents of the accumulator to register 5. (b) Move the contents of RAM memory location 42H to port 1. (c) Move the value at port 2 to register 3. (d) Send FFH to port 0. (e) Send the contents of RAM memory, whose address is in register 1, to port 3 Solution: (a) MOV R5, A (b) MOV P1, 42H (c) MOV R3, P2 (d) MOV P0, #0FFH (e) MOV P3, @R1 49 TD: Đảo ngược các bit của A MOV R7,#8 Loop: RLC A XCH A,0F0H RRC A XCH A,0F0H DJNZ R7,LOOP XCH A,0F0H 50 4. Tóm tắt các lệnh với biến Boole (giả sử 8051 với thạch anh 12 MHz) 51 Boolean Variable Manipulation • CLR C ;clear bit • CLR bit • SETB C ;set bit • SETB bit • CPL C ;complement bit • CPL bit • ANL C,bit ;AND bit with C • ANL C,/bit ;And NOT bit with C 52 Boolean Variable Manipulation • ORL C,bit ;OR bit with C • ORL C,/bit ;OR NOT bit with C • MOV C,bit ;move bit to bit • MOV bit,C • JC rel ;jump if C is set • JNC rel ;jump if C is not set • JB bit,rel ;jump if bit is set • JNB bit,rel ;jump if bit is not set • JBC bit,rel ;jump if set then clear 53 Phép toán XOR với biến Boole Chú ý là các lệnh với biến Boole bao gồm các phép toán ANL (logic AND) và ORL (logic OR), mà không có phép toán XRL (logic XOR). Tuy nhiên ta có thể thực hiện phép toán XOR bằng cách kết hợp các phép toán AND, OR, NOT hoặc sử dụng cách sau (thí dụ muốn thực hiện BIT1 ⊕ BIT2) MOV C, BIT1 JNB BIT2, SKIP CPL C SKIP: (tiếp tục) Trước hết BIT1 được chuyển vào cờ nhớ. Nếu BIT2 = 0 thì C chứa kết quả đúng; nghĩa là BIT1 ⊕ BIT2 = BIT1 nếu BIT2 = 0. Nếu BIT2 = 1 thì C chứa phủ định của kết quả (vì BIT1 ⊕ BIT2 = NOT BIT1 nếu BIT2 = 1). 54 55 Thí dụ: Định trị một hàm Boole F = WX’Y + XY’Z’ Cách 1: W EQU P1.3 X EQU P1.2 Y EQU P1.1 Z EQU P1.0 F EQU P1.7 TMP EQU 00h ; bit 0 của ô nhớ 20H ORG 8000H MOV A, #0Fh Cách 2: Dùng các lệnh điều kiện W EQU P1.3 X EQU P1.2 Y EQU P1.1 Z EQU P1.0 F EQU P1.7 TMPEQU 00h ; bit 0 của ô nhớ 20H ORG 8000H MOV A, #0Fh MOV P1, A MOV P1, A BACK: MOV C, W ANL C, /X ANL C, Y MOV TMP, C MOV C, X ANL C, /Y ANL C, /Z ORL C, TMP MOV F, C SJMP BACK BACK: JNB W, CAL2 JNB W, CAL2 JB X, CAL2 JB Y, SETIT CAL2: JNB X, CLEAR JB Y, CLEAR JB Z, CLEAR SETIT: SETB F SJMP BACK CLEAR: CLR F SJMP BACK 56 Tóm tắt các lệnh rẽ nhánh không điều kiện (giả sử 8051 với thạch anh 12 MHz) 57 5. Tóm tắt các lệnh rẽ nhánh có điều kiện (giả sử 8051 với thạch anh 12 MHz) 58 Program Branching • ACALL addr11 ;call subroutine • LCALL addr16 • RET ;return from subroutine • RETI ;return from interrupt • AJMP addr11 ;absolute jump • LJMP addr16 ;long jump • SJMP rel ;short (relative) jump • JMP @A+DPTR • JZ rel ;jump if A = 0 59 Program Branching • JZ rel ;jump if A = 0 • JNZ rel ;jump if A not = 0 • CJNE A,direct,rel ;compare and • CJNE A,#data,rel ;rel jump if not ;equal • CJNE Rn,#data,rel • CJNE @Ri,#data,rel • DJNZ Rn,rel ;decrement & jump • DJNZ direct,rel ;if not zero • NOP ;no operation 60 Conditional jumps Mnemonic Description JZ Jump if a = 0 JNZ Jump if a != 0 JC Jump if C = 1 JNC Jump if C != 1 JB , Jump if bit = 1 JNB , Jump if bit != 1 JBC , Jump if bit =1, clear bit CJNE A, direct, Compare A and memory, jump if not equal 61 Conditional Jumps for Branching if condition is true goto label else goto next instruction condition true false label jz led_off setb C mov P1.6, C sjmp skipover clr C mov P1.6, C mov A, P0 led_off: skipover: if a = 0 is true send a 0 to LED else send a 1 to LED 62 EXAMPLE Write a program that continuously reads a byte from port 1 and writes it to port 0 until the byte read equals zero. Solution: READ: MOV A, P1 ; A ←P1 MOV P0, A ; P0←A JNZ READ ; Repeat until A = 0 NOP ; Remainder of program etc. 63 More Conditional Jumps Mnemonic Description CJNE A, #data Compare A and data, jump if not equal CJNE Rn, #data Compare Rn and data, jump if not equal CJNE @Rn, #data Compare Rn and memory, jump if not equal DJNZ Rn, Decrement Rn and then jump if not zero DJNZ direct, Decrement memory and then jump if not zero 64 EXAMPLE Repeat the previous example, except stop the looping when the number 77H is read Solution: READ: MOV A, P1 ; A ←P1 MOV P0, A ; P0←A CJNE A, #77, READ ; Repeat until A = 77H NOP ; Remainder of program etc. 65 EXAMPLE Repeat the previous example, except stop the looping when bit 3 of port 2 is set. Solution: READ: MOV A, P1 ; A ←P1 MOV P0, A ; P0←A JNB P2.3, READ ; Repeat until P2.3 = 1 NOP ; Remainder of program etc. 66 Iterative Loops For A = 0 to 4 do {} clr a For A = 4 to 0 do {} loop: ... inc a cjne a, #4, loop mov R0, #4 loop: ... ... djnz R0, loop 67 Execute Loop N Times MOV R7,#10 (SAY N=10) LOOP: (begin loop) . . (end loop) DJNZ R7,LOOP (continue) 68 EXAMPLE Write a program that will produce an output at port 0 that counts down from 80H to 00H. Solution: MOV R0, #80H ; R0 ←80H COUNT: MOV P0, R0 ; P0 ←R0 DJNZ R0, COUNT ; Decrement R0, jump to ; COUNT if not 0 NOP ; Remainder of program etc. 69 Jump Tables MOV DPTR, #JUMP_TABLE MOV A, #INDEX_NUMBER RL A JMP @A+DPTR JUMP_TABLE: AJMP CASE0 AJMP CASE1 AJMP CASE2 70 Compare & Jump • Compare two unsigned bytes: CJNE A,B,$+3 JNC BIG LE: . ;less than or . ;equal to BIG: . ;bigger than 71 Thí dụ: Đổi từ binary sang biểu diễn số qua ASCII Chương trình lấy một số trong ACC và cất biểu diễn ASCII của nó vào RAM nội ở địa chỉ trong R1. Thí dụ để chuyển 239 thành các ký tự ASCII ‘2’, ‘3’, ‘9’; trước hết lấy ký số đầu bằng cách chia cho 100 (được 2 và đổi thành ‘2’); lấy phần dư từ phép chia để có 39; lấy 39 chia 10 được 3 (và đổi thành ‘3’), và phần dư của phép chia này cho 9 (và đổi thành ‘9’). Bài giải. ORG 00h MOV A,#239 ; Nạp giá trị thử vào ACC MOV R1,#040h ; và địa chỉ đích vào R1 LCALL TODEC ; TODEC(239, 040h); MOV A,#17 ; Bây giờ thí dụ với 2 ký số MOV R1, #050h ; và địa chỉ đích ở R1 LCALL TODEC NOP ; thêm lệnh NOP này khi chạy mô phỏng 72 CT con TODEC ;=========================================================== ; Chương trình con này đổi 1 byte thành 3 ký tự ASCII có thể in được từ 000–255 ; Lấy số trong ACC và cất biểu diễn ASCII của nó trong RAM nội bắt đầu ở địa chỉ ; trong R1. TODEC: MOV B, #100 ; Lấy số chia để vào B DIV AB ; ACC = num/100 -> 2 , B = ACC % 100 -> 39 LCALL TOASCII ; đổi sang Ascii và cất trong bộ nhớ MOV A, B ; Lấy phần dư vào A (39) MOV B, #10 ; DIV AB ; ACC = 39 / 10 -> 3, phần dư = 39 % 10 -> 9 LCALL TOASCII ; Đổi và cất 3 MOV A, B ; Lấy giá trị cuối cùng đưa vào A LCALL TOASCII RET ; Thực hiện xong 73 CT con TOASCII ;=================================================== ; Đổi 1 số trong ACC thành một ký tự ASCII ; Cất nó vào ô nhớ có địa chỉ cho bởi R1 TOASCII: ADD A, #'0' ; đổi từ nhị phân sang ASCII ; cũng có thể sử dụng "ADD A,#030h” MOV @R1, A ; Cất vào bộ nhớ nội INC R1 ; Tăng con trỏ địa chỉ RET END 74 Thí dụ Thí dụ: Viết chương trình điền vào các ô nhớ từ 048H đến 057H với các giá trị 0, 2, 4 . . . 30 (0–1EH), đặt 0 vào ô nhớ 48H, 2 vào 49H, ... Bài giải. ORG 0 MOV R0, #048H ; Đặt địa chỉ của byte thứ nhất vào R0 MOV A, #0 ; Điền giá trị vào Acc LOOP: MOV @R0, A ; lưu trữ byte (tương tự C:- *R0 = A) CJNE A, #30, NEXT ; Lưu trữ giá trị sau cùng SJMP DONE NEXT: ADD A, #2 ; Tăng ACC thàh giá trị kế INC R0 ; Chỉ R0 đến byte kế SJMP LOOP ; Ghi giá trị kế DONE: NOP ; NOP không làm gì cả END 75
File đính kèm:
- bai_giang_vi_xu_ly_chuong_3_ho_vi_dieu_khien_8051_phan_2_bui.pdf