⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vidu3-3.s

📁 dsp h&#432 &#7899 ng d&#7851 n giao ti&#7871 p LCD code vi&#7871 t b&#7857 ng C
💻 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 + -