Thực hành vi xử lý vi điều khiển Thực hành vi xử lý vi điều khiển Thực hành vi xử lý vi điều khiển Thực hành vi xử lý vi điều khiển Thực hành vi xử lý vi điều khiển Thực hành vi xử lý vi điều khiển Thực hành vi xử lý vi điều khiển Thực hành vi xử lý vi điều khiển Thực hành vi xử lý vi điều khiển
Trang 1ĐẠ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Í NGHIỆM
VI XỬ LÝ - VI ĐIỀU KHIỂN
BM Kỹ thuật Máy tính
2012
Trang 2Bộ môn Kỹ Thuật Máy Tính 1 Thực hành Vi xử lý – Vi điều khiển
Bài 1 : Giới thiệu MPLAB IDE và KIT PIC
Nội dung:
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.Đọc bộ nhớ chương trình.ghi đọc bô nhớ EEPROM và xuất ra LED
1.1 Phần cứng thí nghiệm ICD2 và PICDEM 2 PLUS
Bộ hỗ trợ lập trình dùng với máy tính ICD2 (In-Circuit Debugger)
Sơ đồ kết nối ICD2
Kit thí nghiệm PICDEM 2 Plus có các đặc điểm như hình sau :
1 Đế cắm DIP 18, 28 và 40 chân (có thể cắm 3 linh kiện nhưng chỉ dùng 1 mỗi lần)
2 Ổn áp +5V dùng cho nguồn 9V, 100 mA AC/DC hay pin 9V
3 Đầu cắm DB-9 theo chuẩn giao tiếp RS-232
4 Đầu cắm qua bộ lập trình In-Circuit Debugger (ICD)
5 Biến trở 5KΩ dùng cho tín hiệu nhập tương tự
6 Ba nút nhấn dùng tạo tín hiệu kích từ bên ngoài và reset
7 LED nguồn
8 Bốn LED chỉ thị cho PORTB
9 Jumper J6 để ngắt LED chỉ thị RB0 (khi nhập tín hiệu từ nút nhấn RB0)
Trang 3Trường ĐH Bách Khoa TP.HCM Khoa KH & KTMT
Bộ môn Kỹ Thuật Máy Tính 2 Thực hành Vi xử lý – Vi điều khiển
10 Bộ dao động (OSC) 4 MHz
11 Nơi để lắp thêm thạch anh dao động nếu cần
12 Thạch anh dao động 32.768 kHz tạo xung clock cho Timer1
13 Jumper J7 để ngắt dao động RC có sẳn (khoảng 2 MHz)
14 EEPROM nối tiếp 32K x 8 bit
15 Màn hình LCD
16 Kèn Piezo
17 Vùng lắp thêm linh kiện
18 Cảm biến nhiệt TC74
1.2 Môi trường phát triển MPLAB
Bước 1 Chạy phần mềm MPLAB:
Start_|All Programs_|Microchip_|MPLAB IDE v8.00_|MPLAB IDE
Bước 2 Chọn Menu :
Project_|Project Wirazd…
Chọn Next ở cửa sổ Welcome
Bước 3 Chọn số hiệu PIC cần sử dụng (PIC18F4520) rồi bấm Next:
Bước 4 Chọn tool Microchip MPASM Toolsuite tại ô Active Toolsuite
Trang 4Bộ môn Kỹ Thuật Máy Tính 3 Thực hành Vi xử lý – Vi điều khiển
Chọn MPASM Assembler (mpasmwin.exe) tại ô Tollsuite Contents
Click Next qua cửa sổ kế
Bước 5 Nhấn Browse… để chọn thư mục và đánh tên project
Chọn thư viện thông qua file INC và LKR thêm vào project
Trang 5Trường ĐH Bách Khoa TP.HCM Khoa KH & KTMT
Bộ môn Kỹ Thuật Máy Tính 4 Thực hành Vi xử lý – Vi điều khiển
C:\Program Files\Microchip\MPASM Suite\LKR\18f4520.lkr
C:\Program Files\Microchip\MPASM Suite\P18F4520.INC
Click Next sẽ thấy như sau :
Click Finish Ta sẽ được một project như hình sau:
Trang 6Bộ môn Kỹ Thuật Máy Tính 5 Thực hành Vi xử lý – Vi điều khiển
Bước 6 Thêm file vào dự án theo các bước 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
Nếu bạn quên không thêm 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)
Cửa sổ hiện lên như sau: Từ Menu
bar chọn File_|Save để lưu
Thực hiện Save, đặt tên với đuôi asm vào thư mục chứa dự
Trang 7Trường ĐH Bách Khoa TP.HCM Khoa KH & KTMT
Bộ môn Kỹ Thuật Máy Tính 6 Thực hành Vi xử lý – Vi điều khiển
Công việc tiếp theo là viết code (trong cửa sổ text editor của source file)
Ðối với project lớn dùng nhiều source file và header file, ta làm lại quá trình thêm file vào dự án nhiều lần
1.3 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:
list p=18f4520
#include p18f4520.inc code 0
start call init
;chuong trinh chinh
main
swoff
btfsc PORTA,RA4 ;cho nhan nut RA4
bsf LATB,RB0 ;Bat LED RB0
btfss PORTA,RA4 ;cho nhan nut RA4
bcf LATB,RB0 ;tat LED RB0
;chuong trinh khoi dong ban dau
init
bcf TRISB,RB0 ;khoi dong RB0 la cong xuat bsf TRISA,RA4 ;khoi dong RA4 la cong nhap
return end
Bây giờ chúng ta lưu chương trình vừa viết thành BaiTN1.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
Trang 8Bộ môn Kỹ Thuật Máy Tính 7 Thực hành Vi xử lý – Vi điều khiển 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:
Trang 9Trường ĐH Bách Khoa TP.HCM Khoa KH & KTMT
Bộ môn Kỹ Thuật Máy Tính 8 Thực hành Vi xử lý – Vi điều khiển
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 BaiTN1.asm thành BaiTN1.hex trong cùng thư mục chương trình BaiTN1.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, 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:
Trang 10Bộ môn Kỹ Thuật Máy Tính 9 Thực hành Vi xử lý – Vi điều khiển
Một thao tác cần làm giúp ta có thể dịch chương trình, nạp và chạy tự động là vào
menu Programmer_|Settings…_|Program chọn mục Automatically như hình sau :
Bây giờ ta có thể dịch, nạp và chạy dự án với thao tác menu Project_|Build All (hoặc
nhấn Ctrl-F10)
Nếu thành công thì chương trình sẽ được dịch, nạp ra card PICDEM và chạy ngay
Trang 11Trường ĐH Bách Khoa TP.HCM Khoa KH & KTMT
Bộ môn Kỹ Thuật Máy Tính 10 Thực hành Vi xử lý – Vi điều khiển
Nếu thất bại, xem thông tin báo lỗi trong cửa sổ Output để khắc phục và làm lại từ bước Build All
Trường hợp thành công mà chương trình chạy không đúng, ta phải sử dụng công cụ Debugger để tìm lỗi theo một trong hai cách sau
1.4 Debug dùng MpLab SIM
Bước 1 Chọn Debugger bằng menu
Debugger_|Select Debugger_|Mplab SIM
Bước 2 Tham khảo menu Debugger Xuất hiện nhiều chức năng hỗ trợ debug
Từ đây ta đã có thể mô phỏng được chương trình của mình một cách dễ dàng
Các chức năng thường dùng :
• Run (F9): 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
• Breakpoints (F2): tạo ra breakpoint tại vị trí hiện tại của con trỏ (cũng có thể
"double click" vào hàng code mình mong muốn đặt Breakpoint)
• Step Into (F7): chạy từng bước, vào trong chương trình con (nếu gặp)
• Step Over (F8): chạy từng bước, gọi chương trình con cũng xem như 1 bước
• Reset: trở về đầu chương trình
Trang 12Bộ môn Kỹ Thuật Máy Tính 11 Thực hành Vi xử lý – Vi điều khiển
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 menu 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 menu 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
Trang 13Trường ĐH Bách Khoa TP.HCM Khoa KH & KTMT
Bộ môn Kỹ Thuật Máy Tính 12 Thực hành Vi xử lý – Vi điều khiển
1.5 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ế
1.6 Bài tập
a) Đọc 1 byte bộ nhớ chương trình tại địa chỉ 0x00 viết vào bộ nhớ EEPROM tại địa chỉ 0x10 rồi đọc EEPROM xuất ra cổng RB3 đến RB0 Chú ý nửa byte cao xuất ra trước, nửa byte thấp xuất ra sau
Trang 14
Bộ môn Kỹ Thuật Máy Tính 13 Thực hành Vi xử lý – Vi điều khiển
Bài 2 : Khảo sát cổng xuất nhập song song
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 song song
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 kiểm tra nút nhấn và hiển thị kết quả kiểm tra ra LED
Yêu cầu:
a.Viết chương trình xuất dữ liệu ra 4 led đơn đếm từ 0000 -> 1111 -> 0000 Thời gian giữa các lần đếm lên 1 đơn vị là 1s
b Viết chương trình xuất dữ liệu ra 4 led đếm theo hệ đếm O,D
2.1 Kiến thức liên quan
2.1.1 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
2.1.2 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:
Trang 15Trường ĐH Bách Khoa TP.HCM Khoa KH & KTMT
Bộ môn Kỹ Thuật Máy Tính 14 Thực hành Vi xử lý – Vi điều khiển
LED hiển thị có kết nối như sau:
Muốn các LED sáng, các chân RBi tương ứng phải lên mức 1 Riêng LED D2 còn phải nối jumper J6 lại mới sáng được khi RB0=1
Lý do có jumper JP6 là do chân RB0 còn được dùng làm ngỏ nhập nút nhấn RB0 Như vậy, lúc nào muốn dùng chân RB0 là ngỏ xuất LED thì đóng jumper JP6 lại Ngược lại, để hở JP6 sẽ dùng RB0 làm ngỏ nhập nút nhấn
Các nút nhấn có kết nối như sau:
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
Bộ dao động chính là bộ dao động ngoài tần số 4 MHz 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
2.2 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:
Trang 16Bộ môn Kỹ Thuật Máy Tính 15 Thực hành Vi xử lý – Vi điều khiển
delay1s movlw 4
movwf delay_1sa dl_2 movlw 250 ; bắt đầu vòng lặp ngoài
Bước 2 Include file p18f4520.inc vào file led_don.asm
Bước 3 Khởi tạo PORTB là cổng xuất ở các bit RB0-RB3
clrf delay ; xóa biến delay (vòng lặp 256 lần)
Trang 17Trường ĐH Bách Khoa TP.HCM Khoa KH & KTMT
Bộ môn Kỹ Thuật Máy Tính 16 Thực hành Vi xử lý – Vi điều khiển
start call init
; chuong trinh chinh
call delay1s
bra begin ; lap lai sau moi giay
; Ham khoi dong ban dau
bcf TRISB,RB0 ; cau hinh RB0 xuat
bcf TRISB,RB1 ; cau hinh RB1 xuat
bcf TRISB,RB2 ; cau hinh RB2 xuat
bcf TRISB,RB3 ; cau hinh RB3 xuat
return
dl_3
movwf call decfsz bra decfsz bra return
delay_1sb delay1ms delay_1sb dl_3 delay_1sa dl_2
LATB
delay1s begin ; lặp lại sau mỗi giây
2.3 Chương trình mẫu yêu cầu 1
list p=18f4520
#include p18f4520.inc code 0
goto start
; Vung du lieu
udata
Trang 18Bộ môn Kỹ Thuật Máy Tính 17 Thực hành Vi xử lý – Vi điều khiển
; Ham lam tre 1ms voi tan so dao dong 4MHz
clrf delay ; xoa bien delay (vong lap 256 lan)
movwf delay_1sb dl_3 call delay1ms ; bat dau vong lap trong (250 lan)
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
2.4 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:
Trang 19Trường ĐH Bách Khoa TP.HCM Khoa KH & KTMT
Bộ môn Kỹ Thuật Máy Tính 18 Thực hành Vi xử lý – Vi điều khiển
PRG code
start call init
; chuong trinh chinh
main btfsc PORTA,RA4 ; Đọc RA4 den khi RA4=0
bcf PORTB,RB0 ; tat LED RB0
goto main ; lap lai qua trinh
; Ham khoi dong ban dau
bcf TRISB,RB0 ; RB0 xuat
Bước 2
Bước 3
Include file p18f4520.inc vào file nut_nhan.asm
Khởi tạo PORTB bit RB0 là cổng xuất (jumper JP6 đóng) và PORTA bit RA4
là cổng nhập
bcf TRISB,RB0 ; RB0 xuất bsf TRISA,RA4 ; RA4 nhập
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,RA4 ; chờ đến khi RA4 được nhấn
bra Main ; lặp lại quá trình
2.5 Chương trình mẫu yêu cầu 2
list p=18f4520
#include p18f4520.inc code 0
goto start
; Vung du lieu
udata
; Chuong trinh nay khong su dung bien
; Vung bat dau code
Trang 20Bộ môn Kỹ Thuật Máy Tính Thực hành Vi xử lý – Vi điều khiển
19
bsf TRISA,RA4 ; RA4 nhap
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
2.6 Bài tập
a) 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ị theo hệ đếm H và hệ đếm O
b) 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ị theo hệ đếm D
c) Cho sơ đồ mạch loa
-
Viết chương trình phát xung 1KHz ra loa khi nhấn RA4 và ngừng phát xung khi
nhấn RA4 lần 2
+
22ØΩ
RC
2
+
-
BZI Value BUZZER- AST124ØMLTRQ
Trang 21Trường ĐH Bách Khoa TP.HCM Khoa KH & KTMT
Bộ môn Kỹ Thuật Máy Tính Thực hành Vi xử lý – Vi điều khiển
20
Bài 3 : Khảo sát cơ chế đọc trạng thái Timer, xuất dữ liệu
ra LCD ký tự
Nội dung:
Khảo sát các chế độ hoạt động của các bộ định thời
Khảo sát các thanh ghi điều khiển bộ định thời
Biết đọc trạng thái của bộ định thời trong chương trình (phương pháp polling) Xuất thời gian thực của bộ định thời ra LCD
Yêu cầu:
1 Sử dụng bộ timer 1 cứ sau 1s đếm lên 1 đơn vị rồi xuất giá trị ra LED
2 Viết chương trình thực hiện đồng hồ thời gian thực
3 Viết chương trình hiển thị đồng hồ thời gian thực lên LCD
3.1 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à
timer_polling và chọn chip 18f4520 Ta được hình sau:
Bước 2
Include file p18f4520.inc vào file timer _polling.asm
Trang 22Bộ môn Kỹ Thuật Máy Tính Thực hành Vi xử lý – Vi điều khiển
21
bcf T0CON,TMR0ON movlw 0x3c ; nap lai so dem 50000 cho timer0
movwf movlw
TMR0H 0xaf movwf
bsf
TMR0L T0CON,TMR0ON ; cho phep timer0 dem lai
movwf
bsf
return
TMR0L T0CON,TMR0ON ; cho phep timer0 dem
Bước 5 Viết chương trình con chạy trong timer, sau 1s tăng giá trị hiện thị ra ngoài led
đơn
Vì cứ 100ms thì có ngắt một lần, do đó để sau 1s ta tăng lên một giá trị thì cần 10 lần
ngắt như vậy, nên ban đầu ta phải khởi tạo cho biến delay = 10 Và đây là hàm chính thực
hiện chức năng của bài tập 1
timer0_routine
bcf INTCON,TMR0IF decfsz tmr0_var1
bra timer0_isr_1
incf PORTB movlw 10
movwf tmr0_ var1 timer0_isr_1
Trang 23Trường ĐH Bách Khoa TP.HCM Khoa KH & KTMT
Bộ môn Kỹ Thuật Máy Tính Thực hành Vi xử lý – Vi điều khiển
22
Trang 24bra tmr0_loop
rcall timer0_routine ; Nap lai bo dem
bra tmr0_loop
; Ham khoi dong ban dau
init movlw 0x0e ; PortB Digital output
movwf ADCON1
clrf PORTB ; toàn bộ PORTB là cổng xuất
clrf TRISB return
init_timer0 movlw 10
movwf tmr0_var1
bcf INTCON,TMR0IF clrf T0CON
movlw 0x3c
movwf TMR0H movlw 0xaf
movwf TMR0L bsf INTCON,TMR0IF return
timer0_routine
bcf INTCON,TMR0IF decfsz tmr0_var1,1
bra timer0_isr_1
incf LATB movlw 10
movwf tmr0_var1 timer0_isr_1
bcf T0CON,TMR0ON movlw 0x3c
Trang 25[Trường ĐH Bách Khoa TP.HCM Khoa KH & KTMT
Bộ môn Kỹ Thuật Máy Tính Thực hành Vi xử lý- Vi điều khiển
24
movwf TMR0H movlw 0xaf movwf TMR0L bsf T0CON,TMR0ON return
Dữ liệu/Lệnh đưa vào LCD
3.2.2 Tổ chức vùng nhớ của LCD
Trang 26
Bộ môn Kỹ Thuật Máy Tính Thực hành Vi xử lý- Vi điều khiển
25
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ớ từ 0x00 đến 0x0f,
hàng thứ hai hiển thị dữ liệu của ô nhớ từ 0x40 đến 0x4f, đây là vị trí home) Giá trị
của ô nhớ
0x07 là 0x43 (ký tự C), của ô nhớ 0x08 là 0x45 (ký tự E)
Chúng ta muốn hiển thị chữ “®” ở giữ hàng thứ hai, giả sử cử sổ hiển thị đang ở vị
trí home Trong bảng mẫu ký tự chúng ta thấy không có mẫu “®” Lúc này chúng ta
phải định nghĩa mẫu “®” 5x8 điểm, gồm có 8 byte, sau đó lưu vào vị trí của mẫu ký tự
CGRAM thứ nhất Lúc này giá trị của ô nhớ 0x47 là 0x00 hoặc 0x08 (vị trí của mẫu
ký tự CGRAM thứ nhất “®”)
Trang 27[Trường ĐH Bách Khoa TP.HCM Khoa KH & KTMT
Bộ môn Kỹ Thuật Máy Tính Thực hành Vi xử lý- Vi điều khiển
26
Trang 28Bộ môn Kỹ Thuật Máy Tính 27 Thực hành Vi xử lý – Vi điều khiển
3.3.3 Các lệnh giao tiếp với LCD
Read BUSY flag
Các bit trên bảng tóm tắt các lệnh có ý nghĩa như sau:
SH 1 Entire shift on 0 Entire shift off
R/L 1 Shift to the Right 0 Shift to the Left
BF 1 Internally operating 0 Can accept instruction
Trên kit thí nghiệm LCD ký tự 2x16 được kết nối vào Port D ở chế độ 4 bit Ở chế độ
4 bit, để đọc hay ghi một byte phải tiến hành cài dữ liệu hai lần, lần đầu là 4 bit cao, lần thứ hai là 4 bit thấp
Trang 29Trường ĐH Bách Khoa TP.HCM Khoa KH & KTMT
Bộ môn Kỹ Thuật Máy Tính 28 Thực hành Vi xử lý – Vi điều khiển
RD4 RD5 RD6
RD0 RD1 RD2 RD3
có giá trị 0x01 Lệnh “Function set” gửi hai lần giá trị 0x2
Trang 30Bộ môn Kỹ Thuật Máy Tính 29 Thực hành Vi xử lý – Vi điều khiển
3.4 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à LCD, tạo
file lcd.asm và chọn chip 18f4520 Ta được hình sau:
Trang 31Trường ĐH Bách Khoa TP.HCM Khoa KH & KTMT
Bộ môn Kỹ Thuật Máy Tính 30 Thực hành Vi xử lý – Vi điều khiển
Bước 2 Include file p18f4520.inc vào file lcd.asm
Bước 3 Dựa vào sơ đồ nguyên lý kết nối vi điều khiển với LCD kí tự ta define lại để dễ
Bước 4 Viết hàm xuất dữ liệu 4 bit trong biến data_4bit ra cho LCD kí tự :
Trang 32Bộ môn Kỹ Thuật Máy Tính 31 Thực hành Vi xử lý – Vi điều khiển
lcd_write_cmd ; - trong biến command
rcall lcd_wait_busy ; LCD san sang
bcf LCD_RS ; Cho phep lenh
bcf LCD_RS ; Cho phep lenh
bsf LCD_RW ; Cho phep doc
rcall delay1us ; Cho xong
bsf LCD_E ; Cho phep LCD hoat dong
rcall delay1us ; Giu cham phan cung
bcf LCD_E ; Xong, cam LCD
Trang 33Trường ĐH Bách Khoa TP.HCM Khoa KH & KTMT
Bộ môn Kỹ Thuật Máy Tính 32 Thực hành Vi xử lý – Vi điều khiển
lcd_write_4bits ; - Lay 4bit thap trong biến data_4bit
bcf LCD_RW ; Cho phep viet
bsf LCD_E ; Cho phep LCD hoat dong
rcall write_4bit_to_portD ; Xuat 4bit data
rcall delay10us ; Giu cham 10 usec
bcf LCD_E ; CAM LCD hoat dong
rcall delay10us ; Giu cham 10 usec
return
Bước 6 Sau đó viết thêm hàm truyền dữ liệu hiển thị ra LCD kí tự
Chương trình con lcd_print_char truyền dữ liệu trong biến char để hiển thị lên màn hình
LCD Như trên ta đã đề cập, trong ứng dụng này ta sử dụng LCD chế độ 4 bít, nên data ở đây được truyền theo thứ tự là 4 bit cao truyền trước sau đó 4 bít thấp được truyền sau
lcd_print_char ; -trong biến char
movlw .0 cpfseq row
movlw .16 ; current_row = 0 cpfseq col
cpfseq col
bra print2
movlw .0 ; current_col = 16
movwf row movwf col ; Xoa LCD
Trang 34Bộ môn Kỹ Thuật Máy Tính 33 Thực hành Vi xử lý – Vi điều khiển
lcd_write_data ; - trong char
bsf LCD_RS ; Cho phep xuat data
movff char,data_4bit ; Xuat 4 bit data cao ra
rcall lcd_write_cmd ; Xoa man hinh LCD
call delay5ms ; Giu cham 5msec
Bước 7.Viết chương trình khởi động LCD
Hàm quan trọng nhất của LCD kí tự chính là hàm khởi tạo LCD Trước khi sử dụng được lcd
ta phải khởi tạo cho nó theo như giản đồ khởi tạo lcd ở trên phần hướng dẫn lý thuyết Port B
vả timer được khởi tạo như trong yêu cầu 1 Ngoài ra do thiết kế mạch, để LCD có thể hiện thị bình thường trước tiên ta phải bật nguồn của LCD lên, chân nguồn của LCD được điều khiển bởi PortD.7 tích cực mức cao, nên trước khi muốn sử dụng LCD ta phải bật PortD.7 lên 1
Trang 35Trường ĐH Bách Khoa TP.HCM Khoa KH & KTMT
Bộ môn Kỹ Thuật Máy Tính 34 Thực hành Vi xử lý – Vi điều khiển
init_lcd rcall init_portD
movlw 0
movwf col
movwf row
call delay15ms ; Giu cham 15msec
bcf LCD_RS ; Cho phep gui lenh
bcf LCD_RW_DIR bcf LCD_RS_DIR bcf LCD_ON_DIR bsf LCD_ON ; Cap nguon cho LCD
Trang 36Bộ môn Kỹ Thuật Máy Tính 35 Thực hành Vi xử lý – Vi điều khiển
addwf addr
movff addr,command
rcall lcd_write_cmd ; Phat lenh
call delay5ms ; Giu cham 5msec xy3 return
xy1 movlw 0x40 ; Hang lon hon hay bang 2
mulwf row
movff PRODL,addr movf col,w
addwf addr
bra xy2 Bước 8 Đến đây ta có thể viết chương trình để hiển thị kí tự lên lcd kí tự
Ý tưởng thực hiện ở đây là lúc đầu ta khai báo một vùng nhớ gồm 32 ô nhớ tương ứng với 32 vị trí trên lcd kí tự Hàm lcd_display của chúng ta sẽ thực hiện một việc đơn giản
là lấy dữ liệu chứa trong vùng nhớ này ra hiển thị lên lcd kí tự Còn người dùng muốn hiển thị lên lcd thì chỉ cần update giá trị vào vùng nhớ này là xong
3.5 Chương trình mẫu
#include p18f4520.inc
radix dec
Trang 37Trường ĐH Bách Khoa TP.HCM Khoa KH & KTMT
Bộ môn Kỹ Thuật Máy Tính 36 Thực hành Vi xử lý – Vi điều khiển
LATD, RD0 LATD, RD1 LATD, RD2 LATD, RD3 TRISD, RD0 TRISD, RD1 TRISD, RD2 TRISD, RD3
LATD, RD6 LATD, RD5 LATD, RD4
LCD_ON LCD_ON_DIR
TRISD, RD6 TRISD, RD5 TRISD, RD4 PORTD LATD,RD7 TRISD, RD7
goto start udata
rcall init_portB ; Khoi dong portB
rcall init_timer0 ; Khoi dong timer0
tmr0_loop btfss INTCON,TMR0IF ; Kiem tra trang thai co IF
rcall timer0_routine ; Nap lai bo dem
Trang 38Bộ môn Kỹ Thuật Máy Tính 37 Thực hành Vi xử lý – Vi điều khiển
movlw 10
cpfseq tmr0_var1 ; Kiem tar bo dem 10
tmr0_1 rcall decode_ascii ; Giai ma binary sang ma ASCII
call lcd_print_char ; Xuat ra LCD
movlw 0x30 ; Nho hon hay bang 9
decode_2 addwf decode_var
movlw 0x3c
movwf TMR0H movlw 0xaf
movwf TMR0L bsf INTCON,TMR0IF return
timer0_routine
bcf INTCON,TMR0IF decfsz tmr0_var1,1
incf LATB movlw 10
movwf tmr0_var1
movlw 0x3c
movwf TMR0H movlw 0xaf movwf TMR0L bsf T0CON,TMR0ON return
init_portB movlw 0x0e ; PortB Digital output
movwf ADCON1
Trang 39Trường ĐH Bách Khoa TP.HCM Khoa KH & KTMT
Bộ môn Kỹ Thuật Máy Tính 38 Thực hành Vi xử lý – Vi điều khiển
clrf PORTB ; toàn bộ PORTB là cổng xuất
clrf TRISB return
lcd_print_char; -trong biến char
lcd_write_data ; - trong char
bsf LCD_RS ; Cho phep xuat data
movff char,data_4bit ; Xuat 4 bit data cao ra
rcall lcd_write_cmd ; Xoa man hinh LCD
call delay5ms ; Giu cham 5msec
movlw 0
movwf row
movlw 0
movwf col
Trang 40Bộ môn Kỹ Thuật Máy Tính 39 Thực hành Vi xử lý – Vi điều khiển
rcall lcd_goto_xy ; Cursor ve toa do 0,0
call delay15ms ; Giu cham 15msec
bcf LCD_RS ; Cho phep gui lenh