dùng ngắt timer để quét led 7 đoạn (ASM)?

nguyenquoctrung-hhk

Thành Viên PIF
mình chưa hình dung cách quét led 7 đoạn dùng ngắt timer, mình dùng hợp ngữ, nhờ các bạn có thể nói giải thuật của phương pháp này như thế nào! cám ơn các bạn nhiều
 
phương pháp quét led thì đơn giản khi phải dùng nhiều led để hiển thị nếu dùng mỗi con là một data thì sẽ không đủ pin để điều khiển chính vì vậy mà phải dùng chung một data nhưng như vậy thì sẽ dẫn đến các led sẽ sáng giống nhau. để tránh được điều đó ta dùng thêm một số pin để chọn chip. mỗi lần ta chỉ cho phép một con sáng. và nó cứ sáng xoay vòng lần lượt từ con này đến con khác. để đảm bảo cho mắt người có thể mình thấy liên tục ( tức là khoảng cách giữa hai lần sáng gần nhau của một led phải đảm bảo mắt còn lưu ảnh của làn sáng trước đó) thì theo như tính toán và thực tế thì ít nhất trong một giây một led phải sáng không dưới 20 - 24 lần cùng một thông số đó. vậy thì để quét led dùng ngắt thì trước tiên bạn phai khởi tạo ngắt timer và cho phép timer chạy. một khi ngắt xảy ra thì bạn thay đổi vị trí của led sáng với dữ liệu mà bạn muốn xuất ra led đó. cứ như thế và xoay vòng khoảng 20 đến 24 lần là ok. rồi cho xuất dữ liệu khác nếu cần.( tức là một dữ liệu trên led ít nhất phải được hiển thị 20 đến 24 lần)
 

dinale

Trứng gà
Mỗi lần timer tràn thì: tăng biến đếm x -> off hết LED -> xuất dữ liệu cho led x -> bật led x.
Khi đã quét 1 lượt hết số Led thì cho x về 0 và cứ thế tiếp tục.
Thường thì chọn tần số quét >=50 Hz. Giả sử bạn có 4 led 7 đoạn, quét với tần số f=50Hz => T=20ms => thời gian tràn timer là 20/4=5ms.
Lưu ý cách xuất dữ liệu cho Led: trước khi xuất bạn phải tắt hết các led, đẩy dữ liệu vào rồi mới bật. Nếu mà bật trước rồi mới xuất dữ liệu thì nó chạy loạn luôn, không nhìn thấy gì luôn đó.
Chúc bạn thành công.
 

nguyenquoctrung-hhk

Thành Viên PIF
Code:
; DUNG NGAT TIMER0 DE QUET LED (4 LED 7 DOAN), TIMER1 DELAY 1S
;-----------------------------
NGHIN EQU 127
TRAM EQU 126
CHUC EQU 125
DONVI EQU 124
MOV TMOD, #21H
;-----------------------------
; KHAI BAO CAC LOAI NGAT
;-----------------------------
ORG 0000H
LJMP BEGIN
ORG 000BH
LJMP TIMER0_ISR ; NGAT TIMER0
ORG 001BH
LJMP TIMER1_ISR  ; NGAT TIMER1
;-----------------------------
BEGIN :
	MOV CHUC, #0
	MOV DONVI, #0
	MOV NGHIN, #0
	MOV TRAM, #0
	SETB EA
	SETB ET0
	SETB ET1
	SETB TR0
	SETB TR1
	MOV TH1, #(-200) ; THOI GIAN QUET 1 LED 200US
	MOV TL1, #(-200)
	MOV TH0, #HIGH (-50000) ; DAT THOI GIAN TRE
	MOV TL0, #LOW (-50000)
	MOV R5, #20 ; 20 * 50000 *1US = 1S
	MOV R0, #127
	MOV R1, #0 ; DINH VI TRI CAC LED
	SJMP $
;----------------------------	
TIMER1_ISR :
	PUSH ACC
	MOV P1, #00H
	MOV A, @R0      ;LAY DIA CHI GIAN TIEP NOI DUNG CUA O NHO 127
	MOV DPTR, #MALED7
	MOVC A, @A + DPTR
	MOV P0, A
	DEC R0     ; GIAM DIA CHI
	MOV A, R1
	MOV DPTR, #MACOT  ;  DINH VI TRI MO LED
	MOVC A, @A + DPTR
	MOV P1, A
	INC R1
	CJNE R1, #4, EXIT_TIMER1
	MOV R0, #127
	MOV R1, #0
EXIT_TIMER1:
	POP ACC
	RETI
;------------------------------
TIMER0_ISR:
	MOV TH0, #HIGH (-50000)
	MOV TL0, #LOW (-50000)
	DJNZ R5, EXIT_TIMER0
	MOV R5, #20         ; !!! GAN 200 THI MOI DUNG 1 S ????
	;--------------
	INC DONVI
	MOV A, DONVI
	CJNE A, #10, EXIT_TIMER0
	MOV DONVI, #0
	;--------------
	INC CHUC
	MOV A, CHUC
	CJNE A, #10, EXIT_TIMER0
	MOV CHUC, #0
	;--------------
	INC TRAM
	MOV A, TRAM
	CJNE A, #10, EXIT_TIMER0
	MOV TRAM, #0
	;--------------
	INC NGHIN
	MOV A, NGHIN
	CJNE A, #3, EXIT_TIMER0
	;--------------
	MOV CHUC, #0
	MOV DONVI, #0
	MOV TRAM, #0
	MOV NGHIN, #0
EXIT_TIMER0:
	RETI
;-----------------------------
MALED7 : DB 0C0H, 0F9H, 0A4H, 0B0H, 99H, 92H, 82H, 0F8H, 80H, 90H
MACOT : DB 01H, 02H,04H, 08H
;-----------------------------
END
mình không hiểu tại sao delay gán giá trị R5 = 20, mô phỏng chạy tương đương với 100ms, còn gán 200 mới chạy giống 1s., nhưng trong lý thuyêt tính thì là 20 mới đúng. các bạn có thể tham khảo góp ý dùm mình, cám ơn các bạn nhiều
 
Top