Em mới học Pic, em không biết cách viết ngắt.
Nhờ các bác viết giúp em ngắt bằng timer sau mỗi giây một được không ạ?
Em viết bài đếm tăng dần led 7 thanh dùng ngắt mà khi chạy mô phỏng không đúng. Mong anh em xem dùm và chỉ giáo cho em biết với.
Code:
processor 16f877a
include <p16f877a.inc>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF
;-------------------
;Khai bao bien
;--------------------
count1 EQU 0x20
counta equ 0x21
countb equ 0x22 ;cac thanh ghi dung cho chuong trinh delay_1ms
hang_don_vi equ 0x23
hang_chuc equ 0x24 ;cac thanh ghi chua cac gt hang chuc va hang dv
count equ 0x25
display_reg equ 0x26
xx equ 0x27
xx1 equ 0x28 ;cac thanh ghi phu
W_save equ 0x29
PCLATH_save equ 0x30
STATUS_save equ 0x31
FSR_save equ 0x32 ;cac thanh ghi danh cho ct ngat
sodem equ 0x33
org 0x0004
goto isr
;---------------
;chuong trinh ngat
;-----------------------
isr
;---------------------
;doan chuong trinh bat buoc khi bat dau ct ngat
movwf W_save
swapf STATUS,w
clrf STATUS
movwf STATUS_save
movf PCLATH,w
movwf PCLATH_save
clrf PCLATH
movf FSR,w
movwf FSR_save
;----------------------------
;kiem tra co ngat
;---------------------------------
btfss PIR1,TMR1IF ;kiem tra co ngat cua timer1
goto exit_int
bcf T1CON,TMR1ON ;tam thoi tat timer1 de khoi tao lai
;--------------------------------
;cac thao tac chinh cua chuong trinh ngat;
;-------------------------------------------
clrf TMR1L ;khoi tao lai cac gt trong thanh ghi TMRL
clrf TMR1H ;va TMRH
movlw 0x61 ;dua vao cac thanh ghi dem cua timer1
movwf TMR1H
movlw 0xA8
movwf TMR1L
bsf T1CON,TMR1ON ;bat timer1
bcf PIR1,TMR1IF ;xoa co ngat
incf count
movlw d'5'
xorwf count,0
btfss STATUS,Z
goto exit_int ;neu chua bang 5 thoat
clrf count ;bang roai thi reset lai count
incf hang_don_vi,1 ;tang hang don vi len 1
movlw 0x0A
xorwf hang_don_vi,0 ;so sanh voi 10
btfss STATUS,Z
goto exit_int ;neu khong bang 10 thi thoat ngat
clrf hang_don_vi ;neu bang thi xoa hang don vi
incf hang_chuc,1 ;tang hang chuc len 1
movlw 0x0A
xorwf hang_chuc,0
btfss STATUS,Z ;so sanh hang chuc voi 10
goto exit_int ;khong bang 10 thi thoat ngat
clrf hang_chuc ;neu bang thi xoa hang chuc
;------------------------
;doan chuong trinh de ket thuc ngat
;-------------------------------
exit_int
movf FSR_save,w
movwf FSR
movf PCLATH_save,w
movwf PCLATH
swapf STATUS_save,w
movwf STATUS
swapf W_save,1
swapf W_save,0
retfie
org 0x0000
goto start
;-------------------------------
;chuong trinh chinh
;------------------------------
start
;--------------------------------
;khoi tao cac Port dieu khien
;------------------------------------
bcf STATUS,RP1
bsf STATUS,RP0 ;chon bank1
movlw 0x00
movwf TRISD ;gan portD la output
movlw b'11000000'
movwf TRISB
bcf STATUS,RP0
clrf PORTD
movlw b'00111111' ;tat tat ca cac Led
movwf PORTB
;-----------------------------
;khoi tao timer1
;-----------------------------
clrf T1CON
clrf INTCON
clrf TMR1H
clrf TMR1L
bsf STATUS,RP0 ;chon bank1
clrf PIE1
bsf PIE1,TMR1IE ;cho phep ngat timer1
bcf STATUS,RP0 ;chon bank0
clrf PIR1 ;xoa tat ca cac co ngat
movlw 0x30
movwf T1CON
movlw 0x61
movwf TMR1H
movlw 0xA8
movwf TMR1L
bsf T1CON,TMR1ON ;bat timer1
bsf INTCON,TMR1IE ;cho phep ngat Timer1
bsf INTCON,PEIE ;cho phep ngat ngoai vi
bsf INTCON,GIE ;cho phep toan bo cac ngat
;-------------------------------------
;khoi tao cac bien
;-------------------------------------
clrf hang_don_vi
clrf hang_chuc
;------------------------------
;vong lap chinh
;-------------------------------
main
call hien_thi
goto main
hien_thi
movf hang_chuc
call table
movwf PORTD
movlw b'11111101'
movwf PORTB
call delay_1ms
movf hang_don_vi
call table
movwf PORTD
movlw b'11111110'
movwf PORTB
call delay_1ms
return
table
addwf PCL,1
retlw 0xC0
retlw 0xF9
retlw 0xA4
retlw 0xB0
retlw 0x99
retlw 0x92
retlw 0x82
retlw 0xF8
retlw 0x80
retlw 0x90
delay_1ms
movlw d'1'
movwf count1
d2 movlw 0xC7
movwf counta
movlw 0x01
movwf countb
delay_1
decfsz counta,1
goto $+2
decfsz countb,1
goto delay_1
decfsz count1,1
goto d2
return
END
