Báo cáo: Chương trình hợp ngữ giao tiếp nút nhấn/công tắc và LCD với dsPIC

15 21 0
Báo cáo: Chương trình hợp ngữ giao tiếp nút nhấn/công tắc và LCD với dsPIC

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Đây là tutorial 3 về lập trình hợp ngữ với dsPIC. Tutorial này hướng dẫn viết chương trình hợp ngữ giao tiếp với các nút nhấn/công tắc và LCD cho dsPIC: minh hoạ cách đọc tín hiệu ngõ vào số, điều khiển LCD bằng phương pháp định thời và kiểm tra cờ bận (busy flag). Một số lệnh và kỹ thuật lập trình mới cũng được giới thiệu.

Người báo cáo: Nguyễn Quang Nam Tài liệu: Ngày: 8/3/2006 Trang: TUT04.01 1/15 Tutorial no 04.01 Gửi đến: Đoàn Hiệp, www.picvietnam.com Nội dung: Chương trình hợp ngữ giao tiếp nút nhấn/cơng tắc LCD với dsPIC MICROSOFT WORD Tóm tắt: Đây tutorial lập trình hợp ngữ với dsPIC Tutorial hướng dẫn viết chương trình hợp ngữ giao tiếp với nút nhấn/công tắc LCD cho dsPIC: minh hoạ cách đọc tín hiệu ngõ vào số, điều khiển LCD phương pháp định thời kiểm tra cờ bận (busy flag) Một số lệnh kỹ thuật lập trình giới thiệu Giới thiệu Trong tutorial 2, việc xuất liệu ngõ số giới thiệu Tutorial giới thiệu thêm thao tác đọc ngõ vào số, với ví dụ cụ thể đọc trạng thái công tác trạng thái cờ bận LCD Một số lệnh thuộc nhóm lệnh di chuyển liệu, lệnh luận lý, lệnh so sánh giới thiệu Ngoài ra, macro kỹ thuật định thời dùng ngắt mức tối thiểu giới thiệu Các quy ước tài liệu Mô tả Font Palatino Linotype: Biểu thị In nghiêng Tài liệu tham khảo Viết hoa chữ đầu Một menu, hộp thoại Tên riêng (của tập tin, project, …) Đặt dấu nháy kép Ví dụ dsPIC30F/33F Programmer’s Reference Manual Chọn Project Wizard “Vidu3” Font Courier: Courier thường Mã nguồn Tên tập tin mov #0x8010, W0 Vidu3-1.s Các ví dụ cơng tắc LCD Bạn chép tập tin nguồn đính kèm vào thư mục mà bạn dùng để tạo project “Vidu3” Hình 3.1 thể sơ đồ nguyên lý mạch phần cứng Người báo cáo: Nguyễn Quang Nam Tài liệu: Ngày: 8/3/2006 Trang: TUT04.01 2/15 dùng với tutorial này, ý chân RF3 với mạch điều khiển đèn (backlight) LCD sơ đồ nguyên lý Cũng tương tự tutorial 2, bạn không cần thực phần mạch nằm khung nét đứt bạn dùng dao động nội dsPIC LCD1 RE0 RE1 RE2 RE3 D0 D1 D2 D3 D4 D5 D6 D7 10 11 12 13 14 5k RV1 RD1 RD0 RE8 VSS VDD VEE Vdd RS RW E LM016L RE[0 3] R1 33k U1 10 X1 8MHz SW1 C2 C1 33pF RD0 15 RD1 14 11 12 RB[0 4] RB4 RB3 RB2 RB1 RB0 RB4 RB3 RB2 RB1 RB0 10 11 12 13 14 33pF RB0 RB1 RB2 RB3 RB4 CLKIN/OSC1 RC15/CLKO/OSC2 MCLR RE0/PWM1L RE1/PWM1H RE2/PWM2L RE3/PWM2H RE4/PWM3L RE5/PWM3H FLT A/INT 0/RE8 RB0/CN2/VREF+/AN0/EMUD3 RB1/CN3/VREF-/AN1/EMUC3 RB2/CN4/SS1/AN2 RB3/CN5/INDX/AN3 RB4/CN6/IC7/QEA/AN4 RB5/CN7/IC8/QEB/AN5 RF2/SDA/SDI1/U1RX/EMUC/PGC RF3/SCL/SDO1/U1T X/EMUD/PGD RC13/CN1/U1AT X/T2CK/SOSCI/EMUD RC14/CN0/U1ARX/T1CK/SOSCO/EMUC EMUC2/OC1/IC1/INT1/RD0 EMUD2/OC2/IC2/INT2/RD1 AVDD AVSS 26 25 24 23 22 21 16 RE0 RE1 RE2 RE3 RE8 18 17 Vdd 28 27 DSPIC30F4012DIP RP1 10k Hình 3.1: Sơ đồ nguyên lý phần cứng dùng cho tutorial 3.1 Ví dụ 3-1 Làm theo bước tutorial để tạo project có tên “Vidu3”, sau bạn thêm vào project tập tin nguồn “Vidu3-1.s” kịch liên kết “p30f4012.gld” Để tiện theo dõi, chương trình nguồn “Vidu3-1.s” liệt kê đây, với số phần thích cắt bỏ cho thuận tiện Vì lệnh thích chi tiết, tơi giải thích số điểm chương trình, dịng lệnh mà tơi đánh số (để tiện giải thích) Liệt kê mã nguồn “Vidu3-1.s”: include "p30fxxxx.inc" config FOSC, CSW_FSCM_OFF & FRC_PLL4 config FWDT, WDT_OFF config FBORPOR, MCLR_EN & PBOR_OFF config FGS, CODE_PROT_OFF ;Clock = 32 MHz Người báo cáo: Nguyễn Quang Nam Tài liệu: Ngày: 8/3/2006 Trang: TUT04.01 3/15 ; ;Cac hang so cua chuong trinh (gia tri tuc thoi dung chuong trinh) equiv ms_count, 125 ;So dem tuong ung voi ms, cho timer equiv LCD_BL, ;Tin hieu Back Light cho LCD, chan RF3 equiv LCD_EN, ;Tin hieu Enable cho LCD, chan RE8 equiv LCD_RW, ;Tin hieu Read/Write cho LCD, chan RD0 equiv LCD_RS, ;Tin hieu Reset cho LCD, chan RD1 equiv LCD_DAT, LATE ;Cac tin hieu Data cho LCD, chan RE0 RE3 (D4 D7) equiv LCD_TRIS, TRISE ;Tristate cua cac tin hieu Data cho LCD equiv LCD_clear, 0x01 ;Xoa man hinh LCD equiv LCD_home, 0x02 ;Tro ve dau dong equiv LCD_normal, 0x06 ;Che nhap du lieu binh thuong equiv LCD_normal_s, 0x07 ;Che nhap du lieu binh thuong, dich man hinh equiv LCD_off, 0x08 ;Tat man hinh equiv LCD_on, 0x0C ;Bat man hinh equiv LCD_on_crsr, 0x0E ;Bat man hinh va tro equiv LCD_on_blink, 0x0F ;Bat man hinh va tro (nhap nhay) equiv LCD_4b2l, 0x28 ;Che dong, giao tiep bit du lieu equiv LCD_homeL1, 0x80 ;Ve dau dong equiv LCD_homeL2, 0xC0 ;Ve dau dong ; ;Cac khai bao toan cuc: global reset ;Khai bao nhan bat dau chuong trinh (bat buoc) global T1Interrupt;Khai bao toan cuc chuong trinh xu ly ngat Timer ;Khai bao bang hang so ROM section Chuoi1, psv, address(0x0300) ;Chuoi ky tu se xuat LCD asciz "Hello world!" ;Chuoi ky tu se duoc xuat LCD ; ;Khai bao cac bien RAM section bss align time_out: space ;Chinh dia chi theo boi so cua 2 ;Khai bao bien 'time_out' kieu word (2 byte) ; ;Cac macro Người báo cáo: Nguyễn Quang Nam Tài liệu: Ngày: 8/3/2006 Trang: macro DelayNTcy repeat #(\n-1) n TUT04.01 4/15 ;Macro tao tre n chu ky lenh, n > 2 nop endm ; ;Doan ma vung nho chuong trinh text ;Bat dau doan ma chuong trinh reset: mov # SP_init, W15 ;Khoi tao tro ngan xep (stack) mov # SPLIM_init, W0 mov W0, SPLIM ;Khoi tao ghi gioi han tro ngan xep (stack) nop ;Can mot lenh NOP sau ghi vao SPLIM clr W0 ;Xoa ghi lam viec W0 mov W0, W14 ;Xoa cac ghi W1 den W14 repeat #12 mov W0,[++W14] ;Dia chi cua cac ghi: 0x0002 - 0x001C clr W14 ; rcall Init_TMR1 ;Khoi tao cho TMR1 rcall Init_PORTS ;Khoi tao cac cong I/O bset CORCON, #PSV ;Cho phep dung PSV mov #psvpage(Chuoi1), W0 ;Lay dia chi cua chuoi ky tu mov W0, PSVPAG ;ghi vao ghi trang PSV mov #psvoffset(Chuoi1), W4 ;W4 la tro den chuoi ky tu mov #(ms_count*50), W0 ;Nguong tran 50 ms cho timer rcall Delay_ms ;Yeu cau cho 50 ms rcall Init_LCD ;Het thoi gian cho, vay khoi tao module LCD mov #(ms_count*500), W0 ;Nguong tran 500 ms cho timer rcall Delay_ms ;Yeu cau cho 500 ms mov.b [W4++], W0 ;Doc mot ky tu cp0.b W0 ;Da het chuoi chua? wrt_loop1: bra z, homeL2 ;Da het chuoi, vay nhay den lenh chuyen dong rcall ;Chua het chuoi, xuat ky tu W0 LCD LCD_dat4 mov #(ms_count*1), W0 ;Nguong tran ms cho timer rcall ;Yeu cau cho ms Delay_ms Người báo cáo: Nguyễn Quang Nam Tài liệu: Ngày: 8/3/2006 Trang: bra wrt_loop1 TUT04.01 5/15 ;Chuyen sang ky tu ke tiep homeL2: mov #LCD_homeL2, W0 rcall ;Chuyen den dau dong thu hai LCD_cmd4 mov #(ms_count*1), W0 ;Nguong tran ms cho timer rcall ;Yeu cau cho ms Delay_ms mov #psvoffset(Chuoi1), W4 ;W4 la tro den chuoi ky tu wrt_loop2: mov.b [W4++], W0 ;Doc mot ky tu cp0.b W0 ;Da het chuoi chua? bra z, main_loop ;Da het chuoi, vay nhay den vong lap chinh rcall ;Xuat ky tu W0 LCD LCD_dat4 mov #(ms_count*1), W0 ;Nguong tran ms cho timer rcall ;Yeu cau cho ms Delay_ms bra wrt_loop2 ;Chuyen sang ky tu ke tiep main_loop: nop nop bra main_loop ;Vong lap chinh, khong lam viec gi het ; - ;Chuong trinh khoi tao TMR1 ;TMR1 duoc dung de dem so ms troi qua, o muc xung Mips (fcy = MHz) ; Init_TMR1: clr TMR1 ;Xoa so dem cua TMR1 mov #ms_count, W0 ;TMR1 tran moi ms mov W0, PR1 ;Dat nguong tran vao PR1 bclr IFS0, #T1IF ;Xoa co ngat cua TMR1 mov #0x0020, W0 ;TMR1 dung fcy lam clock, prescale la 1:64, mov W0, T1CON ;nhung chua cho phep TMR1 chay bset IEC0, #T1IE ;Cho phep ngat TMR1 tran return ; - ;Chuong trinh khoi tao cac cong I/O, de noi voi LCD ; Init_PORTS: Người báo cáo: Nguyễn Quang Nam Tài liệu: Ngày: 8/3/2006 Trang: TUT04.01 6/15 mov LCD_DAT, W0 and.b #0xF0, W0 mov W0, LCD_DAT ;Xoa cac bit chot du lieu LCD mov LCD_TRIS, W0 and.b #0xF0, W0 mov W0, LCD_TRIS ;Cac chan du lieu LCD la ngo bset LATF, #LCD_BL ; bclr TRISF, #LCD_BL ;RF3 la ngo ra, noi vao back light LED bclr LATE, #LCD_EN ; bclr TRISE, #LCD_EN ;RE8 la ngo ra, noi vao Enable cua LCD bclr LATD, #LCD_RW ; bclr TRISD, #LCD_RW ;RD0 la ngo ra, noi vao R/W cua LCD bclr LATD, #LCD_RS ; bclr TRISD, #LCD_RS ;RD1 la ngo ra, noi vao Reset cua LCD return ; - ;Chuong trinh delay bang timer 1, gia tri so dem nam W0 ; Delay_ms: mov W0, PR1 ;Dat nguong tran vao PR1 bclr time_out, #0 ;Xoa co het thoi gian cho bset T1CON, #TON ;Bat timer btss time_out, #0 ;Chua het thoi gian cho? bra $-2 ;Dung, vay tiep tuc cho bclr T1CON, #TON ;Tat timer clr TMR1 return ;Chuong trinh khoi tao module LCD ; Init_LCD: mov #LCD_4b2l, W0 rcall ;Dat che giao tiep 4-bit, man hinh dong LCD_cmd4 mov #(ms_count*1), W0 ;Nguong tran ms cho timer rcall ;Yeu cau cho ms Delay_ms mov #LCD_off, W0 rcall ;Tat man hinh LCD_cmd4 mov #(ms_count*1), W0 ;Nguong tran ms cho timer rcall ;Yeu cau cho ms Delay_ms mov #LCD_normal, W0 ;Che nhap du lieu binh thuong Người báo cáo: Nguyễn Quang Nam Tài liệu: Ngày: 8/3/2006 Trang: rcall TUT04.01 7/15 LCD_cmd4 mov #(ms_count*1), W0 ;Nguong tran ms cho timer rcall ;Yeu cau cho ms Delay_ms mov #LCD_on_blink, W0 rcall ;Bat man hinh, hien tro nhap nhay LCD_cmd4 mov #(ms_count*1), W0 ;Nguong tran ms cho timer rcall ;Yeu cau cho ms Delay_ms mov #LCD_clear, W0 rcall ;Xoa man hinh LCD_cmd4 mov #(ms_count*5), W0 ;Nguong tran ms cho timer rcall ;Yeu cau cho ms Delay_ms bclr LATF, #LCD_BL return ; - ;Chuong trinh xuat lenh o che bit ;Lenh 8-bit dat W0, se huy noi dung cua W1, W2 ; LCD_cmd4: bclr LATD, #LCD_RW bclr LATD, #LCD_RS ;Dat che xuat lenh mov LCD_DAT, W1 ;Lay trang thai hien thoi cua ghi chot cong E and.b ;Xoa bit thap nhat cua LCD_DAT #0xF0, W1 mov W0, W2 ;Giu lai lenh can xuat W2 swap.b W0 ;Lay bit cao cua lenh can xuat o RE3 RE0 and.b #0x0F, W0 ;Xoa bit cao cua W0 ior.b W1, W0, W1 mov W1, LCD_DAT ;Xuat nibble cao cua lenh RE3 RE0 bset LATE, #LCD_EN ;Tao xung Enable DelayNTcy bclr LATE, #LCD_EN ;keo dai toi thieu us mov LCD_DAT, W1 ;Lay trang thai hien thoi cua ghi chot cong E and.b ;Xoa bit thap nhat cua LCD_DAT #0xF0, W1 mov W2, W0 ;Lay lai lenh can xuat tu W2 vao W0 and.b #0x0F, W0 ;Xoa bit cao cua W0 ior.b W1, W0, W1 mov W1, LCD_DAT ;Xuat nibble thap cua lenh RE3 RE0 bset LATE, #LCD_EN ;Tao xung Enable DelayNTcy bclr LATE, #LCD_EN ;keo dai toi thieu us return ;Xong viec, tro ve chuong trinh goi Người báo cáo: Nguyễn Quang Nam Tài liệu: Ngày: 8/3/2006 Trang: TUT04.01 8/15 ; - ;Chuong trinh xuat du lieu o che bit ;Du lieu 8-bit dat W0, se huy noi dung cua W1, W2 ; LCD_dat4: bclr LATD, #LCD_RW bset LATD, #LCD_RS ;Dat che xuat du lieu mov LCD_DAT, W1 ;Lay trang thai hien thoi cua ghi chot cong E and.b ;Xoa bit thap nhat cua LCD_DAT #0xF0, W1 mov W0, W2 ;Giu lai du lieu can xuat W2 swap.b W0 ;Lay bit cao cua lenh can xuat o RE3 RE0 and.b #0x0F, W0 ;Xoa bit cao cua W0 ior.b W1, W0, W1 ; mov W1, LCD_DAT ;Xuat nibble cao cua du lieu RE3 RE0 bset LATE, #LCD_EN ;Tao xung Enable DelayNTcy bclr LATE, #LCD_EN ;keo dai toi thieu us mov LCD_DAT, W1 ;Lay trang thai hien thoi cua ghi chot cong E and.b ;Xoa bit thap nhat cua LCD_DAT #0xF0, W1 mov W2, W0 ;Lay lai du lieu can xuat tu W2 vao W0 and.b #0x0F, W0 ;Xoa bit cao cua W0 ior.b W1, W0, W1 ; mov W1, LCD_DAT ;Xuat nibble thap cua du lieu RE3 RE0 bset LATE, #LCD_EN ;Tao xung Enable DelayNTcy bclr LATE, #LCD_EN ;keo dai toi thieu us return ;Xong viec, tro ve chuong trinh goi ; - ;Trinh phuc vu ngat cho TMR1 ;Timer dung de dinh cac thoi gian cho >= ms, va toi da khoang 500 ms ; T1Interrupt: bclr ;Ten da duoc dinh truoc tap tin lien ket IFS0, #T1IF ;Truoc tien, can xoa co ngat bset time_out, #0 ;Bat co het thoi gian cho retfie ;Tro ve tu ngat ; - end ;Ket thuc phan ma tap tin Người báo cáo: Nguyễn Quang Nam Tài liệu: Ngày: 8/3/2006 Trang: TUT04.01 9/15 Các dòng phần thân macro DelayNTcy, dùng để tạo trễ n chu kỳ lệnh (với n > 2, để làm trễ hay chu kỳ lệnh có lệnh nop hay bra $+2) Bạn dùng dẫn hướng macro để khai báo điểm bắt đầu macro, tên macro danh sách đối số (nếu có), dùng endm để đánh dấu điểm kết thúc macro Nếu bạn khai báo đối số ds với dẫn hướng macro, bạn truy xuất đối số macro cách dùng \ds hay &ds& Dạng truy xuất thứ hai (&ds&) cho phép bạn nối đối số với ký tự để tạo tên ký hiệu Trong macro DelayNTcy, dùng đối số n, để đặt tham số cho lệnh repeat Do đặc điểm lệnh repeat, đặt tham số cho lệnh n1 cần lặp lại n lần lệnh Để đảm bảo thứ tự tính tốn trình hợp dịch khai triển macro, viết #(\n–1) để khai triển phép trừ thực trước, đối số lệnh repeat giá trị tức thời Dòng minh họa cách dùng macro chương trình Bạn tham khảo thêm phần “6.11 Directives for substitution/expansion“ tài liệu MPLAB® ASM30/LINK30 and Utilities User’s Guide (phiên thời DS51317E) macro dẫn hướng tương tự dùng cho việc thay khai triển hợp dịch Tại dòng 3, gặp lệnh mới, cp0 Lệnh cho phép so sánh ghi (nằm 8192 địa RAM đầu tiên) với giá trị zero (0) Bạn so sánh byte hay word, cách dùng phần mở rộng B W tương ứng Bạn dùng lệnh với chế độ định vị gián tiếp, bạn cập nhật ghi trỏ lệnh Tại dòng lệnh and ior, dùng để thực phép toán logic AND OR Bạn ý từ khóa cho lệnh thực phép tốn OR ior (inclusive or), đối lập với lệnh thực phép toán XOR xor (exclusive or) Các lệnh cho phép bạn thao tác byte hay word, với phần mở rộng tương ứng dùng lệnh Như chương trình minh họa, bạn dùng toán hạng tức thời với ghi làm việc Wn, hai toán hạng ghi làm việc Wb, Ws ghi kết vào ghi làm việc thứ ba Wd Ngồi ra, bạn cịn dùng ô nhớ ghi làm việc WREG (W0), hay ghi làm việc Wb toán hạng tức thời, ghi kết vào ghi làm việc Wd Dịng ví dụ lệnh hoán đổi nibble byte, swap.b Đương nhiên phần mở rộng b để thao tác byte Nếu bạn dùng phần mở rộng w hay dùng swap (vì phần mở rộng w hiểu ngầm), bạn thực hoán đổi byte word Lệnh swap chấp nhận toán hạng ghi làm việc Wn Bạn để ý chương trình xử lý ngắt ngắn, ngồi lệnh bắt buộc phải có xóa cờ ngắt trở từ ngắt, tơi dùng thêm lệnh để bật cờ báo hiệu hết thời gian chờ Như vậy, chương trình xử lý ngắt chiếm phần Người báo cáo: Nguyễn Quang Nam Tài liệu: Ngày: 8/3/2006 Trang: TUT04.01 10/15 nhỏ tổng thời gian thực thi tồn chương trình, bạn dễ dàng xử lý nhiều ngắt mức ưu tiên cách nhanh chóng Một điểm ý khác chương trình chương trình khởi tạo LCD Theo tài liệu kỹ thuật chip HD44780U (đa số chip điều khiển LCD dạng văn tương thích với chip này) việc khởi tạo chế độ giao tiếp bit cần tuân theo quy trình sau: - Ghi giá trị hex 3x (x chữ số hex bất kỳ), sau chờ 4.1 ms - Ghi giá trị hex 3x, sau chờ 100 µs - Ghi giá trị hex 3x, đến giá trị hex 2x Kể từ thời điểm này, chip giao tiếp chế độ 4-bit Tuy nhiên, thử nghiệm thực tế cho thấy bỏ qua lệnh ghi giá trị hex 3x mà giao tiếp với LCD chế độ 4-bit, module LCD vừa làm việc chế độ giao tiếp 4-bit trước Tơi cho số module LCD ghi nhớ chế độ giao tiếp gần Do đó, bạn khơng thể khởi tạo module LCD chương trình đưa đây, bạn bổ sung thêm dòng lệnh sau vào trước lệnh chương trình khởi tạo LCD Phần bổ sung cho chương trình khởi tạo LCD: mov #0x33, W0 rcall ;Ghi 0x33 lan thu nhat LCD_cmd4 mov #(ms_count*5), W0 ;Nguong tran ms cho timer rcall ;Yeu cau cho ms Delay_ms mov #0x33, W0 rcall ;Ghi 0x33 lan thu hai LCD_cmd4 mov #13, W0 ;Nguong tran 100 us cho timer rcall ;Yeu cau cho 100 us Delay_ms mov #0x33, W0 rcall ;Ghi 0x33 lan thu ba LCD_cmd4 Ví dụ 3-2 Thực thao tác tương tự tutorial 2, bạn loại bỏ tập tin “Vidu3-1.s” khỏi project, thêm tập tin “Vidu3-2.s” vào project Trong ví dụ này, chương trình thay đổi đôi chút để thực việc đọc trạng thái cơng tắc bên ngồi (nối vào ) hiển thị trạng thái cơng tắc LCD Một số định nghĩa cho ghi liên quan đến công tắc thực hiện, để tránh lặp lại phần mã chương trình q nhiều Vì có chương trình chương trình dùng để khởi tạo cổng vào/ra có thay đổi, nên tơi liệt kê phần mã Người báo cáo: Nguyễn Quang Nam Tài liệu: Ngày: 8/3/2006 Trang: TUT04.01 11/15 Trích mã nguồn “Vidu3-2.s”: ; ;Doan ma vung nho chuong trinh text ;Bat dau doan ma chuong trinh reset: mov # SP_init, W15 ;Khoi tao tro ngan xep (stack) mov # SPLIM_init, W0 mov W0, SPLIM ;Khoi tao ghi gioi han tro ngan xep (stack) nop ;Can mot lenh NOP sau ghi vao SPLIM clr W0 ;Xoa ghi lam viec W0 mov W0, W14 ;Xoa cac ghi W1 den W14 repeat #12 mov W0,[++W14] ;Dia chi cua cac ghi: 0x0002 - 0x001C clr W14 ; rcall Init_TMR1 ;Khoi tao cho TMR1 rcall Init_PORTS ;Khoi tao cac cong I/O bset CORCON, #PSV ;Cho phep dung PSV mov #psvpage(Chuoi1), W0 ;Lay dia chi cua chuoi ky tu mov W0, PSVPAG ;ghi vao ghi trang PSV mov #psvoffset(Chuoi1), W4 ;W4 la tro den dong ky hieu mov #(ms_count*50), W0 ;Nguong tran 50 ms cho timer rcall Delay_ms ;Yeu cau cho 50 ms rcall Init_LCD ;Het thoi gian cho, vay khoi tao module LCD mov #(ms_count*500), W0 ;Nguong tran 500 ms cho timer rcall ;Yeu cau cho 500 ms Delay_ms wrt_loop1: ;Vong lap xuat dong ky hieu dong LCD mov.b [W4++], W0 ;Doc mot ky tu cp0.b W0 ;Da het chuoi chua? bra z, sw_stat ;Da het chuoi, vay khoi tao trang thai switch rcall ;Xuat ky tu W0 LCD LCD_dat4 mov #(ms_count*1), W0 ;Nguong tran ms cho timer rcall ;Yeu cau cho ms Delay_ms bra wrt_loop1 sw_stat: ;Chuyen sang ky tu ke tiep Người báo cáo: Nguyễn Quang Nam Tài liệu: Ngày: 8/3/2006 Trang: TUT04.01 12/15 mov SW_DAT, W0 ;Doc trang thai cua cac switch and #0x001F, W0 ;Xoa 11 bit cao nhat mov W0, sw_old ;va ghi vao bien luu trang thai main_loop: mov #LCD_homeL2, W0 rcall ;Chuyen den dau dong thu hai LCD_cmd4 mov #(ms_count*1), W0 ;Nguong tran ms cho timer rcall ;Yeu cau cho ms Delay_ms mov sw_old, W3 mov #5, W5 ;So switch can cap nhat trang thai updat_loop: mov.b #'0', W0 ;Gia su muc '0' btsc W3, #0 ;Kiem tra bit thap nhat mov.b #'1', W0 ;Dang la muc '1', dat lai ky tu can xuat rcall LCD_dat4 ;Xuat ky tu W0 LCD mov #(ms_count*1), W0 ;Nguong tran ms cho timer rcall Delay_ms ;Yeu cau cho ms mov.b #' ', W0 ;Them mot khoang trang rcall LCD_dat4 ;Xuat ky tu W0 LCD mov #(ms_count*1), W0 ;Nguong tran ms cho timer rcall Delay_ms ;Yeu cau cho ms mov.b #' ', W0 ;Them mot khoang trang nua rcall LCD_dat4 ;Xuat ky tu W0 LCD mov #(ms_count*1), W0 ;Nguong tran ms cho timer rcall ;Yeu cau cho ms Delay_ms lsr W3, W3 ;Dich phai bit (doc switch ke tiep) dec W5, W5 ;Giam so switch can cap nhat di bra nz, updat_loop ;Cap nhat tiep neu chua het sw_chg: mov SW_DAT, W0 ;Doc trang thai cua cac switch and #0x001F, W0 ;Xoa 11 bit cao nhat cp ;Neu khong thay doi sw_old bra z, sw_chg update_LCD: ;thi kiem tra tiep ;Co thay doi, cap nhat LCD mov W0, sw_old ;Luu trang thai moi cua cac switch bra main_loop ;va cap nhat cac switch ; - Người báo cáo: Nguyễn Quang Nam Tài liệu: Ngày: 8/3/2006 Trang: TUT04.01 13/15 ;Chuong trinh khoi tao cac cong I/O, de noi voi LCD, va cac switch ; Init_PORTS: mov LCD_DAT, W0 and.b #0xF0, W0 mov W0, LCD_DAT ;Xoa cac bit chot du lieu LCD mov LCD_TRIS, W0 and.b #0xF0, W0 mov W0, LCD_TRIS ;Cac chan du lieu LCD la ngo bset LATF, #LCD_BL bclr TRISF, #LCD_BL bclr LATE, #LCD_EN bclr TRISE, #LCD_EN bclr LATD, #LCD_RW bclr TRISD, #LCD_RW bclr LATD, #LCD_RS bclr TRISD, #LCD_RS ;RD1 la ngo ra, noi vao Reset cua LCD setm ADPCFG ;RB0 RB4 la cac chan digital ;RF3 la ngo ra, noi vao back light LED ;RE8 la ngo ra, noi vao Enable cua LCD ;RD0 la ngo ra, noi vao R/W cua LCD mov #0x001F, W0 mov W0, SW_TRIS ;Cac chan du lieu RB0 RB4 la ngo vao return ; - Hoạt động chương trình giải thích vắn tắt sau Sau thực khởi tạo cho cổng vào/ra, định thời Timer 1, LCD, chương trình xuất dịng ký hiệu ‘S1 S2 S3 S4 S5’ dòng LCD Tiếp đến, chương trình đọc trạng thái ban đầu cơng tắc vào vịng lặp Vịng lặp xuất thông tin trạng thái công tắc dịng LCD, sau kiểm tra xem có thay đổi trạng thái cơng tắc hay không, thực cập nhật trạng thái cơng tắc có thay đổi kể từ lần cập nhật trước Cần lưu ý lệnh đọc trạng thái công tắc đọc từ port B đọc từ latch B Do hoạt động read-modify-write số lệnh, ghi LATx dùng để khắc phục tình trạng ghi chốt trạng thái cổng bị ghi giá trị chân ngõ vào Như vậy, việc ghi vào PORTx LATx có tác dụng, ghi vào ghi chốt trạng thái cổng Việc đọc ghi PORTx đọc giá trị chân ngõ vào việc đọc ghi LATx đọc giá trị lưu giữ ghi chốt trạng thái cổng Người báo cáo: Nguyễn Quang Nam Tài liệu: Ngày: 8/3/2006 Trang: TUT04.01 14/15 Trong ví dụ có lệnh dùng, cp setm Lệnh cp dùng để so sánh hai giá trị, hai giá trị phải lưu ghi làm việc Wn, đặc biệt phải lưu ghi WREG (W0) toán hạng thứ hai ghi (ơ nhớ) bình thường nằm 8192 địa RAM Tốn hạng thứ hai tốn hạng tức thời (có độ lớn 5-bit) hay ghi làm việc khác Lệnh setm thực thao tác ngược lại với lệnh clear Lệnh setm dùng để bật (đặt 1) tất bit ghi làm việc hay ghi bình thường nằm 8192 địa RAM 3.2 Ví dụ 3-3 Bạn loại bỏ tập tin “Vidu3-2.s” khỏi project, thêm vào project tập tin “Vidu3-3.s” Ví dụ khác ví dụ 3-2 điểm cờ bận LCD kiểm tra ví dụ thay dùng khoảng thời gian chờ ví dụ 3-2 Khi thực việc kiểm tra cờ bận, chân giao tiếp liệu với LCD cần đổi chiều truyền thông tin, cần ý việc thiết lập bit TRIS (điều khiển chiều liệu) cho chân liệu Để cho gọn, liệt kê phần mã chương trình kiểm tra trạng thái cờ bận Trích mã nguồn “Vidu3-3.s”: ;Chuong trinh poll bit trang thai BF cua LCD ;Se huy noi dung cua W0, W1, W2 ; LCD_BFpoll: mov LCD_TRIS, W2 ior.b #0x0F, W2 mov W2, LCD_TRIS ;Cac chan du lieu LCD la ngo vao bset LATD, #LCD_RW bclr LATD, #LCD_RS DelayNTcy ;Dat che doc du lieu is_busy: bset LATE, #LCD_EN DelayNTcy mov ;Tao xung Enable LCD_PORT, W1 ;Doc nibble cao (RE3 RE0 = D7 D4) DelayNTcy bclr LATE, #LCD_EN DelayNTcy bset LATE, #LCD_EN DelayNTcy ;Tao xung Enable bclr LATE, #LCD_EN DelayNTcy ;keo dai toi thieu 4.5 us ;keo dai toi thieu 4.5 us Người báo cáo: Nguyễn Quang Nam Tài liệu: Ngày: 8/3/2006 Trang: btsc W1, #3 ;Con ban hay khong? bra is_busy ;Con, vay tiep tuc cho TUT04.01 15/15 mov LATE, W0 and.b #0xF0, W0 mov W0, LATE mov LCD_TRIS, W2 and.b #0xF0, W2 mov W2, LCD_TRIS ;Cac chan du lieu LCD la ngo return ;Het ban, vay tro ve chuong trinh goi ; - Chương trình trực quan, ngoại trừ điểm cần ý nên đặt trạng thái ghi LAT trước đổi chiều chân I/O từ ngõ vào thành ngõ Điều giúp tránh gai điện áp (glitch) xuất chân I/O đổi chiều liệu Tóm tắt Qua tutorial này, số lệnh giới thiệu, với kỹ thuật đọc ngõ vào Một số chương trình dùng cho giao tiếp LCD cung cấp, bạn sử dụng chúng tập hợp nhỏ hàm thực giao tiếp LCD chương trình bạn Hai kỹ thuật mới: macro định thời dùng ngắt tối thiểu trình bày Mong bạn hiểu thêm đôi chút phần vi điều khiển dsPIC, từ tiến gần đến việc làm chủ dịng chip nhiều tiềm Chúc bạn thành công! ... module LCD ghi nhớ chế độ giao tiếp gần Do đó, bạn khơng thể khởi tạo module LCD chương trình đưa đây, bạn bổ sung thêm dòng lệnh sau vào trước lệnh chương trình khởi tạo LCD Phần bổ sung cho chương. .. quan đến công tắc thực hiện, để tránh lặp lại phần mã chương trình q nhiều Vì có chương trình chương trình dùng để khởi tạo cổng vào/ra có thay đổi, nên tơi liệt kê phần mã Người báo cáo: Nguyễn... thực khởi tạo cho cổng vào/ra, định thời Timer 1, LCD, chương trình xuất dịng ký hiệu ‘S1 S2 S3 S4 S5’ dòng LCD Tiếp đến, chương trình đọc trạng thái ban đầu cơng tắc vào vịng lặp Vịng lặp xuất

Ngày đăng: 26/04/2021, 03:00

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan