Giáo trình Thực hành vi xử lý
Nội dung : Tạo project trên MPLAB IDE. Viết chương trình ASM. Dịch và nạp chương trình vào vi điều khiển PIC. Chạy và gỡ rối chương trình.
Bạn đang xem trước 20 trang tài liệu Giáo trình Thực hành vi xử lý, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
ĐẠI HỌC QUỐC GIA TP.HCM
TRƯỜNG ĐẠI HỌC BÁCH KHOA
KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH
THỰC HÀNH VI XỬ LÝ
BM Kỹ thuật Máy tính
2009
Giới thiệu
Mục Lục
Giới thiệu MPLAB IDE và KIT PIC
Nội dung :
Tạo project trên MPLAB IDE.
Viết chương trình ASM.
Dịch và nạp chương trình vào vi điều khiển PIC.
Chạy và gỡ rối chương trình.
Môi trường phát triển MPLAB
Double Click vào biểu tượng MPLAB trên Desktop hoặc theo cách sau: Start -> All Programs -> Microchip -> MPLAB IDE v76.2 -> MPLAB IDE.
Từ thanh Menu, click chọn tab Project -> Project Wirazd…
Cửa sổ Welcome hiện lên và bạn chọn Next.
Chọn PIC cần sử dụng tại khung Device >> Click Next:
Chọn tool Microchip C18 Toolsuite tại Active Toolsuite.
Chọn MPLAB C18 C Compiler tại Tollsuite contents.
Nếu lập trình bằng assembly thì ta chon Active Toolsuite theo hình sau:
Click Next
Chọn Browse…. Để chọn thư mục lưu project.
Đánh vào tên Project muốn tạo. Save, sau đó chúng ta chọn Next thì hiện ra của sổ như sau:
Đây là nơi để các bạn add thư viện cho project.
Bạn nên add hết các file cần thiết cho việc lập trình trước khi bắt đầu viết chương trình gồm file .lib và file .lkr. Nếu viết chương trình cho con chip nào thì ta lấy file .lib và file .lkr của chíp tương ứng, như hình trên chung ta đang sử dụng chip 18f4550.
Click Next.
Click Finish. Ta sẽ được một project như hình sau:
Một project đơn giản nhất phải gồm có 2 thành phần Source files và Hearder Files. Thư mục Source files chứa file text *.asm hoặc file *.c chứa code lâp trình. Thư mục Hearder Files chứa file *.h hoặc *.INC: file có sẵn của microchip. User khai báo dùng loại chip gì => add vào thư mục này.
Nếu bạn quên không add các file cần có vào thì làm theo hướng dẫn sau.
ADD header file: ( Copy header file vào thư mục chứa project để tiện cho việc sử dụng sau này).
Chọn header file phù hợp với PIC mình đã chọn. Open.
ADD source file: Click chọn New trên toolbar:
Cửa sổ hiện lên như sau: Từ Menu bar chọn File >> Save để lưu.
Đặt tên và Save với đuôi .c nếu bạn lập trình trên c18 của maplab hoặc .asm nếu bạn lập trình trên assembly.
Nhấp phải vào Source Files chọn Add file >>> chọn file chúng ta vừa tạo xong.
Cửa sổ hiện lên như sau:
Chúng ta đã hoàn tất việc add file vào các thư mục Source files và header files. Công việc tiếp theo là viết code ( ở cửa sổ text editor :D:\MAPLAB\Untiled.asm).
Ðối với project mà sử dụng cùng 1 loại chip, cùng loại ngôn ngữ lập trình ( ASM hay C) thì chỉ cần tạo 1 lần. Những lần sau, chỉ cần add/ remove file text (*.asm hoặc *.c) vào thư mục Source files.
Nạp file hex vào vi điều khiển PIC
Sau khi tạo được một project, ta tiến hành build nó để tạo ra *.hex. Có thể mô tả công việc như sau:
Ví dụ, ta có một chương trình cho PIC như sau:
;=====================================;
; Name: nut_nhan.asm
; Project: Nhap du lieu tu nút nhan RA4.
; Khi nút RA4 du?c nh?n thì led don RB0 sáng,
; Khi không nh?n RA4 thì led don RB0 t?t
; Author: BKIT HARDWARE CLUB
; Homepage:
; Creation Date: 7 - 31 - 2009
;======================================;
list p=18f4520
#include p18f4520.inc
org 0
goto start
start
call INIT
main
BTFSC PORTA,4 ;Wait for SW1 to be pressed
GOTO main
BSF PORTB,0 ;Turn on LED1.
SWOFF
BTFSS PORTA,4 ;Wait for SW1 to be released.
GOTO SWOFF
BCF PORTB,0 ;Switch off LED1.
GOTO main ;Repeat sequence.
INIT
clrf PORTB ; setup portb for outputs
bcf TRISB,0
bsf PORTA,4 ; setup porta.4 for input
bsf TRISA,4
return
END
Bây giờ chúng ta lưu chương trình vừa viết thành nut_nhan.asm vào một thư mục đã tạo project phía trên. Để compile chương trình ta vào menu Project -> Build All như hình bên dưới.
Nếu việc build thất bại, nhưng việc này thì không mong muốn, ta có thấy kết quả như hình sau:
Nếu thành công, ta sẽ thấy hình sau:
Nếu việc build đã thành công, chương trình sẽ dịch nut_nhan.asm thành nut_nhan.hex trong cùng thư mục chương trình nut_nhan.asm.
Sau khi đã có được file hex, công việc tiếp theo là làm thế nào để nạp được file Hex xuống board. Đầu tiên là chọn mạch nạp bằng cách vào menu Programmer -> Select Programmer -> Mplab ICD2 như hình sau :
Sau khi chọn Mplab ICD2 xong thì ta sẽ thấy giao diện như sau:
Lúc này để nạp chương trình ta chỉ cần vào menu Programmer -> Program như hình sau là có thể nạp được chương trình.
Sau khi nhấn Program nếu download xuống chip thành công thì ta sẽ thấy hiển thị ra cửa sổ Output như sau:
MPLAB ICD 2 Ready
Programming Target...
...Validating configuration fields
...Erasing Part
...Programming Program Memory (0x0 - 0x3F)
Verifying...
...Program Memory
...Verify Succeeded
Programming Configuration Bits
.. Config Memory
Verifying configuration memory...
...Verify Succeeded
...Programming succeeded
04-Aug-2009, 14:23:39
MPLAB ICD 2 Ready
Để bắt đầu chạy chương trình ta phải rút dây kết nối mạch nạp và kit ra. Khi đó chương trình mới có thể chạy được.
Trên đây là toàn bộ các bước để tạo một project, viết assembly cho Pic trên Mplab cũng như làm thế nào để compile và download chương trình xuống chip để thực thi. Đây là trường hợp lý tưởng là khi viết code không có lỗi nào xảy ra. Nếu có lỗi nào xảy ra thì ta phải debug nó như thế nào. Trong chương này sẽ hướng dẫn các bạn hai cách debug.
Debug dùng MpLab SIM
Bước 1: Để sử dụng MpLab SIM ta vào menu Debugger -> Select Debugger -> Mplab SIM như hình vẽ sau:
Bước 2: Khi đã chọn Mplab SIM xong thì trên menu Debugger có thêm nhiều chức năng khác để hỗ trợ cho việc debug như hình sau:
Từ đây ta đã có thể mô phỏng được chương trình của mình một cách dễ dàng.
Ví dụ như Run (F9) dùng để chạy chương trình, chương trình sẽ chạy liên tục đến khi nào có breakpoint thì dừng. Vậy làm thế nào để tạo Breakpoint, ta sử dụng lệnh Breakpoints (F2) như trên hình để tạo ra breakpoint tại vị trí hiện tại của con trỏ hoặc double click vào hàng code mình mong muốn đặt con trỏ. Hay sử dụng Step Into (F7) để chạy từng lệnh một, gặp lời gọi hàm thì nó sẽ vào bên trong lời gọi hàm chạy từng lệnh trong đó. Khác với Step Over (F8) một tí là khi có lời gọi hàm thì Step Over xem như đó là một lệnh bình thường, không đi vào hàm chi tiết như Step Into.
Reset: trở về đầu chương trình.
Bước 3: Khi debug thì ta cũng cần phải biết giá trị của các thanh ghi cũng như bộ nhớ của chip như thế nào, để xem được các giá trị này thì chúng ta qua menu View.
Để xem được giá trị của các thanh ghi trong PIC ta chọn View -> File registers sẽ xuất hiện cửa sổ như hình sau:
Để xem được giá trị của các thanh ghi SFR thì ta chọn View -> Special Function Registers sẽ xuất hiện của sổ như hình sau:
Hay để xem một và thanh ghi mà ta quan tâm thì có thể dùng Watch để xem bằng cách vào View -> Watch thì hình sau sẽ xuất hiện:
Muốn xem thanh ghi nào, ta chỉ việc chọn thanh ghi tương ứng trong combobox bên trên, sau đó nhấn Add SFR.
Debug onchip dùng Mplab ICD2.
Cũng giống như debug trên Mplab SIM, Mplab ICD2 cũng có những tính năng tương tự, nhưng khi sử dụng Mplab ICD2 thì cần phải có mạch debug, và các hiện tượng xảy ra giống như khi chạy thực tế.
Bài tập
Khảo sát cổng xuất nhập
Nội dung:
Khảo sát hoạt động của nút nhấn, LED.
Khảo sát các thanh điều khiển cổng xuất nhập.
Tính toán thời gian thực thi lệnh, viết chương trình con làm nhiệm vụ delay.
Viết chương trình đọc giá trị của tổ hợp nút nhấn và điều khiển giá trị hiển thị LED.
Yêu cầu:
Viết chương trình xuất dữ liệu ra 4 led đơn đếm từ 0 -> 15 -> 0. Thời gian giữa các lần đếm lên 1 đơn vị là 1s.
Nhập dữ liệu từ nút nhấn RA4. Khi nút RA4 được nhấn thì led đơn RB0 sáng, khi không nhấn RA4 thì led đơn RB0 tắt.
Kiến thức liên quan
Các thanh ghi điều khiển cổng xuất nhập
Mỗi Port có ba thanh ghi điều khiển hoạt động chính:
Các bit trong thanh ghi TRIS: thiết lập chân tương ứng là ngõ vào (logic 1) hoặc ngõ ra (logic 0).
Các bit trong thanh ghi PORT: đọc mức logic từ chân tương ứng.
Các bit trong thanh ghi LAT: ghi mức logic ra chân tương ứng.
Kết nối mạch
Vị trí LED hiển thị và nút nhấn trên board như hình dưới đây:
LED hiển thị có kết nối như sau:
Để LED sáng, J6 phải được nối lại và chân điều khiển tương ứng được thiết lập là ngỏ ra và ở mức logic 1.
Các nút nhấn có kết nối như sau:
Nút nhấn RESET dùng để reset vi điều khiển
Nút nhấn RA4, RB0 khi được nhấn sẽ làm cho chân tương ứng ở mức logic 0. Cần thiết lập các chân RA4 và RB0 là ngõ vào.
Hiện tượng rung phím:
Khi phím được nhấn, do tác động của hiện tượng rung cơ học, tín hiệu điện tại ngõ ra bị chuyển trạng thái giữa logic 0 và logic 1. Khi phím được thả, hiện tượng rung cũng xảy ra tương tự.
Bộ dao động chính có kết nối như sau:
Trên kit thí nghiệm, thạch anh Y2 được sử dụng cho tất cả các bài thí nghiệm.
Các bước hiện thực yêu cầu 1
Bước 1: Tạo project mới giống như hướng dẫn ở chương 1 lấy tên project là Led_don, tạo file led_don.asm và chọn chip 18f4520. Ta được hình sau:
Bước 2: Include file p18f4520.inc vào file led_don.asm.
Bước 3: Khởi tạo PortB là output sử dụng các lệnh clrf, bcf.
INIT
clrf PORTB ; setup portb for outputs
bcf TRISB,0 ; clear trisb.0
bcf TRISB,1 ; clear trisb.1
bcf TRISB,2 ; clear trisb.1
bcf TRISB,3 ; clear trisb.1
return
Bước 4: Tạo hàm delay1ms sử dụng các lệnh CLRF, NOP, DECFSZ, GOTO.
delay equ 0ch ; declare variable “delay”
Delay1ms ;Approxiamtely at 4Mhz
clrf delay ; clear variable “delay”
Delay_1
nop
decfsz delay
goto Delay_1
return
Bước 5: Từ đây ta có thể tạo ra được hàm delay1s:
Delay1s
Movwf .4
Movlw delay_1sa
Delay1s_1
Movwf .250
Movlw delay_1sb
Delay1s_2
Call Delay1ms
decfsz delay_1sb
goto Delay1s_2
decfsz delay_1sa
goto Delay1s_1
return
Bước 6: Viết chương trình cho hàm main thực hiện các yêu cầu của đề bài sử dụng lệnh INCF:
begin
INCF PORTB
call Delay1s
goto begin
Chương trình mẫu yêu cầu 1
;=====================================;
; Name: led_don.asm
; Project: Xuất dữ liệu ra 4 led đơn đếm từ 0 -> 15 -> 0.
; Thời gian giữa các lần đếm lên 1 đơn vị là 1s.
; Author: BKIT HARDWARE CLUB
; Homepage:
; Creation Date: 7 - 31 - 2009
;======================================;
list p=18f4520
#include p18f4520.inc
delay res 1
delay_1sa res 1
delay_1sb res 1
org 0
goto start
start
call INIT
begin
INCF PORTB
call Delay1ms
goto begin
INIT
clrf PORTB ; setup portb for outputs
bcf TRISB,0
bcf TRISB,1
bcf TRISB,2
bcf TRISB,3
return
Delay1ms ;Approxiamtely at 4Mhz
clrf delay
Delay_1
nop
decfsz delay
goto Delay_1
return
Delay1s
movwf .4
movlw delay_1sa
Delay1s_1
movwf .250
movlw delay_1sb
Delay1s_2
call Delay1ms
decfsz delay_1sb
goto Delay1s_2
decfsz delay_1sa
goto Delay1s_1
return
END
Sau khi có chương trình mẫu ta thực hiện việc compile chương trình và nạp xuống mạch để chạy chương trình như hướng dẫn ở chương 1.
Các bước hiện thực yêu cầu 2
Bước 1: Tạo project mới giống như hướng dẫn ở chương 1 lấy tên project là Nut_nhan và chọn chip 18f4520. Ta được hình sau:
Bước 2: Include file p18f4520.inc vào file nut_nhan.asm.
Bước 3: Khởi tạo PortB là output và PortA là input sử dụng các lệnh clrf, bcf, bsf
INIT
CLRF PORTB ;setup portb for outputs
BCF TRISB,0
BCF TRISB,1
BCF TRISB,2
BCF TRISB,3
BSF PORTA,4 ; setup porta.4 for input
BSF TRISA,4
RETURN
Bước 4: Viết chương trình cho hàm main thực hiện yêu cầu của đề bài
MAIN
BTFSC PORTA,4 ;Wait for SW1 to be pressed
GOTO MAIN
BSF PORTB,0 ;Turn on LED1.
SWOFF
BTFSS PORTA,4 ;Wait for SW1 to be released.
GOTO SWOFF
BCF PORTB,0 ;Switch off LED1.
GOTO MAIN ;Repeat sequence.
Chương trình mẫu yêu cầu 2
;=====================================;
; Name: nut_nhan.asm
; Project: Nhập dữ liệu từ nút nhấn RA4.
; Khi nút RA4 được nhấn thì led đơn RB0 sáng,
; Khi không nhấn RA4 thì led đơn RB0 tắt
; Author: BKIT HARDWARE CLUB
; Homepage:
; Creation Date: 7 - 31 - 2009
;======================================;
list p=18f4520
#include p18f4520.inc
ORG 0
GOTO START
START
CALL INIT
MAIN
BTFSC PORTA,4 ;Wait for SW1 to be pressed
GOTO MAIN
BSF PORTB,0 ;Turn on LED1.
SWOFF
BTFSS PORTA,4 ;Wait for SW1 to be released.
GOTO SWOFF
BCF PORTB,0 ;Switch off LED1.
GOTO MAIN ;Repeat sequence.
INIT
CLRF PORTB ; setup portb.0 for outputs
BCF TRISB,0
BSF PORTA,4 ; setup porta.4 for input
BSF TRISA,4
RETURN
END
Sau khi có chương trình mẫu ta thực hiện việc compile chương trình và nạp xuống mạch để chạy chương trình như hướng dẫn ở chương 1.
Bài tập
Viết chương trình để khi nhấn RA4 thì các led sẽ sáng đếm lên, mỗi lần nhấn đếm lên 1 đơn vị.
Viết chương trình sao cho mỗi lần nhấn RA4 thì 2 led trái và 2 led phải thay nhau sáng.
Tạo hiệu ứng light river trên 4 led của board mạch starter kit. Nhấn RA4 để thay đổi chiều của light river.
Khảo sát cơ chế ngắt quãng, giao tiếp LCD ký tự
Nội dung:
Khảo sát các nguyên nhân gây ngắt quảng, cách xử lý ngắt quãng, tính ưu tiên giữa các ngắt của vi điều khiển PIC16F877.
Khảo sát ngắt ngoài của vi điều khiển PIC16F877.
Điều khiển LCD ký tự 2x16.
Yêu cầu:
1. Viết chương trình khởi tạo 2 ngắt:
Ngắt ngoài 0 với độ ưu tiên cao.
Ngắt timer 0 với độ ưu tiên thấp.
Trong chương trình ngắt ngoài 0 bật 3 led đơn RB1, RB2, RB3sáng cùng lúc.
Trong chương trình timer 0 sau 1s khi 3 led được bật ở trong ngắt ngoài thì tắt 3 led đơn RB1, RB2, RB3 cùng lúc.
2. Viết chương trình hiển thị kí tự lên LCD.
Kiến thức liên quan
Tóm tắt các thanh ghi điều khiển ngắt
Thanh ghi INTCON:
Thanh ghi PIE1:
Thanh ghi PIE2:
Thanh ghi PIR1:
Thanh ghi PIR2:
Sơ đồ điều khiển ngắt:
Các bước hiện thực yêu cầu 1
Bước 1: Tạo project mới giống như hướng dẫn ở chương 1 lấy tên project là Interrupt, tạo file interrupt.asm và chọn chip 18f4520. Ta được hình sau:
Bước 2: Include file p18f4520.inc vào file interrupt.asm
Bước 3: Khởi tạo PortB là output sử dụng các lệnh clrf, bcf
INIT
;assigning PORTB is a digital output
MOVLW 0x0e
MOVWF ADCON1
; setup portb for outputs
BCF TRISB,1
BCF PORTB,1
BCF TRISB,2
BCF PORTB,2
BCF TRISB,3
BCF PORTB,3
;initialize delay variable
MOVLW .10
MOVWF delay
RETURN
Bước 4: Khởi tạo timer 0, cho timer 0 ngắt có độ ưu tiên thấp, thiết lập timer0 cứ 100ms thì xảy ra ngắt một lần.
INIT_TIMER0
BSF RCON,IPEN ;enable priority interrupts.
BCF INTCON2,TMR0IP ;timer0 with low priority
BSF INTCON,TMR0IF;set timer0 interrupt flag bit
BSF INTCON,TMR0IE ; enable timer 0
;set the global interrupt enable bits
BSF INTCON,GIEH
BSF INTCON,GIEL
CLRF T0CON
MOVLW 0x3c
MOVWF TMR0H
MOVLW 0xAF
MOVWF TMR0L
BSF T0CON,TMR0ON
RETURN
Bước 5: Khởi tạo ngắt ngoài 0 tích cực cạnh xuống.
Đối với ngắt ngoài 1 và ngắt ngoài 2 thì độ ưu tiên ngắt phụ thuộc vào 2 bit INT1IP và INT2IP trong thanh ghi INTCON3. Còn với ngắt ngoài 0 thì không có bít xác định độ ưu tiên, nó chỉ có một mức ưu tiên là high priority.
INIT_EXTERNAL_INTERRUPT
;falling edge on RB0
BCF INTCON2,INTEDG0
; clear external interrupt flag bit
BCF INTCON,INT0IF
; enable external 0 interrupt
BSF INTCON,INT0IE
;set the global interrupt enable bits
BSF INTCON,GIEH
BSF INTCON,GIEL
RETURN
Bước 6: Viết chương trình cho ngắt ngoài 0, bật 3 đèn led đơn cùng sáng và khởi tạo lại giá trị cho biến delay để 1s sau thì ngắt timer sẽ tắt 3 đèn đó.
EXTERNAL_INTERUPT_ROUTINE
BCF INTCON,INT0IF
BSF PORTB,1
BSF PORTB,2
BSF PORTB,3
MOVLW .10
MOVWF delay
RETURN
Bước 7: Viết chương trình cho ngắt timer0, sau 1s sau khi led được bật sáng thì nó sẽ làm cho led tắt.
Thời gian để timer đếm lên 1 đơn vị đựơc tính bằng công thức :
T = 1/((Focs/4)/2) = 1/((4Mhz/4)/2) = 0.5us
Nên khi ta để giá trị trong các thanh ghi của timer giá trị 50000 thì cứ sau 100ms, timer sẽ ngắt một lần. Để tính được giá trị số Hex gán cho thanh ghi đếm của timer ta làm như sau:
Đổi số 50000 sang số hex: C350.
Lấy FFFF – C350 = 3CAF.
Byte cao sẽ được lưu vào TMR0H, byte thấp lưu vào TMR0L.
TIMER0_INTERRUPT_ROUTINE
BCF INTCON,TMR0IF
DECFSZ delay,1
GOTO TIMER0_ROUTINE_1
BCF PORTB,1
BCF PORTB,2
BCF PORTB,3
MOVLW .10
MOVWF delay
TIMER0_ROUTINE_1
BCF T0CON,TMR0ON
MOVLW 0x3C
MOVWF TMR0H
MOVLW 0xAF
MOVWF TMR0L
BSF T0CON,TMR0ON
RETURN
Chương trình mẫu yêu cầu 1
;=====================================;
; Name: led_don.asm
; Project: Viết chương trình khởi tạo 2 ngắt:
;- Ngắt ngoài 0 với độ ưu tiên cao.
;- Ngắt timer 0 với độ ưu tiên thấp.
;- Trong chương trình ngắt ngoài 0 bật 3 led đơn RB1, RB2, RB3sáng cùng ;lúc
;- Trong chương trình timer 0 sau 1s khi 3 led được bật ở trong ngắt ngoài thì ;tắt 3 led đơn RB1, RB2, RB3 cùng lúc
; Author: BKIT HARDWARE CLUB
; Homepage:
; Creation Date: 7 - 31 - 2009
;======================================;
list p = 18f4520
#include P18f4520.inc
delay res 1
ORG 00h
GOTO MAIN
ORG 08H
GOTO ISR_HIGH
ORG 18H
GOTO ISR_LOW
MAIN
CALL INIT
CALL INIT_TIMER0
CALL INIT_EXTERNAL_INTERRUPT
GOTO $
INIT
;assigning PORTB is a digital output
MOVLW 0x0e
MOVWF ADCON1
BCF TRISB,1
BCF PORTB,1
BCF TRISB,2
BCF PORTB,2
BCF TRISB,3
BCF PORTB,3
MOVLW .10
MOVWF delay
RETURN
INIT_TIMER0
BSF RCON,IPEN ;enable priority interrupts.
BCF INTCON2,TMR0IP
BSF INTCON,TMR0IF
BSF INTCON,TMR0IE
BSF INTCON,GIEH ;set the global interrupt enable bits
BSF INTCON,GIEL
CLRF T0CON
MOVLW 0x3c
MOVWF TMR0H
MOVLW 0xAF
MOVWF TMR0L
BSF T0CON,TMR0ON
RETURN
INIT_EXTERNAL_INTERRUPT
;Interrupt priority for INT1 and INT2 is determined by the
;value contained in the interrupt priority bits, INT1IP
;(INTCON3) and INT2IP (INTCON3). There is
;no priority bit associated with INT0. It is always a high
;priority interrupt source
BCF INTCON2,INTEDG0
BCF INTCON,INT0IF
BSF INTCON,INT0IE
BSF INTCON,GIEH ;set the global interrupt enable bits
BSF INTCON,GIEL
RETURN
EXTERNAL_INTERUPT_ROUTINE
BCF INTCON,INT0IF
BSF PORTB,1
BSF PORTB,2
BSF PORTB,3
MOVLW .10
MOVWF delay
RETURN
TIMER0_INTERRUPT_ROUTINE
; BSF INTCON,INT0IF
BCF INTCON,TMR0IF
DECFSZ delay,1
GOTO TIMER0_ROUTINE_1
BCF PORTB,1
BCF PORTB,2
BCF PORTB,3
MOVLW .10
MOVWF delay
TIMER0_ROUTINE_1
BCF T0CON,TMR0ON
MOVLW 0x3c
MOVWF TMR0H
MOVLW 0xaf
MOVWF TMR0L
BSF T0CON,TMR0ON
RETURN
ISR_HIGH
CALL EXTERNAL_INTERUPT_ROUTINE
RETFIE
ISR_LOW
CALL TIMER0_INTERRUPT_ROUTINE
RETFIE
END
Sau khi có chương trình mẫu ta thực hiện việc compile chương trình và nạp xuống mạch để chạy chương trình như hướng dẫn ở chương 1.
LCD ký tự 2x16
Hình dạng và ý nghĩa các chân:
Tên chân
Mức logic
Mô tả
GND
-
Đất (0V)
VCC
-
Nguồn (+5V)
VEE
-
Chỉnh contrast (0 – VCC)
RS
0
1
D0-D7 là giá trị lệnh
D0-D7 là giá trị dữ liệu
R/W
0
1
Ghi giá trị vào LCD
Đọc giá trị ra từ LCD
E
0
1
Từ 1 xuống 0
Cấm truy xuất LCD
LCD hoạt động trao đổi dữ liệu
Dữ liệu/Lệnh đưa vào LCD
D0
0/1
Bit 0/LSB
D1
0/1
Bit1
D2
0/1
Bit2
D3
0/1
Bit3
D4
0/1
Bit4
D5
0/1
Bit5
D6
0/1
Bit6
D7
0/1
Bit7/MSB
A
-
Chân Anode của đèn nền
K
-
Chân Cathode của đèn nền
Tổ chức vùng nhớ của LCD
Display Data Ram (DDRAM): lưu trữ mã ký tự hiển thị ra màn hình. Mã này giống với mã ASCII. Có tất cả 80 ô nhớ DDRAM. Vùng hiển thị tương ứng với cửa sổ gồm 16 ô nhớ hàng đầu tiên và 16 ô nhớ hàng thứ hai. Chúng ta có thể tạo hiệu ứng dịch chữ bằng cách sử dụng lệnh dịch (mô tả sau), khi đó cửa sổ hiển thị sẽ dịch đem lại hiệu ứng dịch chữ.
Character Generator Ram (CGRAM): lưu trữ tám mẫu ký tự do người dùng định nghĩa. Tám mẫu ký tự này tương ứng với các mã ký tự D7-D0 = 0000*D2D1D0 (* mang giá trị tùy định 0 hay 1).
Character Generator Rom (CGROM): lưu trữ cứng các mẫu ký tự tương ứng với mã ASCII. Dưới đây là bảng ánh xạ giữa mã ký tự và mẫu ký tự.
Chúng ta muốn hiển thị chữ “CE” ở giữa hàng đầu tiên, giả sử cửa sổ hiển thị đang bắt đầu từ vị trí đầu tiên (hàng thứ nhất hiển thị dữ liệu của ô nh