中級會員
Joined
: 2005/12/1 12:19 最後登入時間
: 2017/5/24 11:41
Group:
註冊會員
Level : 5 HP : 0 / 110 MP : 14 / 5988 EXP : 43
|
偶想要將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
|