|
Tài trợ cho PIC Vietnam |
PIC - Thiết kế và Ứng dụng Ý tưởng cho các sản phẩm sử dụng PIC/dsPIC và các sản phẩm của Microchip |
|
Ðiều Chỉnh | Xếp Bài |
26-10-2007, 05:21 AM | #15 |
Đệ tử 2 túi
Tham gia ngày: Mar 2007
Bài gửi: 43
: |
Mình đang làm clock dùng Pic16f84A, dùng Xtal 32,768kHz, ngắt TMR0. Đang viết code phần hiển thị thời gian nhưng không hiểu sao khi mô phỏng bằng Proteus thì bị lỗi. Ai thấy lỗi chỗ nào chỉ hộ tí.
;------------Program Listing, Clock.asm ------------------------------ list p=16F84A #include <p16F84A.inc> ERRORLEVEL -302 __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _LP_OSC ;--------------------- Define Variables ------------------------------- HOURS equ 21h MINUTES equ 22h HOURS_A equ 23h MINUTES_A equ 24h MONTH equ 25h DAYS equ 26h WEEKDAY equ 27h SECONDS equ 28h AMPM_A equ 29h TIMER_LIMIT equ 2ah AMPM equ 2bh DAYLIGHT equ 2ch YEAR equ 2dh CORRECTION equ 2eh TEMP equ 35h TENS equ 36h TEMPW equ 37h SWITCH equ 38h STATUS_SAVE equ 39h TEMP1 equ 3ah ALARM equ 3bh LIMIT equ 3dh TEMP_SAVE equ 3eh TIMER equ 3fh AMPM_LED equ 40h COUNTER equ 41h ;--------------------- Program Starts here -------------------------- org 0 goto INIT org 0x04 goto Int ;--------------------- Interrupt routine to update time ------------- Int movwf TEMPW ; swapf STATUS,0 ; movwf STATUS_SAVE ; bcf STATUS,RP0 ; incf SECONDS,f ; movlw d'60' xorwf SECONDS,0 btfss STATUS,2 ; goto Done ; clrf SECONDS incf MINUTES,f movlw d'60' xorwf MINUTES,0 btfss STATUS,2 ; goto Done ; clrf MINUTES incf HOURS,f movlw d'24' xorwf HOURS,0 btfss STATUS,2 ; goto Done ; clrf HOURS Done bcf INTCON,2 swapf STATUS_SAVE,0 movwf STATUS swapf TEMPW,f swapf TEMPW,0 retfie ;--------------------- End Interrupt Procedure ---------------------- INIT ; Initialize variables bsf STATUS,RP0 ; bcf STATUS,RP1 ; movlw b'00000000' movwf TRISB ; movlw b'11100000' ; movwf TRISA ; movlw b'00000100' ; Scale 1/32 movwf OPTION_REG bcf STATUS,5 ; bcf STATUS,0 ; bcf STATUS,2 ; bcf STATUS,1 ; bsf INTCON,5 ; bcf INTCON,2 ; bsf INTCON,7 ; clrf SECONDS clrf HOURS ; clrf MINUTES ; goto Main Array ; Data for 7 segment digits addwf PCL,1 retlw b'01000000' ; "0" retlw b'01111001' ; "1" retlw b'00100100' ; "2" retlw b'00110000' ; "3" retlw b'00011001' ; "4" retlw b'00010010' ; "5" retlw b'00000010' ; "6" retlw b'01111000' ; "7" retlw b'00000000' ; "8" retlw b'00010000' ; "9" Main ; ------------ Main Loop ---------------------- call Display ; Display data goto Main ;--------------------- End of Main Loop ------------------------------ Output ; Write data to port B call Array iorwf ALARM,0 movwf PORTB return Delay ;------------------------ Delay ---- about 600 uS ------------ movlw d'25' Delay_0 movwf TEMP1 Delay_1 movwf COUNTER Delay_2 decfsz COUNTER,f goto Delay_2 decfsz TEMP1,f goto Delay_1 return Digits ; Converts value in TEMP to 2 single digits - TENS and TEMP clrf TENS movlw d'10' Loop incf TENS,f subwf TEMP,f btfss STATUS,0 goto Ones goto Loop Ones decf TENS,f addwf TEMP,f return Display ; -------------------- Display Data ----------------------- ;*********************Display Hour*************************** movf HOURS,W movwf TEMP call Digits ;******Display Tens of Hour******* movfw TENS ; call Output movlw b'00000001' movwf PORTA call Delay ;******Display Units of Hour******* movfw TEMP call Output movlw b'00000010' movwf PORTA call Delay ;*********************Display Minute************************ movf MINUTES,W movwf TEMP call Digits ;******Display Tens of Minute******* movfw TENS call Output movlw b'00000100' movwf PORTA call Delay ;******Display Units of Minute******* movfw TEMP call Output movlw b'00001000' movwf PORTA call Delay return end |
|
|