📄 vidu3-3.s
字号:
;*******************************************************************************
; Vidu3-2.s la chuong trinh viet bang hop ngu de chay tren mot dsPIC *
; Chuong trinh thuc hien viec sau: Doc trang thai cua cac switch noi vao *
; mach, hien thi cac trang thai do ra LCD *
;*******************************************************************************
; Tac gia : Nguyen Quang Nam *
; Don vi : PIC Viet Nam *
; Ten tap tin : Vidu3-2.s *
; Ngay : 21/05/2006 *
; Phien ban : 0.01 *
; Nhung tap tin can thiet khac: p30F4012.gld, p30f4012.inc *
; Phan cung: LCD_BL = RF3 *
; LCD_EN = RE8 *
; LCD_RW = RD0 *
; LCD_RS = RD1 *
; LCD_DAT (D7..D4) = RE3..RE0 *
; S1..S5 = RB0..RB4
; Chuong trinh nay dung che do giao tiep 4-bit voi LCD, vi 4012 co it chan *
; du lieu de vua giao tiep voi LCD, vua doc cac switch *
; Cong cu duoc dung: MPLAB 7.31 *
; ASM30 2.14 *
; LNK30 2.14 *
;-------------------------------------------------------------------------------
; .equ __30F2010, 1
; .equ __30F2011, 1
; .equ __30F2012, 1
; .equ __30F3010, 1
; .equ __30F3011, 1
; .equ __30F3012, 1
; .equ __30F3013, 1
; .equ __30F3014, 1
; .equ __30F4011, 1
.equ __30F4012, 1
; .equ __30F4013, 1
.include "p30fxxxx.inc"
; config __FOSC, CSW_FSCM_OFF & HS
; config __FOSC, CSW_FSCM_OFF & HS2_PLL8
; config __FOSC, CSW_FSCM_OFF & HS2_PLL16
; config __FOSC, CSW_FSCM_OFF & FRC
config __FOSC, CSW_FSCM_OFF & FRC_PLL4
; config __FOSC, CSW_FSCM_OFF & FRC_PLL8
; config __FOSC, CSW_FSCM_OFF & XT_PLL8
; config __FOSC, CSW_FSCM_OFF & XT_PLL16
config __FWDT, WDT_OFF
config __FBORPOR, MCLR_EN & PBOR_OFF
config __FGS, CODE_PROT_OFF
;-------------------------------------------------------------------------------
;Cac hang so cua chuong trinh (gia tri tuc thoi dung trong chuong trinh)
.equiv ms_count, 125 ;So dem tuong ung voi 1 ms, cho timer 1
.equiv LCD_BL, 3 ;Tin hieu Back Light cho LCD, chan RF3
.equiv LCD_EN, 8 ;Tin hieu Enable cho LCD, chan RE8
.equiv LCD_RW, 0 ;Tin hieu Read/Write cho LCD, chan RD0
.equiv LCD_RS, 1 ;Tin hieu Reset cho LCD, chan RD1
.equiv LCD_DAT, LATE ;Cac tin hieu Data cho LCD, chan RE0..RE3 (D4..D7)
.equiv LCD_PORT, PORTE ;Can dung port de doc tin hieu vao
.equiv LCD_TRIS, TRISE ;Tristate cua cac tin hieu Data cho LCD
.equiv SW_DAT, PORTB ;Cac tin hieu Data cho switch, chan RB0..RB4 (S1..S5)
.equiv SW_TRIS, TRISB ;Tristate cua cac tin hieu Data cho switch
.equiv LCD_clear, 0x01 ;Xoa man hinh LCD
.equiv LCD_home, 0x02 ;Tro ve dau dong
.equiv LCD_normal, 0x06 ;Che do nhap du lieu binh thuong
.equiv LCD_normal_s, 0x07 ;Che do 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 con tro
.equiv LCD_on_blink, 0x0F ;Bat man hinh va con tro (nhap nhay)
.equiv LCD_4b2l, 0x28 ;Che do 2 dong, giao tiep 4 bit du lieu
.equiv LCD_homeL1, 0x80 ;Ve dau dong 1
.equiv LCD_homeL2, 0xC0 ;Ve dau dong 2
;-------------------------------------------------------------------------------
;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 1
;Khai bao bang hang so trong ROM
.section Chuoi1, psv, address(0x0300) ;Chuoi ky tu se xuat ra LCD
.asciz "S1 S2 S3 S4 S5" ;Dong ky hieu tai dong 1 cua LCD
;-------------------------------------------------------------------------------
;Khai bao cac bien trong RAM
.section .bss
.align 2 ;Chinh dia chi theo boi so cua 2
time_out: .space 2 ;Khai bao bien 'time_out' kieu word (2 byte)
sw_old: .space 2 ;Khai bao bien 'sw_old' kieu word (2 byte)
;-------------------------------------------------------------------------------
;Cac macro
.macro DelayNTcy n ;Macro tao tre n chu ky lenh, n > 2
repeat #(\n-1)
nop
.endm
;-------------------------------------------------------------------------------
;Doan ma trong vung nho chuong trinh
.text ;Bat dau doan ma chuong trinh
__reset:
mov #__SP_init, W15 ;Khoi tao con tro ngan xep (stack)
mov #__SPLIM_init, W0
mov W0, SPLIM ;Khoi tao thanh ghi gioi han con tro ngan xep (stack)
nop ;Can mot lenh NOP sau khi ghi vao SPLIM
clr W0 ;Xoa thanh ghi lam viec W0
mov W0, W14 ;Xoa cac thanh ghi W1 den W14
repeat #12
mov W0,[++W14] ;Dia chi cua cac thanh 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 thanh ghi trang PSV
mov #psvoffset(Chuoi1), W4 ;W4 la con tro den dong ky hieu
mov #(ms_count*50), W0 ;Nguong tran 50 ms cho timer 1
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 1
rcall Delay_ms ;Yeu cau cho 500 ms
wrt_loop1: ;Vong lap nay xuat dong ky hieu ra dong 1 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 LCD_dat4 ;Xuat ky tu trong W0 ra LCD
rcall LCD_BFpoll ;Cho den khi het ban
bra wrt_loop1 ;Chuyen sang ky tu ke tiep
sw_stat:
mov SW_DAT, W0 ;Doc trang thai cua cac switch
and #0x001F, W0 ;Xoa 5 bit giua (bit 5-9)
mov W0, sw_old ;va ghi vao bien luu trang thai
main_loop:
mov #LCD_homeL2, W0 ;Chuyen den dau dong thu hai
rcall LCD_cmd4
rcall LCD_BFpoll ;Cho den khi het ban
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 trong W0 ra LCD
rcall LCD_BFpoll ;Cho den khi het ban
mov.b #' ', W0 ;Them mot khoang trang
rcall LCD_dat4 ;Xuat ky tu trong W0 ra LCD
rcall LCD_BFpoll ;Cho den khi het ban
mov.b #' ', W0 ;Them mot khoang trang nua
rcall LCD_dat4 ;Xuat ky tu trong W0 ra LCD
rcall LCD_BFpoll ;Cho den khi het ban
lsr W3, W3 ;Dich phai 1 bit (doc switch ke tiep)
dec W5, W5 ;Giam so switch can cap nhat di 1
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 5 bit giua (bit 5-9)
cp sw_old ;Neu khong thay doi
bra z, sw_chg ;thi kiem tra tiep
update_LCD: ;Co thay doi, cap nhat LCD
mov W0, sw_old ;Luu trang thai moi cua cac switch
bra main_loop ;Cap nhat xong cac switch, ve vong lap chinh
;-------------------------------------------------------------------------------
;Chuong trinh con khoi tao TMR1
;TMR1 duoc dung de dem so ms troi qua, o muc xung 8 Mips (fcy = 8 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 khi TMR1 tran
return
;-------------------------------------------------------------------------------
;Chuong trinh con 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 ra
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
setm ADPCFG ;RB0..RB4 la cac chan digital
mov SW_TRIS, W0
mov #0x001F, W0
mov W0, SW_TRIS ;Cac chan du lieu RB0..RB4 la ngo vao
return
;-------------------------------------------------------------------------------
;Chuong trinh con delay bang timer 1, gia tri so dem nam trong 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 1
btss time_out, #0 ;Chua het thoi gian cho?
bra $-2 ;Dung, vay tiep tuc cho
bclr T1CON, #TON ;Tat timer 1
clr TMR1
return
;Chuong trinh con khoi tao module LCD
;-------------------------------------------------------------------------------
Init_LCD:
mov #LCD_4b2l, W0 ;Dat che do giao tiep 4-bit, man hinh 2 dong
rcall LCD_cmd4
mov #(ms_count*1), W0 ;Nguong tran 1 ms cho timer 1
rcall Delay_ms ;Yeu cau cho 1 ms
mov #LCD_off, W0 ;Tat man hinh
rcall LCD_cmd4
mov #(ms_count*1), W0 ;Nguong tran 1 ms cho timer 1
rcall Delay_ms ;Yeu cau cho 1 ms
mov #LCD_normal, W0 ;Che do nhap du lieu binh thuong
rcall LCD_cmd4
mov #(ms_count*1), W0 ;Nguong tran 1 ms cho timer 1
rcall Delay_ms ;Yeu cau cho 1 ms
mov #LCD_on_blink, W0 ;Bat man hinh, hien con tro nhap nhay
rcall LCD_cmd4
mov #(ms_count*1), W0 ;Nguong tran 1 ms cho timer 1
rcall Delay_ms ;Yeu cau cho 1 ms
mov #LCD_clear, W0 ;Xoa man hinh
rcall LCD_cmd4
mov #(ms_count*5), W0 ;Nguong tran 5 ms cho timer 1
rcall Delay_ms ;Yeu cau cho 5 ms
bclr LATF, #LCD_BL
return
;-------------------------------------------------------------------------------
;Chuong trinh con xuat lenh o che do 4 bit
;Lenh 8-bit dat trong W0, se huy noi dung cua W1, W2
;-------------------------------------------------------------------------------
LCD_cmd4:
bclr LATD, #LCD_RW
bclr LATD, #LCD_RS ;Dat che do xuat lenh
mov LCD_DAT, W1 ;Lay trang thai hien thoi cua thanh ghi chot cong E
and.b #0xF0, W1 ;Xoa 4 bit thap nhat cua LCD_DAT
mov W0, W2 ;Giu lai lenh can xuat trong W2
swap.b W0 ;Lay 4 bit cao cua lenh can xuat o RE3..RE0
and.b #0x0F, W0 ;Xoa 4 bit cao cua W0
ior.b W1, W0, W1
mov W1, LCD_DAT ;Xuat nibble cao cua lenh ra RE3..RE0
bset LATE, #LCD_EN ;Tao xung Enable
DelayNTcy 8
bclr LATE, #LCD_EN ;keo dai toi thieu 4.5 us
mov LCD_DAT, W1 ;Lay trang thai hien thoi cua thanh ghi chot cong E
and.b #0xF0, W1 ;Xoa 4 bit thap nhat cua LCD_DAT
mov W2, W0 ;Lay lai lenh can xuat tu W2 vao W0
and.b #0x0F, W0 ;Xoa 4 bit cao cua W0
ior.b W1, W0, W1
mov W1, LCD_DAT ;Xuat nibble thap cua lenh ra RE3..RE0
bset LATE, #LCD_EN ;Tao xung Enable
DelayNTcy 8
bclr LATE, #LCD_EN ;keo dai toi thieu 4.5 us
return ;Xong viec, tro ve chuong trinh goi
;-------------------------------------------------------------------------------
;Chuong trinh con xuat du lieu o che do 4 bit
;Du lieu 8-bit dat trong W0, se huy noi dung cua W1, W2
;-------------------------------------------------------------------------------
LCD_dat4:
bclr LATD, #LCD_RW
bset LATD, #LCD_RS ;Dat che do xuat du lieu
mov LCD_DAT, W1 ;Lay trang thai hien thoi cua thanh ghi chot cong E
and.b #0xF0, W1 ;Xoa 4 bit thap nhat cua LCD_DAT
mov W0, W2 ;Giu lai du lieu can xuat trong W2
swap.b W0 ;Lay 4 bit cao cua lenh can xuat o RE3..RE0
and.b #0x0F, W0 ;Xoa 4 bit cao cua W0
ior.b W1, W0, W1 ;
mov W1, LCD_DAT ;Xuat nibble cao cua du lieu ra RE3..RE0
bset LATE, #LCD_EN ;Tao xung Enable
DelayNTcy 8
bclr LATE, #LCD_EN ;keo dai toi thieu 1 us
mov LCD_DAT, W1 ;Lay trang thai hien thoi cua thanh ghi chot cong E
and.b #0xF0, W1 ;Xoa 4 bit thap nhat cua LCD_DAT
mov W2, W0 ;Lay lai du lieu can xuat tu W2 vao W0
and.b #0x0F, W0 ;Xoa 4 bit cao cua W0
ior.b W1, W0, W1 ;
mov W1, LCD_DAT ;Xuat nibble thap cua du lieu ra RE3..RE0
bset LATE, #LCD_EN ;Tao xung Enable
DelayNTcy 8
bclr LATE, #LCD_EN ;keo dai toi thieu 1 us
return ;Xong viec, tro ve chuong trinh goi
;-------------------------------------------------------------------------------
;Chuong trinh con 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 ;Dat che do doc du lieu
DelayNTcy 8
is_busy:
bset LATE, #LCD_EN ;Tao xung Enable
DelayNTcy 4
mov LCD_PORT, W1 ;Doc nibble cao (RE3..RE0 = D7..D4)
DelayNTcy 4
bclr LATE, #LCD_EN ;keo dai toi thieu 4.5 us
DelayNTcy 8
bset LATE, #LCD_EN ;Tao xung Enable
DelayNTcy 8
bclr LATE, #LCD_EN ;keo dai toi thieu 4.5 us
DelayNTcy 4
btsc W1, #3 ;Con ban hay khong?
bra is_busy ;Con, vay tiep tuc cho
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 ra
return ;Het ban, vay tro ve chuong trinh goi
;-------------------------------------------------------------------------------
;Trinh phuc vu ngat cho TMR1
;Timer 1 dung de dinh cac thoi gian cho >= 1 ms
;-------------------------------------------------------------------------------
__T1Interrupt: ;Ten nay da duoc dinh truoc trong tap tin lien ket
bclr 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 trong tap tin nay
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -