• slider image 442
  • slider image 492
  • slider image 493
  • slider image 494
  • slider image 495
  • slider image 496
  • slider image 491
:::

論壇索引


Board index » All Posts (coyyhw)




Re: 備用電源如何做 ?
#21
中級會員
中級會員


謝謝你的建議 !

這樣是否變成用電池為主電源了呢 ?

這是開放論談, 歡迎任何建言, 謝謝.

發表於: 2007/1/18 10:21
頂部


Re: 無用的I/O接腳該開路還是短路?
#22
中級會員
中級會員


這個問題一堆人討論過,結論是不要讓任何
腳 floating , 不過最正確說法還是要讓版主來回答.

發表於: 2007/1/18 8:40
頂部


Re: 備用電源如何做 ?
#23
中級會員
中級會員


謝謝 , 好方法, 我試試看 .

另外, 普通 3 號電池 2 個 應該可以維持MCU繼續運轉,有方
法切換嗎 ?


發表於: 2007/1/17 16:02
頂部


Re: PIC16F873使用ICD2--TMR0問題
#24
中級會員
中級會員


在debug mode sim 下 可看到 TIMER0 變動嗎 ?
OPTION_REG 在BANK1

發表於: 2007/1/17 12:26
頂部


Re: PIC16F873使用ICD2--TMR0問題
#25
中級會員
中級會員


應該會動的 , 可否將程式貼出來 ?

發表於: 2007/1/17 7:54
頂部


備用電源如何做 ?
#26
中級會員
中級會員


我測過 緊急停電(BROWN OUT) 及低電壓偵測(LVD) 後仍然有時間能完成 中斷副程式內有限之指令, 例如將重要之資料保存在 DATA EEPROM 內 , 因此, 應該有時間作MCU本身備用電源之轉換
,請問該如何設計電路圖 ?
(任何建議都可以, 先謝謝了)

發表於: 2007/1/16 12:13
頂部


Re: 請問中斷設定的問題
#27
中級會員
中級會員


根據 data sheet , 意義完全不同 

發表於: 2007/1/9 15:17
頂部


18F4550 sample 哪裡買  ?
#28
中級會員
中級會員


我現在海外 , 想回台灣後 買18F4550 系sample , 請問哪裡
買 , 同時 具usb 功能的MCU 還有哪些系列 ?

發表於: 2007/1/9 7:15
頂部


Table write/read 搞不懂,請幫忙.&再進一步說明如下
#29
中級會員
中級會員


偶想要將table的資料用table write方式寫入data EEPROM
,請問如何使用table write.
等了幾天無高手願意賜教 ,卡哇瘦~~
我再說詳細一點
下面是A/D數值(4位數)顯示在四個七段LED同時記錄5位數在
data EEPROM 內 , 如今想要將文字串用table write 方式寫入加在每筆資料前面 以方便閱讀 該如何作 請高手不佞賜教

;**************************************************************************
;**** File : ADdetect.asm ( use Timer1 with 8MHz crystal )
;**** Read RA0 with the analog voltage input and convert the voltage
;**** to 8-bit digital on 7-segment LED and write into EEPROM
;**** input RA0 , Output PORTD<7:4> , PORTC<7:4> is Power set
;**************************************************************************

