W401 Exercise 內 ex2,3,4,5 問號部份填不出來
不知誰有asm 程式 ?
( 我用 pic18f452 + 外部 8MHz crystal )
以下是自作實習板及 自己填的ex2及ex3 程式, 請指教
;**************************************************************************
;**** File : Ex2.asm
;**** 設計一個一秒鐘讓 PORTD 的 LED 自動加一的程式
;**************************************************************************
list p = 18F452
#include <p18F452.inc>
;
Temp EQU b'00000001'
TMR1_VAL EQU .2000 ; Timer1 設定為 500ms 中斷一次
;********************************************************************
;**** RESET Vector @ 0x0000
;********************************************************************
org 0x0000
bra Main
;
org 0x0008
bra Hi_ISRs
;
;********************************************************************
;**** The Main Program start from Here !!
;********************************************************************
org 0x002A
Main:
call Init_IO
call Init_Timer1
;
bsf RCON,IPEN ; Enable Interrupt priority
bsf INTCON,GIEH ; Enable all High Priority Interrupt
;
Null_Loop
goto Null_Loop ; Do loop here
;
;***********************************************************************
;**** Initial the PORTD for the output port
;***********************************************************************
Init_IO
movlw 0FFH
movwf ADCON1
movlw 0FFH
movwf TRISC
clrf TRISD
movlw b'00000001'
movwf PORTD
return
;***********************************************************************
;**** Initial Timer1 as a 500ms Timer
;***********************************************************************
Init_Timer1
movlw 0CFH ; 16-bit mode , Prescaler = 1:1 , Async mode
movwf T1CON ; Use external 32768Hz crystal , Timer1 On
;
movlw (.65536-TMR1_VAL)/.256 ; Calcute the MSB value for the Timer1
movwf TMR1H
movlw (.65536-TMR1_VAL)%.256 ; Calcute the LSB value for the Timer1
movwf TMR1L
;
movlw 001H ; Set Timer1 for high priority interrupt
movwf PIE1 ; Clear Timer1 Interrupt flag
movlw 001H
movwf IPR1
bcf PIR1, TMR1IF
bsf PIE1, TMR1IE ; Enable Timer1 Interrupt
return
;***************************************************************************************
;**** ISRs() : 中斷服務程式
;****
;***************************************************************************************
Hi_ISRs
bcf PIR1, TMR1IF ; Clear Timer1 Interrupt flag
;
movlw (.65536-TMR1_VAL)/.256 ; Calcute the MSB value for the Timer1
movwf TMR1H
movlw (.65536-TMR1_VAL)%.256 ; Calcute the LSB value for the Timer1
movwf TMR1L
addwfc PORTD,Temp
; infsnz PORTD ; PORTD = PORTD + 1;
retfie FAST ; Return with shadow register
;
END
;**************************************************************************
;**** File : Ex3.asm
;**** Read VR1 with the analog voltage input and convert the voltage
;**** to 8-bit digital on LED
;**************************************************************************
list p = 18F452
include <p18F452.inc>
;
C_Hold_Delay equ 0x20
;
;********************************************************************
;**** RESET Vector @ 0x0000
;********************************************************************
org 0x0000 ;
bra Main
;
org 0x0008 ;
bra Hi_ISRs
;
;********************************************************************
;**** The Main Program start from Here !!
;********************************************************************
org 0x002A
Main:
call Init_IO
call Init_AD
;
AD_Loop rcall C_Hold_Time ; Delay 50uS for the sample hold time
bsf ADCON0, GO ; Start convert the A/D
nop ; Nop
Check btfsc ADCON0, GO ; Check the A/D completed ?
goto Check ; A/D isn't completed yet, continut check.
swapf ADRESH, w ; save the a/D result with MSB to
;
andlw 0x0F
movwf PORTD
nop
rcall C_Hold_Time
goto AD_Loop
;***********************************************************************
;**** Initial the PORTD for the output port
;***********************************************************************
Init_IO:
clrf TRISD
clrf PORTD
;
bsf TRISA,RA0 ; Set RA0 with input mode
;
return
;***********************************************************************
;**** Initial A/D Converter
;***********************************************************************
Init_AD:
movlw b'00001110' ; Left Justified, Fosc/32
movwf ADCON1 ; Set AN0 for the Analog Input
;
movlw b'10000001' ; Fosc/32 , Select AN0 channel
movwf ADCON0 ; A/D on
;
bsf PIE1,ADIE ; Disable interrupt of A/D
return
;
;
;***********************************************************************
;**** Sample Hold (Charge) time delay routine (50uS)
;***********************************************************************
C_Hold_Time:
movlw 020H
movwf C_Hold_Delay
nop
decfsz C_Hold_Delay,F
bra $-4
return
;***************************************************************************************
;**** ISRs() : High priority interrupt service routine
;****
;***************************************************************************************
Hi_ISRs
retfie FAST ; Return with shadow register
;
END