Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 18 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
18
Dung lượng
339,82 KB
Nội dung
Bài 1: Làm quen với PIC16F84A A Mạch điện với PIC16F84A Bạn xem hình PIC16F84A có 18 chân: Khi nhìn vào ic này, Bạn xác định công chân Ở đây, chân cho nối masse để lấy dòng, chân 14 cho nối vào đường nguồn +5V Chân 15, 16 mắc gốm định tần, hay thạch anh Chân cho nối lên đường nguồn +5V để giữ chân mức áp cao PortA với chân 17 (RA0), 18 (RA1), 1(RA2), (RA3), (RA4) PortB với chân (RB0), (RB1), (RB2), (RB3), 10 (RB4), 11 (RB5), 12 (RB6), 13 (RB7) Khảo sát mạch cấp nguồn: Cấp cho mạch với đường nguồn +12V Mạch dùng IC ổn áp 7805, điện áp ngả 5V Mức áp cấp cho chân 14 PIC16F84A Chân số cho nối vào đường masse Tụ 100μF dùng để ổn áp, tụ 0.1μF dùng để lọc bỏ tín hiệu nhiễu tần số cao Khi dùng ic ổn áp 7805, chân cho nối masse, chân bên trái lấy điện chân bên phải đường nguồn ổn áp Mắc gồm định tần: Trong PIC16F84A có mạch dao động dùng để tạo xung nhịp, tần số xung nhịp lấy theo tần số thạch anh hay gốm định tần mắc chân 15 (OSC_IN), 16 (OSC_OUT) Tần số xung nhịp 10MHz/4 Chân MCLR (tác dụng mức áp thấp) hay chân RESET: Trong PIC16F84A có mạch điện Reset (còn gọi Master Clear) Mạch làm việc với chân nối lên mức áp thấp Trong mạch, 10K điện trở treo chân lên mức áp cao Khi Bạn muốn chương trình quay lại từ nhớ 0000h, nhấn nút Reset Đặt Led Cảng PortA PortB: Trong mạch, chân Anode Led cho nối vào đường nguồn +5V, điện trở 560 có tác dụng hạn dòng Với cách mắc này, Led cấp dòng ngả mức áp thấp (bit 0) Khi chân ngả mức áp cao (bit 1), Led tắt B Khảo sát tổ chức nhớ PIC16F84A Trong PIC16F84A có loại nhớ, nhớ PlashROM, nhớ SRAM nhớ EEPROM Bộ nhớ FlashROM: Bộ nhớ FlashROM PIC16F84A có 1024 nhớ, nhớ rộng 14 bit Thanh nhớ có địa 0000h vị trí lệnh Reset Mỗi chân số bị kéo xuống mức áp thấp chương trình nhẩy địa Thanh nhớ có địa 0004h vị trí lệnh ngắt (Interrupt) Khi xuất dấu hiệu ngắt, chương trình nhẩy đến địa Thanh nhớ có địa 2007h nhớ xác định cấu hình IC Ở Bạn cho khai báo trạng thái họat động PIC16F84A Cấu trúc nhớ cấu sau: Thanh Configuration Word có 14 bit nằm địa 2007h nhớ FlashROM, Bạn chọn định trạng thái làm việc cho PIC16F84A cách đặt bit hay bit vào ghi * Bit FOSC1, FOSC0 (Oscillator Selection bits) dùng khai báo kiểu mạch dao động Nếu FOSC1=1, FOSC0=1, kiểu dao động R-C Tần số làm việc nhỏ 1MHz Nếu FOSC1=1, FOSC0=0, kiểu dao động HS dùng thạch anh hay gốm Tần số từ 4MHz đến 20MHz Nếu FOSC1=0, FOSC0=1, kiểu dao động thạch anh hay gốm Tần số làm việc nhỏ 4MHz Nếu FOSC1=1, FOSC0=0, kiểu dao động thạch anh công suất nhỏ Tần số làm việc nhỏ 200KHz * Bit WDTE (Watchdog Timer(WDT) Enable bit) WDTE=1: Cho dùng đồng hồ Watchdog WDTE=0: Tắt ñoàng hoà Watchdog * PWRTE (Power-up Timer Enable bit) PWRTE=1: Tắt chức Power Timer PWRTE=0: Mở chức Power Timer * CP (Code Protection bit) CP=1: Tắt tính bảo vệ nhớ, cho đọc nội dung có nhớ FlashROM CP=0: Mở tính bảo vệ nhớ (Chống đọc nội dung có nhớ) Bộ nhớ SRAM: SRAM nhớ ghi đọc tùy ý Bộ nhớ SRAM PIC16F84A có dãy (2 Bank, gọi Bank Bank 1) 12 nhớ phần đầu nhớ đặc dụng (SFR) Từ nhớ có địa 0ch đến nhớ 4fh (có 68 nhớ) nhớ phổ dụng (GPR) Tìm hiểu nhớ đặc dụng: INDF (Data memory contents by indirect addressing): Thanh nhớ chứa nội dung theo địa gián tiếp có nhớ FSR TMR0 (Timer counter): Thanh nhớ bit Timer Thanh nhớ đếm 256 xung tràn PCL (Low order bits of program counter): Thanh nhớ bit thấp đếm chương trình PC STATUS (Flag of calculation result): Thanh nhớ trạng thái Xác định cờ chọn bank SRAM Memory có địa 03h,83h : FSR (Indirect data memory address pointer): Thanh nhớ giữ mã địa dùng truy cập theo nhớ theo mã địa gián tiếp PORTA (PORTA DATA I/O): Thanh nhớ xuất nhập liệu cảng PortA PORTB (PORTB DATA I/O): Thanh nhớ xuất nhập liệu cảng PortB EEDATA (Data for EEPROM): Thanh nhớ cất giữ liệu nhớ EEPROM EEADR (Address for EEPROM): Thanh nhớ cất giữ mã địa dùng cho nhớ EEPROM PCLATH (Write buffer for upper bits of the program counter): Thanh nhớ bit cao đếm chương trình PC Bộ đếm chương trình PC có 13 bit INTCON (Interruption control): Thanh nhớ điều khiển chức ngắt Có mã địa 0Bh, 8Bh: OPTION_REG (Mode set): Thanh nhớ tùy chọn định trạng thái làm việc PIC16F84A, có địa 81h: TRISA (Mode set for PORTA): Thanh nhớ xác định chức xuất nhập liệu cho PortA TRISB (Mode set for PORTB): Thanh nhớ xác định chức xuất nhập liệu cho PortB EECON1 (Control Register for EEPROM): Thanh nhớ điều khiển việc ghi đọc nhớ EEPROM, có mã địa 88h: EECON2 (Write protection Register for EEPROM ): Thanh nhớ hổ trợ việc ghi đọc nhớ EEPROM C Tìm hiểu câu lệnh dùng để chuyển bank PIC16F84A Hãy nhìn vào nhớ SRAM PIC16F84A: Bạn thấy có 12 nhớ đặc dụng nằm Bank từ địa 00h đến 0bh, Bank có 12 nhớ đặc dụng từ địa 80h đến địa 8bh (có nhớ giống nằm Bank) Chỉ từ địa 0ch đến 4fh 68 nhớ phổ dụng Ở 68 nhớ Bạn cho ghi đọc tùy ý Như vậy, muốn làm việc với nhớ nào, việc trước tiên Bạn phải biết nhớ nằm Bank chuyển vào Bank ghi đọc Cách chuyển Bank, Bạn khai báo ghi đặc dụng STATUS Hãy xem ý nghóa bit ghi đặc dụng STATUS: Trong ghi đặc dụng Bạn ý bit chọn Bank IRP, RP1, RP0 Với PIC16F84A bit IRP bit RP1 cho đặt mức áp thấp (bit 0), lại có bit RP0 dùng để chọn Bank Các câu lệnh chuyển Bank Nếu Bạn muốn làm việc với ghi Bank đặt bit RP0 mức áp thấp (bit 0) Bạn dùng câu lệnh sau: BCF STATUS, RP0 ; Cho RP0=0 Chuyển vào làm việc với nhớ Bank Nếu Bạn muốn làm việc với ghi Bank đặt bit RP0 mức aùp cao (bit 1) BSF STATUS, RP0 ; Cho RP0=1 Chuyển vào làm việc với nhớ Bank Một thí dụ: Cho đặt PortA PortB làm cảng xuất liệu: BSF STATUS, RP0 CLRF TRISA CLRF TRISB BCF STATUS, RP0 ; Vào làm việc với nhớ Bank 1, có ghi ; TRISA TRISB ; Đặt vào ghi TRISA trị B’0000 0000’, định PortA ngả ; Đặt vào ghi TRISB trị B’0000 0000’, định PortB ngả ; Trở lại Bank 0, nơi có cảng PortA PortB xuất liệu Cú pháp câu lệnh: BSF BCF sau: Các câu lệnh chuyển trị vào nhớ Để chuyển trị vô hướng k vào nhớ dùng câu lệnh sau: MOVLW MOVWF H’11110000’ ; Đặt trị 11110000 ghi W TRISA ; Đặt trị ghi W vaøo ghi TRISA MOVLW MOVWF H’00000000’ ; Đặt trị 00000000 ghi W TRISB ; Đặt trị ghi W vào ghi TRISB Với khai báo này, Bạn chọn chân xuất nhập cho chân PortB Port A Trong khai báo ghi TRISA, TRISB, đặt bit định ngả (Output) đặt bit định ngả vào (Input) TRISA dùng định hướng xuất nhập liệu cho cảng PortA TRISB dùng định hướng xuất nhập liệu cho cảng PortB Hai ghi nằm Bank TRISA địa 85h TRISB địa 86h Do vậy, Bạn muốn ghi bit vào ghi này, Bạn phải chuyển vào Bank Trên sơ đồ mạch điện mũi tên cho thấy đường tín hiệu vào chân PortA PortB Việc định ngả vào / ngả cho Port tùy thuộc khai báo ghi TRISA TRISB Cú pháp câu lệnh: MOVLW MOVWF sau: Hai câu lệnh thông dụng, dùng để chuyển trị (k) vào nhớ có mã địa f Nói khác đi, Bạn chuyển thẳng trị (k) vào ghi f, mà trước hết phải chuyển k W chuyển trị W vào f Thí dụ: Muốn chuyển trị H’32’ vào nhớ có mã địa 20h Bạn phải dùng câu lệnh sau: MOVLW MOVWF H’32’ ; Lúc trị H ‘32’ hay B’00110010’ có ghi W H’20’ ; Cho chuyển trị H’32’ có ghi W vào ghi có mã địa H’20’ D Cách viết đoạn chương trình làm trễ Nếu muốn làm chậm thời gian, Bạn viết đoạn chương trình sau: CALL DELAY ; Lệnh Call cho gọi chương trình có tên nhãn DELAY … DELAY MOVLW MOVWF LOOP0 MOVLW MOVWF LOOP1 MOVLW MOVWF LOOP2 DECFSZ D’10’ H’20’ ; Tên nhãn chương trình làm trễ ; Nạp trị d’10’ vào ghi W ; Chuyển trị d’10’ vào ghi có mã địa h’20’ D’50’ H’21’ ; Nạp trị d’50’ vào ghi W ; Chuyển trị d’50’ vào ghi có mã địa h’21’ D’200’ H’22’ ; Nạp trị d’200’ vào ghi W ; Chuyển trị d’200’ vào ghi có mã địa h’22’ H’22’, ; Cho giảm trị ghi h’22’ theo bước -1, kết cho ghi vào ; h’22’, kết chưa xuống chấp hành lệnh bên ; Nhẩy không điều kiện tên nhãn LOOP2 ; Cho giảm trị ghi h’21’ theo bước -1, kết cho ghi vào ; h’21’, kết chưa xuống chấp hành lệnh bên ; Nhẩy không điều kiện tên nhãn LOOP1 ; Cho giảm trị ghi h’20’ theo bước -1, kết cho ghi vào ; h’20’, kết chưa xuống chấp hành lệnh bên ; Nhẩy không điều kiện tên nhãn LOOP0 ; Quay lại sau lệnh Call delay GOTO DECFSZ LOOP2 H’21’, GOTO DECFSZ LOOP1 H’20’, GOTO RETURN LOOP0 Lệnh trễ làm chậm 10x50x200 = 100000 nhịp Ghi chú: Khi viết đoạn chương trình cho IC AT889C51, viết sau: DELAY: MOV V_6: MOV V_5: MOV DJNZ DJNZ DJNZ RET R7, #10 R6, #50 R5, #200 R5, $ R6, V_5 R7, V_6 ; Nạp trị 10 vào ghi R7 ; Nạp trị 50 vào ghi R6 ; Nạp trị 200 vào ghi R5 ; Cho trị R5 giảm theo bước -1, chờ R5 ; Cho giảm trị R6 theo bước -1, chưa 0, quay tên nhãn V_5 ; Cho giảm trị R7 theo bước -1, chưa 0, quay tên nhãn V_6 ; Quay lại sau lệnh Call delay Sau thí dụ cách viết câu lệnh làm trễ với nhiều hạn định: ;************************************************************************************ Timer Subroutine for 10MHz clock (Khai báo tần số thạch anh 10MHz) ; ; ;************* 1msec Timer Subroutine (Chương trình trễ 1ms) ****************************** T1M ; Tên nhãn MOVLW D'2' ;(1) Đặt trị thập phân vào ghi W MOVWF CNT1M ;(1) Đặt trị có W vào địa đặt tên CNT1M TM1LP1 MOVLW D'249' MOVWF CNT500U TM1LP2 NOP NOP DECFSZ CNT500U, F GOTO TM1LP2 DECFSZ CNT1M, F GOTO TM1LP1 RETURN ;(1)*2 Đặt trị thập phân 249 vào ghi W ;(1)*2 Đặt trị có W vào địa đặt tên CNT500U ; Tên nhãn ;(1)*249*2 Lệnh trống dùng tăng nhịp đếm ;(1)*249*2 Lệnh trống dùng tăng nhịp đếm ;(1)*249*2 cnt500u-1=0 ? Trị CNT500U-1 không chưa ? ;(2)*248*2 No, continue Nếu chưa 0, Quay lại TM1LP2 ;(1)*2 cnt1m-1=0 ? Trị CNT1M-1 không chưa ? ;(2) No Continue Nếu chưa 0, Quay laïi TM1LP1 ;(2) Yes Cnt end Quay laïi sau lệnh CALL DELAY ; ; Total 2501*0.4usec=1msec (Tổng số nhịp chương trình khoảng 1ms) ; ;************* 100msec Timer Subroutine ************************************************ T100M ; Tên nhãn MOVLW D'100' ;Set loop counter Đặt trị thập phân 100 vào ghi W MOVWF CNT100M ;Save loop counter Đặt trị có W vào địa đặt tên CNT100M TM2LP ; Tên nhãn CALL T1M ;1msec subroutine Lệnh gọi chương trình có tên nhãn T1M DECFSZ CNT100M,F ;cnt100m - = ? Trị CNT100M-1 không chưa ? GOTO TM2LP ;No Continue Nếu chưa 0, quay laïi TM2LP RETURN ;Yes Count end Quay laïi sau leänh CALL DELAY ;************* 500msec Timer Subroutine ************************************************ T500M ; Tên nhãn MOVLW D'5' ;Set loop counter Đặt trị thập phân vào ghi W MOVWF CNT500M ;Save loop counter Đặt trị có W vào địa đặt tên CNT500M TM3LP ; Tên nhãn CALL T100M ;100msec subroutine Lệnh gọi chương trình có tên nhãn T100M Trị CNT500M-1 không chưa ? DECFSZ CNT500M,F ;cnt500m - = ? GOTO TM3LP ;No Continue Nếu chưa 0, quay lại TM3LP RETURN ;Yes Count end Quay lại sau lệnh CALL DELAY ;************** 1sec Timer Subroutine *************************************************** ; Tên nhãn T1S MOVLW D'2' ;Set loop counter Đặt trị thập phân vào ghi W MOVWF CNT1S ;Save loop counter Đặt trị có W vào địa đặt tên CNT1S TM4LP ; Tên nhãn CALL T500M ;500msec subroutine Lệnh gọi chương trình có tên nhãn T500M Trị CNT1S-1 không chưa ? DECFSZ CNT1S,F ;cnt1s - = ? GOTO TM4LP ;No Continue Nếu chưa 0, quay laïi TM4LP RETURN ;Yes Count end Quay laïi sau lệnh CALL DELAY Tìm hiểu câu lệnh DECFSZ dùng chương trình làm trễ Cú pháp câu lệnh DECFSZ: Một câu lệnh tương tự INCFSZ cho tăng trị f theo bước +1, xét trị f băng không chưa? Nếu nhẩy qua câu lệnh: E Viết chương trình điều khiển tắt sáng dãy Led PortB PIC16F84A Sơ đồ mạch điện cho thấy: Chúng ta gắn Led PortB viết chương trình tạo nhiều dạng nhấp nháy Led Mạch làm việc với mức áp nguồn +5V Tần số dao động định tần theo gốm X1 10MHz Chân MCLR cho nối vào đường nguồn +5V Cách khai báo kiểu nhấp nháy cho Led PortB Hãy dùng định nghĩa EQU để xác định trạng thái cho chân PortB: K00 K01 K02 K03 K04 K05 K06 K07 EQU EQU EQU EQU EQU EQU EQU EQU B’11111110’ ; Kieåu Ghi chú: Bit lúc Led sáng, bit Led tắt B’11111101’ B’11111011’ B’11110111’ B’11101111’ B’11011111’ B’10111111’ B’01111111’ K10 K11 K12 K13 K14 K15 K16 K17 EQU EQU EQU EQU EQU EQU EQU EQU B’11111110’ ; Kieåu Ghi chú: Bit lúc Led sáng, bit Led tắt B’11111100’ B’11111000’ B’11110000’ B’11100000’ B’11000000’ B’10000000’ B’00000000’ K20 K21 K22 K23 K24 K25 K26 K27 EQU EQU EQU EQU EQU EQU EQU EQU B’00000000’ ; Kieåu Ghi chú: Bit lúc Led sáng, bit Led tắt B’10000000’ B’11000000’ B’11100000’ B’11110000’ B’11111000’ B’11111100’ B’11111110’ K30 K31 K32 K33 K34 K35 K36 K37 EQU EQU EQU EQU EQU EQU EQU EQU B’00000000’ ; Kieåu Ghi chú: Bit lúc Led sáng, bit Led tắt B’10000001’ B’11000011’ B’11100111’ B’11100111’ B’11000011’ B’10000001’ B’00000000’ K40 K41 K42 K43 K44 K45 K46 K47 EQU EQU EQU EQU EQU EQU EQU EQU B’11111111’ ; Kieåu Ghi chú: Bit lúc Led sáng, bit Led tắt B’00000000’ B’11111111’ B’00000000’ B’11111111’ B’00000000’ B’11111111’ B’00000000’ Để đưa trạng thái định nghóa cho xuất PortB, Bạn dùng câu lệnh sau: K0 MOVLW MOVWF CALL MOVLW MOVWF CALL MOVLW MOVWF CALL MOVLW MOVWF CALL MOVLW MOVWF CALL MOVLW MOVWF CALL MOVLW MOVWF CALL MOVLW MOVWF CALL RETURN K00 PORTB TM1S K01 PORTB TM1S K02 PORTB TM1S K03 PORTB TM1S K04 PORTB TM1S K05 PORTB TM1S K06 PORTB TM1S K07 PORTB TM1S ; Tên nhãn kiểu nháy K0 ; Nạp mã B’11111110’ vào ghi W ; Chuyển trị W PortB ; Gọi chương trình làm chậm 1s ; Nạp mã B’11111101’ vào ghi W ; Chuyển trị W PortB ; Gọi chương trình làm chậm 1s ; Nạp mã B’11111011’ vào ghi W ; Chuyển trị W PortB ; Gọi chương trình làm chậm 1s ; Nạp mã B’11110111’ vào ghi W ; Chuyển trị W PortB ; Gọi chương trình làm chậm 1s ; Nạp mã B’11101111’ vào ghi W ; Chuyển trị W PortB ; Gọi chương trình làm chậm 1s ; Nạp mã B’11011111’ vào ghi W ; Chuyển trị W PortB ; Gọi chương trình làm chậm 1s ; Nạp mã B’10111111’ vào ghi W ; Chuyển trị W PortB ; Gọi chương trình làm chậm 1s ; Nạp mã B’01111111’ vào ghi W ; Chuyển trị W PortB ; Gọi chương trình làm chậm 1s ; Quay lại sau câu lệnh CALL K0 Bạn viết tương tự phần cho kiểu khác, đặt tên nhãn K1, K2, K3, K4 Các chương trình gọi lệnh CALL, như: CALL K0 CALL K1 CALL K2 CALL K3 CALL K4 Đến đây, Bạn viết chương trình nguồn đơn giản (gọi file source có họ asm) Chương trình khiến cho Led PortB sáng lan dần lên, chương trình mô tả sau: ; -; Mach test cac den LED_1 o PORTB ; 00/00/2008 ; Dung PIC16F877A ; LED giao tiep voi PORTB ; Chan K cua LED noi GND ; Chon RB0 - RB7 la cac chan OUTPUT ;================================================================ TITLE "Mach chop tat LED_1" LIST P=PIC16F877A INCLUDE P16F877A.INC CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON &_HS_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF ;================================================================ CNT500U EQU H'20' ; Đặt tên nhớ có địa h’20’ CNT500U CNT1M EQU H'21' ; Đặt tên nhớ có địa h’21’ CNT1M CNT100M EQU H'22' ; Đặt tên nhớ có địa h’22’ CNT100M CNT500M EQU H'23' ; Đặt tên nhớ có địa h’23’ CNT500M CNT1S EQU H'24' ; Đặt tên nhớ có địa h’24’ CNT1S ; P00 EQU B'11111110' ; Led treân chân số 6, sáng P01 EQU B'11111100' ; Led chân số 6, 7, sáng P02 EQU B'11111000' ; Led chân số 6, 7, 8, sáng P03 EQU B'11110000' ; Led chân số 6, 7, 8, 9, sáng P04 EQU B'11100000' ; Led chân số 6, 7, 8, 9, 10, sáng P05 EQU B'11000000' ; Led chân số 6, 7, 8, 9, 10, 11, sáng P06 EQU B'10000000' ; Led chân số 6, 7, 8, 9, 10, 11, 12, sáng P07 EQU B'00000000' ; Led chân số 6, 7, 8, 9, 10, 11, 12, 13, saùng ;================================================================ ORG 0x0000 GOTO MAIN ; Nhẩy đến tên nhãn MAIN ORG 0x0004 MAIN ; Tên nhãn STATUS, RP0 ; Cho RP0=1 để vào Bank BSF BCF STATUS, RP1 ; Cho RP1=0 để vào Bank (có thể không dùng câu lệnh này) MOVLW H'00' ; Đặt trị B’00000000’ vào ghi W MOVWF TRISB ; Chuyển trị có W vào ghi định hướng TRISB BCF STATUS, RP1 ; Cho RP1=0 để trở lại Bank BCF STATUS, RP0 ; Cho RP0=0 để trở lại Bank LOOP MOVLW P00 ; Đặt trị P00 vào ghi W MOVWF PORTB ; Xuất trị có W PortB để làm sáng Led cảng CALL T100M ; Làm chậm 100ms MOVLW P01 ; Đặt trị P01 vào ghi W MOVWF PORTB ; Xuất trị có W PortB để làm sáng Led cảng CALL T100M ; Làm chậm 100ms MOVLW P02 ; Đặt trị P02 vào ghi W MOVWF PORTB ; Xuất trị có W PortB để làm sáng Led cảng CALL T100M ; Làm chậm 100ms MOVLW P03 ; Đặt trị P03 vào ghi W MOVWF PORTB ; Xuất trị có W PortB để làm sáng Led cảng CALL T100M ; Làm chậm 100ms MOVLW P04 ; Đặt trị P04 vào ghi W MOVWF PORTB ; Xuất trị có W PortB để làm sáng Led cảng CALL T100M ; Làm chậm 100ms MOVLW P05 ; Đặt trị P05 vào ghi W MOVWF PORTB ; Xuất trị có W PortB để làm sáng Led cảng CALL T100M ; Làm chậm 100ms MOVLW P06 ; Đặt trị P06 vào ghi W MOVWF PORTB ; Xuất trị có W PortB để làm sáng Led cảng CALL T100M ; Làm chậm 100ms MOVLW P07 ; Đặt trị P07 vào ghi W MOVWF PORTB ; Xuất trị có W PortB để làm sáng Led cảng CALL T100M ; Làm chậm 100ms MOVLW H'FF' ; Đặt trị H’FF’ vào ghi W MOVWF PORTB ; Xuất trị có W PortB để tắt tất Led cảng CALL T100M ; Làm chậm 100ms GOTO LOOP ; Quay lại tên nhãn LOOP để tiếp tục ;************************************************************************************ ; Timer Subroutine for 10MHz clock ;************* 1msec Timer Subroutine ************************************************* T1M MOVLW D'2' ;(1) Đặt trị thập phân D’2’ vào ghi W CNT1M ;(1) Chuyển trị có W vào CNT1M (địa 21H) MOVWF TM1LP1 MOVLW D'249' ;(1)*2 Đặt trị thập phân D’249’ vào ghi W CNT500U ;(1)*2 Chuyển trị có W vào CNT500UM (địa 20H) MOVWF TM1LP2 NOP ;(1)*249*2 Tăng nhịp đếm qua lệnh trống NOP ;(1)*249*2 Tăng nhịp đếm qua lệnh trống NOP NOP DECFSZ CNT500U,F ;(1)*249*2 CNT500U-1=0 ? Lệnh nhẩy có điều kiện GOTO TM1LP2 ;(2)*248*2 NO, Tiếp tục giảm -1 CNT500U DECFSZ CNT1M,F ;(1)*2 CNT1M-1=0 ? Lệnh nhẩy có điều kiện GOTO TM1LP1 ;(2) Tiếp tục RETURN ;(2) Quay lai sau thời gian làm chậm ;TOTAL 2501*0.4USEC=1MSEC ;************* 100MSEC TIMER SUBROUTINE *************************************** T100M MOVLW D'100' ; Đặt trị thập phân D’100’ vào ghi W CNT100M ; Chuyển trị có W vào CNT1M (địa 22H) MOVWF TM2LP CALL T1M ; Gọi chương trình T1M CNT100M,F ; CNT100M - = ? Lệnh nhẩy có điều kiện DECFSZ GOTO RETURN TM2LP ; Lệnh nhẩy không điều kiện, để tiếp tục đếm ; Quay lai sau thời gian làm chậm ;************* 500MSEC TIMER SUBROUTINE ************************************** T500M MOVLW D'5' ; Đặt trị thập phân D’5’ vào ghi W CNT500M ; Chuyển trị có W vào CNT1M (địa 23H) MOVWF TM3LP CALL T100M ; Gọi chương trình T100M DECFSZ CNT500M,F ; CNT500M - = ? Lệnh nhẩy có điều kiện GOTO TM3LP ; Lệnh nhẩy không điều kiện, để tiếp tục đếm RETURN ; Quay lai sau thời gian làm chậm ;************** 1SEC TIMER SUBROUTINE ***************************************** T1S MOVLW D'2' ; Đặt trị thập phân D’2’ vào ghi W MOVWF CNT1S ; Chuyển trị có W vào CNT1M (địa 24H) TM4LP CALL T500M ; Gọi chương trình T500M CNT1S,F ; CNT1S - = ? Lệnh nhẩy có điều kiện DECFSZ GOTO TM4LP ; Lệnh nhẩy không điều kiện, để tiếp tục đếm RETURN ; Quay lai sau thời gian làm chậm ;********************************************************************************* ; END of LED flash control processing ;********************************************************************************* END Sau viết xong chương trình nguồn (lấy họ ASM), Bạn dùng trình MPLAB để biên dịch file: file có họ LST dùng để kiểm tra lỗi, có file họ HEX, Bạn dùng trình WINPIC800 nạp file vào nhớ FlashROM PIC16F84A Nếu việc tốt đẹp, công việc Bạn công mỹ mãn F Viết chương trình cho nút nhấn Nếu board thực hành Bạn có dùng đến nút nhấn, hình sau: Trong mạch, nút nhấn đặt PortA, PortA phải chọn định ngả vào Các điện trở 10K dùng treo chân PortA lên mức áp cao Mỗi Bạn nhấn nút nhấn xuống, chân bị kéo xuống mức áp thấp Với dấu hiệu này, cho nhẩy đến chương trình gắn với phím Cách viết đoạn chương trình gắn với nút nhấn đặt PortA sau: ;**************** Program Start *********************** ORG ; Địa ứng với chức Reset (Reset Vector) GOTO INIT ; Nhẩy không điều kiện đến tên nhãn INIT ; Địa ứng với lệnh ngắt (Interrupt Vector) ORG GOTO INIT ;**************** Initial Process ********************* ORG INIT BSF STATUS,RP0 ; Chuyeån qua Bank MOVLW H'ff' ; Đặt trị H’FF’ hay B’11111111’ vào ghi W MOVWF TRISA ; Chuyển trị có W vào TRISA để định PortA ngả CLRF TRISB ; Đặt trị B’00000000’ vào TRISB để định PortB ngả vào BCF STATUS,RP0 ; Về lại Bank MOVLW H'ff' ; Đặt trị H’FF’ hay B’11111111’ vào ghi W MOVWF PORTB ; Cho xuất trị có W PortB ;**************** Key Scan Process ******************** KEYSCAN ; Nếu chân RA0 mức áp cao nhẩy qua lệnh CALL PTN0 BTFSS PORTA,RA0 CALL PTN0 ; Nếu chân RA0 mức áp thấp gọi chương trình PTN0 BTFSS PORTA,RA1 ; Nếu chân RA1 mức áp cao nhẩy qua lệnh CALL PTN1 CALL PTN1 ; Nếu chân RA1 mức áp thấp gọi chương trình PTN1 BTFSS PORTA,RA2 ; Nếu chân RA2 mức áp cao nhẩy qua lệnh CALL PTN2 CALL PTN2 ; Nếu chân RA2 mức áp thấp gọi chương trình PTN2 BTFSS PORTA,RA3 ; Nếu chân RA3 mức áp cao nhẩy qua lệnh CALL PTN3 CALL PTN3 ; Nếu chân RA3 mức áp thấp gọi chương trình PTN3 BTFSS PORTA,RA4 ; Nếu chân RA4 mức áp cao nhẩy qua lệnh CALL PTN4 CALL PTN4 ; Nếu chân RA4 mức áp thấp gọi chương trình PTN4 GOTO KEYSCAN ; Quay lại tên nhãn KEYSCAN để chờ nhấn phím Tóm lại, đoạn chương trình cho quét qua phím chờ có phím nhấn, có phím nhấn xuống, chân xuống mức áp thấp, chương trình cho chạy lệnh CALL gắn với phím nhấn G Tìm hiểu Board thực hành dùng cho Để hiểu rõ cách dùng PIC16F84A ứng dụng, trước hết Bạn làm bảng mạch in ráp theo sơ đồ mạch điện hình sau: File nguồn ASM file HEX: led_source.zip led_hex.zip Tư liệu học tập trường dạy nghề: Điện Tử Thực Hành ... addressing): Thanh nhớ chứa nội dung theo địa gián tiếp có nhớ FSR TMR0 (Timer counter): Thanh nhớ bit Timer Thanh nhớ đếm 256 xung tràn PCL (Low order bits of program counter): Thanh nhớ bit... (Watchdog Timer(WDT) Enable bit) WDTE=1: Cho dùng đồng hồ Watchdog WDTE=0: Tắt đồng hồ Watchdog * PWRTE (Power-up Timer Enable bit) PWRTE=1: Tắt chức Power Timer PWRTE=0: Mở chức Power Timer *... B Khảo sát tổ chức nhớ PIC16F84A Trong PIC16F84A có loại nhớ, nhớ PlashROM, nhớ SRAM nhớ EEPROM Bộ nhớ FlashROM: Bộ nhớ FlashROM PIC16F84A có 1024 nhớ, nhớ rộng 14 bit Thanh nhớ có địa 0000h vị