list p = 18F452
include <p18F452.inc>
;
cblock 0x00
ADresult:1
ADcount:1
Pro_1:1
Pro_2:1
Result_Temp:1
Result_Temp0:1
Result_Temp1:1
Count1:1 ; define address for time delay count number
Count1_1:1
Count1_2:1
Count2:1
Count2_1:1
Count2_2:1
Carry_0:1
Num_Count10000:1
Num_Count1000:1
Num_Count100:1
Num_Count10:1
Num_Count0:1
endc
#define TEN b'00001010'
#define NINE b'00001001'
#define SIX b'00000110'
#define FIVE b'00000101'
#define TWO b'00000010'
#define ONE b'00000001'
#define ZERO b'00000000'
#define Count1_Init_Value 07AH ; LED digits alternately display times(SCANNING)
#define TMR1_VAL .2000
Data_EE_Addr EQU 0X010 ; This is the start of EEPROM address(can't be changed)
Data_EE_Data EQU 0X02A
EEPROM_Buffer equ 0x02
C_Hold_Delay equ 0x20
;********************************************************************
;**** RESET Vector @ 0x0000
;********************************************************************
org 0x0000 ;
bra Main
;

;********************************************************************
;**** The Main Program start from Here !!
;********************************************************************
org 0x002A
Main:

call Init_IO
clrf Data_EE_Addr
AD_Loop
rcall C_Hold_Time ; Delay 50uS for the sample hold time
bsf ADCON0, GO ; Start convert the A/D
nop ; Nop
nop
nop
Check
btfsc ADCON0, GO ; Check the A/D completed ?
goto Check ; A/D isn't completed yet, continut check.
nop
nop
nop
nop
movf ADRESH,0,0
movwf ADresult ; show result
movlw .198 ; multiply 198
mulwf ADresult,W
nop
nop
call C_Hold_Time
nop
nop
movf PRODH,0,0 ; get the msb of prod , i.e. ad value/256,max49998 for 5 V
; Max.6.528V can be detected , over will show error
movwf Pro_1
movf Pro_1,0,0
movwf ADresult
clrf ADcount
clrf Num_Count10000
clrf Num_Count1000
clrf Num_Count100
clrf Num_Count10
clrf Num_Count0
; **** Write AD result into EEPROM
goto CHECK0
CHECK0
movlw b'111111111'
cpfseq ADcount,W
goto CHECK
goto ByeBye
ByeBye
movlw b'00000000'
movwf Num_Count0
movlw b'00001000'
movwf Num_Count10
movlw b'00000010'
movwf Num_Count100
movlw b'00000101'
movwf Num_Count1000
movlw b'00000110'
movwf Num_Count10000
goto LEDdisplay

CHECK
movf ADresult,0,0
cpfseq ADcount,W
goto UPcount0
goto LEDdisplay
UPcount0
incf ADcount
movlw SIX
addwf Num_Count0,1,0
clrf Carry_0
movlw NINE
cpfsgt Num_Count0,W
goto UPgrade_10
movlw TEN
subwf Num_Count0,1,0
movlw ONE
movwf Carry_0
goto CHECK_10
UPgrade_10
movlw FIVE
addwf Num_Count10,1,0
clrf Carry_0
movlw NINE
cpfsgt Num_Count10,W
goto UPgrade_100
movlw TEN
subwf Num_Count10,1,0
movlw ONE
movwf Carry_0
goto CHECK_100
CHECK_10
movf Carry_0,0,0
addwf Num_Count10,1,0
movlw FIVE
addwf Num_Count10,1,0
clrf Carry_0
movlw NINE
cpfsgt Num_Count10,W
goto UPgrade_100
movlw TEN
subwf Num_Count10,1,0
movlw ONE
movwf Carry_0
goto CHECK_100

UPgrade_100
movlw TWO
addwf Num_Count100,1,0
clrf Carry_0
movlw NINE
cpfsgt Num_Count100,W
goto CHECK0
movlw TEN
subwf Num_Count100,1,0
movlw ONE
movwf Carry_0
goto CHECK_1000
CHECK_100
movf Carry_0,0,0
addwf Num_Count100,1,0
clrf Carry_0
movlw TWO
addwf Num_Count100,1,0
movlw NINE
cpfsgt Num_Count100,W
goto CHECK0
movlw TEN
subwf Num_Count100,1,0
movlw ONE
movwf Carry_0
goto CHECK_1000
CHECK_1000
movf Carry_0,0,0
addwf Num_Count1000,1,0
clrf Carry_0
movlw NINE
cpfsgt Num_Count1000,W
goto CHECK0
movlw TEN
subwf Num_Count1000,1,0
movlw ONE
movwf Carry_0
goto CHECK_10000
CHECK_10000
movf Carry_0,0,0
addwf Num_Count10000,1,0
movlw NINE
cpfsgt Num_Count10000,W
goto CHECK0
goto OVER_high

OVER_high
movlw b'00001111'
movwf Num_Count0
movlw b'00001111'
movwf Num_Count10
movlw b'00001111'
movwf Num_Count100
movlw b'00001111'
movwf Num_Count1000
movlw b'00001111'
movwf Num_Count10000
goto LEDdisplay
LEDdisplay ; show voltage detected X.Y on to two 7-seg leds
movlw Count1_Init_Value
nop
nop
cpfseq Count1,W
goto IncCount1
goto clrCount1
IncCount1
movf Num_Count10000,0,0
movwf PORTD,0
bsf PORTC,4 ; switch power on the portc<7> pin
call TIMER100U
bcf PORTC,4 ; switch power off the portc<7> to let next bit show on
movf Num_Count1000,0,0
movwf PORTD,0
bsf PORTC,5
call TIMER100U
bcf PORTC,5
movf Num_Count100,0,0
movwf PORTD,0
bsf PORTC,6
call TIMER100U
bcf PORTC,6
movf Num_Count10,0,0
movwf PORTD,0
bsf PORTC,7
call TIMER100U
bcf PORTC,7
incf Count1
goto LEDdisplay
clrCount1
movlw ZERO
movwf Count1
goto EEPROM_WR
EEPROM_WR
movf Num_Count10000,0,0 ; Load AD result to W
movwf Data_EE_Data
call IN_DATA_EEW
incf Data_EE_Addr ; Point to next EEPROM Address
bsf ADCON0, GO ; Start convert the A/D
nop
nop
nop
movf Num_Count1000,0,0 ; Load AD result to W
movwf Data_EE_Data
call IN_DATA_EEW
incf Data_EE_Addr ; Point to next EEPROM Address
bsf ADCON0, GO ; Start convert the A/D
nop
nop
nop
movf Num_Count100,0,0 ; Load AD result to W
movwf Data_EE_Data
call IN_DATA_EEW
incf Data_EE_Addr ; Point to next EEPROM Address
bsf ADCON0, GO ; Start convert the A/D
nop
nop
nop
movf Num_Count10,0,0 ; Load AD result to W
movwf Data_EE_Data
call IN_DATA_EEW
incf Data_EE_Addr ; Point to next EEPROM Address
bsf ADCON0, GO ; Start convert the A/D
nop
nop
nop
movf Num_Count0,0,0 ; Load AD result to W
movwf Data_EE_Data
call IN_DATA_EEW
incf Data_EE_Addr ; Point to next EEPROM Address
goto AD_Loop
;----INTERNAL EEPROM WRITE-----
;
IN_DATA_EEW
movff Data_EE_Addr,EEADR
movff Data_EE_Data,EEDATA
;
BCF EECON1,EEPGD
BCF EECON1,CFGS
BSF EECON1,WREN
;
MOVLW 0X55
MOVWF EECON2
MOVLW 0XAA
MOVWF EECON2
BSF EECON1,WR
;
LOOP1 BTFSS PIR2, EEIF
GOTO LOOP1
;
BCF EECON1,WREN
BCF PIR2,EEIF
RETURN
;***********************************************************************
;**** Initial the PORTD for the output port
;***********************************************************************
Init_IO:
BCF PIR2,EEIF
BCF PIE2,EEIE
bcf RCON,IPEN
movlw b'00000001'
movwf ADCON0
movlw b'00001110'
movwf ADCON1
bcf TRISC,4 ; LED power digit for AD 10th number
bcf TRISC,5 ; LED power digit for AD 0th number
bcf TRISC,6 ; LED power digit for AD 10th number
bcf TRISC,7 ; LED power digit for AD 0th number
bcf PORTC,4
bcf PORTC,5
bcf PORTC,6
bcf PORTC,7
clrf TRISD
movlw b'11111111'
movwf PORTD
bsf TRISA,RA0 ; Set RA0 with input mode
;
return

;***********************************************************************
;**** Sample Hold (Charge) time delay routine (50uS)
;***********************************************************************
C_Hold_Time:
movlw 0FFH
movwf C_Hold_Delay
nop
decfsz C_Hold_Delay,F
bra $-2
return
;**********************************
;* Delay time
;*********************************
TIMER100U
movlw 002H
nop
cpfseq Count2_2,0
goto Time_Loop1
goto TIMER_Finish2
Time_Loop1
incf Count2_2
Time_Loop2
movlw 005H
nop
cpfseq Count2_1,0
goto TIMER_Loop
goto TIMER_Finish1
TIMER_Loop
incf Count2_1
movlw 0C9H
movwf Count2
decfsz Count2
bra $-2
goto Time_Loop2
TIMER_Finish1
clrf Count2_1
goto TIMER100U
TIMER_Finish2
clrf Count2_2
return

END

2006.12.7 修改如下 , 將 Str1 的註釋寫入EEPROM 以便於閱讀 , 請指教 .....
;**************************************************************************
;**** File : ADdetect.asm use 8 MHz crystal
;**** Read RA0 with the analog voltage input and convert the voltage
;**** to 8-bit digital on 7-segment LED and write into EEPROM
;**** input RA0 , Output PORTD<7:4> , PORTC<7:4> is Power set
;**************************************************************************
list p = 18F452
include <p18F452.inc>
;
cblock 0x00
ADresult:1
ADcount:1
Pro_1:1
Pro_2:1
Result_Temp:1
Result_Temp0:1
Result_Temp1:1
Count1:1 ; define address for time delay count number
Count1_1:1
Count1_2:1
Count2:1
Count2_1:1
Count2_2:1
Carry_0:1
TARGET_STR:3
Num_Count10000:1
Num_Count1000:1
Num_Count100:1
Num_Count10:1
Num_Count0:1
endc
PUT_Address MACRO TARGET_STR
movf UPPER TARGET_STR,0,0
movwf TBLPTRU
movf HIGH TARGET_STR,0,0
movwf TBLPTRH
movf LOW TARGET_STR,0,0
movwf TBLPTRL
call Put_String ;
ENDM
#define TEN b'00001010'
#define NINE b'00001001'
#define SIX b'00000110'
#define FIVE b'00000101'
#define TWO b'00000010'
#define ONE b'00000001'
#define ZERO b'00000000'
#define Count1_Init_Value 07AH ; LED digits alternately display times(SCANNING)
#define TMR1_VAL .2000
Data_EE_Addr EQU 0X010 ; This is the start of EEPROM address(can't be changed)
Data_EE_Data EQU 0X02A
EEPROM_Buffer equ 0x02
C_Hold_Delay equ 0x20

;********************************************************************
;**** RESET Vector @ 0x0000
;********************************************************************
org 0x0000 ;
bra Main
;

;********************************************************************
;**** The Main Program start from Here !!
;********************************************************************
org 0x002A
Main:

call Init_IO
clrf Data_EE_Addr
call TIMER1000U
PUT_Address str1
call TIMER1000U
AD_Loop
rcall C_Hold_Time ; Delay 50uS for the sample hold time
bsf ADCON0, GO ; Start convert the A/D
nop ; Nop
nop
nop
Check
btfsc ADCON0, GO ; Check the A/D completed ?
goto Check ; A/D isn't completed yet, continut check.
nop
nop
nop
nop
movf ADRESH,0,0
movwf ADresult ; show result
movlw .196 ; multiply 196 ie FFx.1196=49998
mulwf ADresult,W
nop
nop
call C_Hold_Time
nop
nop
movf PRODH,0,0 ; get the msb of prod , i.e. ad value/256,max49998 for 5 V
; Max.6.528V can be detected , over will show error
movwf Pro_1
movf Pro_1,0,0
movwf ADresult
clrf ADcount
clrf Num_Count10000
clrf Num_Count1000
clrf Num_Count100
clrf Num_Count10
clrf Num_Count0
; **** Write AD result into EEPROM
goto CHECK0
CHECK0
movlw b'111111111'
cpfseq ADcount,W
goto CHECK
goto ByeBye
ByeBye
movlw b'00000000'
movwf Num_Count0
movlw b'00001000'
movwf Num_Count10
movlw b'00000010'
movwf Num_Count100
movlw b'00000101'
movwf Num_Count1000
movlw b'00000110'
movwf Num_Count10000
goto LEDdisplay

CHECK
movf ADresult,0,0
cpfseq ADcount,W
goto UPcount0
goto LEDdisplay
UPcount0
incf ADcount
movlw SIX
addwf Num_Count0,1,0
clrf Carry_0
movlw NINE
cpfsgt Num_Count0,W
goto UPgrade_10
movlw TEN
subwf Num_Count0,1,0
movlw ONE
movwf Carry_0
goto CHECK_10
UPgrade_10
movlw FIVE
addwf Num_Count10,1,0
clrf Carry_0
movlw NINE
cpfsgt Num_Count10,W
goto UPgrade_100
movlw TEN
subwf Num_Count10,1,0
movlw ONE
movwf Carry_0
goto CHECK_100
CHECK_10
movf Carry_0,0,0
addwf Num_Count10,1,0
movlw FIVE
addwf Num_Count10,1,0
clrf Carry_0
movlw NINE
cpfsgt Num_Count10,W
goto UPgrade_100
movlw TEN
subwf Num_Count10,1,0
movlw ONE
movwf Carry_0
goto CHECK_100

UPgrade_100
movlw TWO
addwf Num_Count100,1,0
clrf Carry_0
movlw NINE
cpfsgt Num_Count100,W
goto CHECK0
movlw TEN
subwf Num_Count100,1,0
movlw ONE
movwf Carry_0
goto CHECK_1000
CHECK_100
movf Carry_0,0,0
addwf Num_Count100,1,0
clrf Carry_0
movlw TWO
addwf Num_Count100,1,0
movlw NINE
cpfsgt Num_Count100,W
goto CHECK0
movlw TEN
subwf Num_Count100,1,0
movlw ONE
movwf Carry_0
goto CHECK_1000
CHECK_1000
movf Carry_0,0,0
addwf Num_Count1000,1,0
clrf Carry_0
movlw NINE
cpfsgt Num_Count1000,W
goto CHECK0
movlw TEN
subwf Num_Count1000,1,0
movlw ONE
movwf Carry_0
goto CHECK_10000
CHECK_10000
movf Carry_0,0,0
addwf Num_Count10000,1,0
movlw NINE
cpfsgt Num_Count10000,W
goto CHECK0
goto OVER_high

OVER_high
movlw b'00001111'
movwf Num_Count0
movlw b'00001111'
movwf Num_Count10
movlw b'00001111'
movwf Num_Count100
movlw b'00001111'
movwf Num_Count1000
movlw b'00001111'
movwf Num_Count10000
goto LEDdisplay
LEDdisplay ; show voltage detected X.Y on to two 7-seg leds
movlw Count1_Init_Value
nop
nop
cpfseq Count1,W
goto IncCount1
goto clrCount1
IncCount1
movf Num_Count10000,0,0
movwf PORTD,0
bsf PORTC,4 ; switch power on the portc<7> pin
call TIMER100U
bcf PORTC,4 ; switch power off the portc<7> to let next bit show on
movf Num_Count1000,0,0
movwf PORTD,0
bsf PORTC,5
call TIMER100U
bcf PORTC,5
movf Num_Count100,0,0
movwf PORTD,0
bsf PORTC,6
call TIMER100U
bcf PORTC,6
movf Num_Count10,0,0
movwf PORTD,0
bsf PORTC,7
call TIMER100U
bcf PORTC,7
incf Count1
goto LEDdisplay
clrCount1
movlw ZERO
movwf Count1
goto EEPROM_WR
EEPROM_WR
movf Num_Count10000,0,0 ; Load AD result to W
movwf Data_EE_Data
call IN_DATA_EEW
incf Data_EE_Addr ; Point to next EEPROM Address
bsf ADCON0, GO ; Start convert the A/D
nop
nop
nop
movf Num_Count1000,0,0 ; Load AD result to W
movwf Data_EE_Data
call IN_DATA_EEW
incf Data_EE_Addr ; Point to next EEPROM Address
bsf ADCON0, GO ; Start convert the A/D
nop
nop
nop
movf Num_Count100,0,0 ; Load AD result to W
movwf Data_EE_Data
call IN_DATA_EEW
incf Data_EE_Addr ; Point to next EEPROM Address
bsf ADCON0, GO ; Start convert the A/D
nop
nop
nop
movf Num_Count10,0,0 ; Load AD result to W
movwf Data_EE_Data
call IN_DATA_EEW
incf Data_EE_Addr ; Point to next EEPROM Address
bsf ADCON0, GO ; Start convert the A/D
nop
nop
nop
movf Num_Count0,0,0 ; Load AD result to W
movwf Data_EE_Data
call IN_DATA_EEW
incf Data_EE_Addr ; Point to next EEPROM Address
goto AD_Loop
;----INTERNAL EEPROM WRITE-----
;
IN_DATA_EEW
movff Data_EE_Addr,EEADR
movff Data_EE_Data,EEDATA
;
BCF EECON1,EEPGD
BCF EECON1,CFGS
BSF EECON1,WREN
;
MOVLW 0X55
MOVWF EECON2
MOVLW 0XAA
MOVWF EECON2
BSF EECON1,WR
;
LOOP1 BTFSS PIR2, EEIF
GOTO LOOP1
;
BCF EECON1,WREN
BCF PIR2,EEIF
RETURN
;***********************************************************************
;**** Initial the PORTD for the output port
;***********************************************************************
Init_IO:
BCF PIR2,EEIF
BCF PIE2,EEIE
bcf RCON,IPEN
movlw b'00000001'
movwf ADCON0
movlw b'00001110'
movwf ADCON1
bcf TRISC,4 ; LED power digit for AD 10th number
bcf TRISC,5 ; LED power digit for AD 0th number
bcf TRISC,6 ; LED power digit for AD 10th number
bcf TRISC,7 ; LED power digit for AD 0th number
bcf PORTC,4
bcf PORTC,5
bcf PORTC,6
bcf PORTC,7
clrf TRISD
movlw b'11111111'
movwf PORTD
bsf TRISA,RA0 ; Set RA0 with input mode
;
return

;***********************************************************************
;**** Sample Hold (Charge) time delay routine (50uS)
;***********************************************************************
C_Hold_Time:
movlw 0FFH
movwf C_Hold_Delay
nop
decfsz C_Hold_Delay,F
bra $-2
return
;**********************************
;* Delay time
;*********************************
TIMER100U
movlw 002H
nop
cpfseq Count2_2,0
goto Time_Loop1
goto TIMER_Finish2
Time_Loop1
incf Count2_2
Time_Loop2
movlw 005H
nop
cpfseq Count2_1,0
goto TIMER_Loop
goto TIMER_Finish1
TIMER_Loop
incf Count2_1
movlw 0C9H
movwf Count2
decfsz Count2
bra $-2
goto Time_Loop2
TIMER_Finish1
clrf Count2_1
goto TIMER100U
TIMER_Finish2
clrf Count2_2
return
TIMER1000U
movlw 0A2H
nop
cpfseq Count2_2,0
goto Time_Loop11
goto TIMER_Finish22
Time_Loop11
incf Count2_2
Time_Loop22
movlw 0A5H
nop
cpfseq Count2_1,0
goto TIMER_Loopp
goto TIMER_Finish11
TIMER_Loopp
incf Count2_1
movlw 0C9H
movwf Count2
decfsz Count2
bra $-2
goto Time_Loop22
TIMER_Finish11
clrf Count2_1
goto TIMER1000U
TIMER_Finish22
clrf Count2_2
return
Put_String
tblrd *+ ; get in-line string character
movf TABLAT,W ; null character (00)?
bz PutExit ; yes, exit, else
movwf Data_EE_Data
call IN_DATA_EEW
incf Data_EE_Addr ; Point to next EEPROM Address
tblrd *+ ; get in-line string character
movf TABLAT,W ; null character (00)?
bz PutExit ; yes, exit, else
movwf Data_EE_Data
call IN_DATA_EEW
incf Data_EE_Addr ; Point to next EEPROM Address
bra Put_String ; and do another
PutExit return ;

str1 da "Channel 1 Voltage AD \0"
str2 da "Channel 2 Current AD \0"
str3 da "Channel 3 Temperature AD \0"

END


發表於: 2006/11/30 8:34
頂部


Re: 組語變數可以這樣用嗎 ?
#30
中級會員
中級會員


好的,謝謝.
改成 cblock .. res .. endc 如下
(此程式已可顯示時間00:00至11:59並循環)
;**************************************************************************
;**** File : clock.asm
;**** 設計一個時鐘程式
;**************************************************************************
list p = 18F452
#include <p18F452.inc>
;
cblock 0x00
Clock_HourH:1 ; define address for hour upper digit
Clock_HourL:1 ; define address for hour lower digit
Clock_MinH:1 ; define address for minute upper digit
Clock_MinL:1 ; define address for minute lower digit
Clock_SecH:1 ; define address for second upper digit
Clock_SecL:1 ; define address for second lower digit
Count1:1 ; define address for time delay count number
Count1_1:1
Count1_2:1
Count2:1
Count2_1:1
Count2_2:1
endc
;
#define NINE b'00001001'
#define FIVE b'00000101'
#define THREE b'00000011'
#define TWO b'00000010'
#define ONE b'00000001'
#define ZERO b'00000000'
#define TEMP b'00000000'
#define TEMP1 b'00000001'
#define Count1_Init_Value 06AH ; LED digits alternately display times(SCANNING)
#define TMR1_VAL .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
movlw ZERO
movwf Clock_SecH
movlw ZERO
movwf Clock_SecL
movlw ZERO
movwf Clock_MinL
movlw ZERO
movwf Clock_MinH
movlw ZERO
movwf Clock_HourL
movlw ZERO
movwf Clock_HourH
movlw ZERO
movwf Count1
movlw ZERO
movwf Count2_1
movlw ZERO
movwf Count2_2
;


Null_Loop
goto LEDdisplay
Null_Loop1 goto CountUpSecL
goto Null_Loop ; Do loop here
;
LEDdisplay
movlw Count1_Init_Value
nop
nop
cpfseq Count1,W
goto IncCount1
goto clrCount1
goto Null_Loop1
IncCount1
movf Clock_HourH,W
movwf PORTD
bsf PORTC,7
call TIMER100U
bcf PORTC,7
movf Clock_HourL,W
movwf PORTD
bsf PORTC,6
call TIMER100U
bcf PORTC,6
movf Clock_MinH,W
movwf PORTD
bsf PORTC,5
call TIMER100U
bcf PORTC,5
movf Clock_MinL,W
movwf PORTD
bsf PORTC,4
call TIMER100U
bcf PORTC,4
incf Count1
goto LEDdisplay
clrCount1
movlw ZERO
movwf Count1
goto Null_Loop1
;***********************************************************************
;**** Initial the PORTE&PORTD for the output port
;***********************************************************************

CountUpSecL
nop
movlw b'00001001'
nop
nop
nop
cpfseq Clock_SecL,0
goto SecLCountUp
goto SecLZero

SecLCountUp
incf Clock_SecL
nop
goto Null_Loop
SecLZero
nop
movlw ZERO
movwf Clock_SecL
movlw b'00000101'
nop
nop
nop
cpfseq Clock_SecH,0
goto SecHCountUp
goto SecHZero
goto Null_Loop
SecHCountUp
nop
incf Clock_SecH
nop
goto Null_Loop
SecHZero
nop
movlw ZERO
movwf Clock_SecH
nop
movlw NINE
nop
nop
cpfseq Clock_MinL,0
goto MinLCountUp
goto MinLZero
goto Null_Loop
MinLCountUp
incf Clock_MinL
goto Null_Loop
MinLZero
movlw ZERO
movwf Clock_MinL
movlw FIVE
nop
nop
cpfseq Clock_MinH,0
goto MinHCountUp
goto MinHZero
goto Null_Loop
MinHCountUp
incf Clock_MinH
goto Null_Loop
MinHZero
movlw ZERO
movwf Clock_MinH
movlw ONE
nop
nop
cpfseq Clock_HourH,0
goto CountUpHourL
goto HourLCheck
goto Null_Loop
CountUpHourL
movlw NINE
nop
nop
cpfseq Clock_HourL,0
goto HourLCountUp
goto HourLZero
goto Null_Loop
HourLCheck
movlw ONE
nop
nop
cpfseq Clock_HourL,0
goto PureCountUpHourL
goto HourHLZero
goto Null_Loop
HourLCountUp
incf Clock_HourL
goto Null_Loop
HourLZero
movlw ZERO
movwf Clock_HourL
incf Clock_HourH
goto Null_Loop

PureCountUpHourL
incf Clock_HourL
goto Null_Loop
HourHLZero
movlw ZERO
movwf Clock_HourL
movlw ZERO
movwf Clock_HourH
goto Null_Loop
Init_IO
movlw 00FH
movwf ADCON1
bsf TRISB,0
bcf PORTB,0
clrf TRISE
movlw b'00000010'
movwf PORTE
clrf TRISD
bcf TRISC,4 ; LED power digit for Sec Low
bcf TRISC,5 ; LED power digit for Sec High
bcf TRISC,6 ; LED power digit for Min Low
bcf TRISC,7 ; LED power digit for Min High
bcf PORTC,4
bcf PORTC,5
bcf PORTC,6
bcf PORTC,7
movlw b'00000000'
movwf PORTD
call TIMER100U
call TIMER100U
call TIMER100U
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
TIMER100U
movlw 002H
nop
cpfseq Count2_2,0
goto Time_Loop1
goto TIMER_Finish2
Time_Loop1
incf Count2_2
Time_Loop2
movlw 005H
nop
cpfseq Count2_1,0
goto TIMER_Loop
goto TIMER_Finish1
TIMER_Loop
incf Count2_1
movlw 0A8H
movwf Count2
decfsz Count2
bra $-2
goto Time_Loop2
TIMER_Finish1
clrf Count2_1
goto TIMER100U
TIMER_Finish2
clrf Count2_2
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
retfie FAST ; Return with shadow register
;
END

發表於: 2006/10/19 16:38
頂部



« 1 2 (3) 4 5 »



:::

Microchip連結

https://www.facebook.com/microchiptechnologytaiwan/
http://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=13
https://mu.microchip.com/page/tmu
http://elearning.microchip.com.tw/modules/tad_link/index.php?cate_sn=1
https://page.microchip.com/APAC-PrefCenters-TW.html
http://www.microchip.com/
http://www.microchip.com/treelink
http://www.microchipdirect.com/
http://www.microchip.com.cn/newcommunity/index.php?m=Video&a=index&id=103
http://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=2
http://www.microchip.com.tw/Data_CD/eLearning/index.html
http://www.microchip.com.tw/RTC/RTC_DVD/
https://www.microchip.com/development-tools/
https://www.youtube.com/user/MicrochipTechnology
[ more... ]

教育訓練中心

!開發工具購買
辦法說明 [業界客戶] [教育單位]
----------------------------------
!校園樣品申請
辦法說明 [教師資格] [學生資格]
----------------------------------