?? 9821h620.asm
字號:
;Project: FS9821小臺秤
;FileName: 9821H620.ASM
;Ver: H620
;Body: Fortune FS9821
;Author: kangguang
;Modify Date: 2004-11-18
;==============================================================================
include FS9821.inc ;FS9821特殊功能寄存器定義(00H-7FH)
;------------------------------------------------------------------------------
;常數(shù)定義
D_DayL equ 8
D_DayH equ 1
D_MonthL equ 1
D_MonthH equ 1
;
D_TraceCnt equ 8 ;自動追蹤判斷參數(shù)
;
D_CaliMark1 equ 5AH
D_CaliMark2 equ 0A5H
D_OverCodeL equ 24H ;超載內(nèi)碼0F424H=62500d
D_OverCodeH equ 0F4H
;
;LCD Character table (D7-D0=f、g、e、d、a、b、c、dp)
;LCD Character table (2004-11-18改為 D7-D0=dp、c、b、a、d、e、g、f)
Lcdch0 equ 01111101B ; 10111110B ;"0"
Lcdch1 equ 01100000B ; 00000110B ;"1"
Lcdch2 equ 00111110B ; 01111100B ;"2"
Lcdch3 equ 01111010B ; 01011110B ;"3"
Lcdch4 equ 01100011B ; 11000110B ;"4"
Lcdch5 equ 01011011B ; 11011010B ;"5"
Lcdch6 equ 01011111B ; 11111010B ;"6"
Lcdch7 equ 01110001B ; 10001110B ;"7"
Lcdch8 equ 01111111B ; 11111110B ;"8"
Lcdch9 equ 01111011B ; 11011110B ;"9"
LcdchA equ 01110111B ; 11101110B ;"A"
Lcdchb equ 01001111B ; 11110010B ;"b"
LcdchC equ 00011101B ; 10111000B ;"C"
Lcdchd equ 01101110B ; 01110110B ;"d"
LcdchE equ 00011111B ; 11111000B ;"E"
LcdchF equ 00010111B ; 11101000B ;"F"
LcdNull equ 00000000B ; 00000000B ;" "
LcdDash equ 00000010B ; 01000000B ;"-"
LcdchL equ 00001101B ; 10110000B ;"L"
Lcdcho equ 01001110B ; 01110010B ;"o"
Lcdchr equ 00000110B ; 01100000B ;"r"
LcdchH equ 01100111B ; 11100110B ;"H"
LcdchP equ 00110111B ; 11101100B ;"P"
Lcdequ equ 00001010B ; 01010000B ;"="
;I/O
EEPROM equ PT2
VCC equ 6
CS equ 5
CLK equ 4
DI equ 3
DO equ 3
;------------------------------------------------------------------------------
;通用RAM定義(80H-0FFH)
R_STATUSbak equ 80H
R_WORKbak equ 81H
R_WorkStatus equ 82H ;D7-D4相當(dāng)于6613中的46H,D3-D0相當(dāng)于47H
R_Temp equ 83H
R_Count equ 84H ;相當(dāng)于6613中的6DH
R_PubFlag0 equ 85H
; R_PubFlag0.0=1 1/16秒到
; R_PubFlag0.1=1 1/2秒到
; R_PubFlag0.2=0 1/8秒到
; R_PubFlag0.3=1 讀到ADC內(nèi)碼
; R_PubFlag0.4=1 有效內(nèi)碼
; R_PubFlag0.5=1時稱重數(shù)據(jù)穩(wěn)定,鎖定
; R_PubFlag0.6=1 零點(diǎn)(內(nèi)碼)穩(wěn)定
; R_PubFlag0.7=1 已經(jīng)找到穩(wěn)定零點(diǎn),零點(diǎn)內(nèi)碼未保存
R_PubFlag1 equ 86H
; R_PubFlag1.0=1 表示"TARE"鍵按下5秒
; R_PubFlag1.1=1 表示當(dāng)前環(huán)境溫度<第一環(huán)境溫度值
; R_PubFlag1.2=1 表示當(dāng)前測得的額定重量值<最大分度數(shù)
; R_PubFlag1.3=1 減法結(jié)果為負(fù)數(shù)
; R_PubFlag1.4=1 超載
; R_PubFlag1.5=1 自動追蹤判斷時內(nèi)碼差值為負(fù)數(shù)
; R_PubFlag1.6=1 顯示穩(wěn)定符號"STABLE"
; R_PubFlag1.7=1 Timer中斷
R_PubReg0 equ 87H ;相當(dāng)于6613中的69H:68H
R_PubReg1 equ 88H ;相當(dāng)于6613中的6BH:6AH
R_PubReg2 equ 89H ;相當(dāng)于6613中的61H:60H
R_PubReg3 equ 8AH ;相當(dāng)于6613中的63H:62H
R_PubReg4 equ 8BH ;相當(dāng)于6613中的65H:64H
R_PubReg5 equ 8CH ;相當(dāng)于6613中的67H:66H
R_PubCnt0 equ 8DH ;相當(dāng)于6613中的6CH
R_PubCnt1 equ 8EH ;相當(dāng)于6613中的49H:48H
R_PubCnt2 equ 8FH ;相當(dāng)于6613中的5FH:5EH
R_PubCnt3 equ 90H ;相當(dāng)于6613中的6FH:6EH
R_TimerCnt equ 91H ;計時用(單位:1/8秒),相當(dāng)于6613中的2BH:2AH
R_KeyStatus equ 92H ;按鍵狀態(tài),D0-D2分別對應(yīng)"OFF"、"UNIT"、"TARE"鍵,=1時鍵按下
; ;R_KeyStatus.4=1 表示按鍵狀態(tài)已保存
; ;R_KeyStatus.5=1 表示按鍵時間已到2秒
; ;R_KeyStatus.6=1 表示按鍵時間已到5秒或20秒
; ;R_KeyStatus.7==1 表示按鍵狀態(tài)穩(wěn)定
R_KeyCode equ 93H ;鍵碼,D2:D0=100/101/110/111分別對應(yīng)"OFF"/"UNIT"/"TARE"/多鍵
; ;D3=1 按鍵釋放,=0按鍵處于按下狀態(tài)
; ;D4=表示按鍵長時間按下或長時間按下過
R_KeyTimer1 equ 94H ;按鍵計時,相當(dāng)于6613中的41H
R_KeyTimer2 equ 95H ;按鍵計時,相當(dāng)于6613中的45H:44H
R_AdcSumL equ 96H ;ADC內(nèi)碼之和低字節(jié)(用于平均)
R_AdcSumM equ 97H ;ADC內(nèi)碼之和中間字節(jié)(用于平均)
R_AdcSumH equ 98H ;ADC內(nèi)碼之和高字節(jié)(用于平均)
R_AdcDataCnt equ 99H ;ADC輸出數(shù)據(jù)計數(shù)(計到8次時平均)
R_LastAverageL equ 9AH ;最近X次的內(nèi)碼的平均值低字節(jié),X=1-8,相當(dāng)于6613中的0C1H:0C0H
R_LastAverageH equ 9BH ;最近X次的內(nèi)碼的平均值高字節(jié),X=1-8,相當(dāng)于6613中的0C3H:0C2H
R_SteadyCnt equ 9DH ;穩(wěn)定次數(shù),判斷鎖定用,相當(dāng)于6613H618中的5DH
R_DifferenceL equ 9EH ;鎖定判斷的累計差值低字節(jié),相當(dāng)于6613H618中的0F1H:0F0H
R_DifferenceH equ 9FH ;鎖定判斷的累計差值高字節(jié),相當(dāng)于6613H618中的0F3H:0F2H
R_ZeroCodeL equ 0A0H ;零點(diǎn)內(nèi)碼低字節(jié),相當(dāng)于6613中的0CDH:0CCH
R_ZeroCodeH equ 0A1H ;零點(diǎn)內(nèi)碼高字節(jié),相當(dāng)于6613中的0CFH:0CEH
R_UnitSelect equ 0A2H ;計量單位選擇:0=g,1=oz,2=kg,3=lb
R_SteadyCodeL equ 0A3H ;連續(xù)穩(wěn)定的內(nèi)碼值低字節(jié),相當(dāng)于6613中的0C5H:0C4H
R_SteadyCodeH equ 0A4H ;連續(xù)穩(wěn)定的內(nèi)碼值高字節(jié),相當(dāng)于6613中的0C7H:0C6H
R_SteadyTimer equ 0A5H ;稱重穩(wěn)定計時(單位:1/8秒),相當(dāng)于6613H609中的71H
R_OffTimerL equ 0A6H ;自動關(guān)機(jī)時間倒計時低字節(jié)(單位:秒)
R_OffTimerH equ 0A7H ;自動關(guān)機(jī)時間倒計時高字節(jié)(單位:秒),D7=1不自動關(guān)機(jī)。
R_TraceCnt equ 0A8H ;自動追重計數(shù)(內(nèi)碼穩(wěn)定期間處理自動追重時的計數(shù))
R_BattLowCnt equ 0A9H ;電池低電壓計數(shù)
;
R_DispMode equ 0C9H ;顯示模式:D1:D0=0-3位小數(shù);D2=0/1不顯示計量單位/顯示計量單位;
; D3=0/1顯示為10進(jìn)制方式/顯示為16進(jìn)制數(shù)或提示信息
R_DispBuff0 equ 0CAH ;對應(yīng)LCD上5位7段碼數(shù)據(jù)的最低位
R_DispBuff1 equ 0CBH ;對應(yīng)LCD上5位7段碼數(shù)據(jù)的十位
R_DispBuff2 equ 0CCH ;對應(yīng)LCD上5位7段碼數(shù)據(jù)的百位
R_DispBuff3 equ 0CDH ;對應(yīng)LCD上5位7段碼數(shù)據(jù)的千位
R_DispBuff4 equ 0CEH ;對應(yīng)LCD上5位7段碼數(shù)據(jù)的最高位
R_DispFlag equ 0CFH ;D7-D0分別對應(yīng)LCD上的oz、g、lb、kg、ZERO、TARE、負(fù)號、電池符號
;
R_CaliMarkL equ 0D0H ;稱重標(biāo)定分度數(shù)低字節(jié),D7:D4=P0.1(百位),D3:D0=P0.0(十位),個位=0
R_CaliMarkH equ 0D1H ;稱重標(biāo)定分度數(shù)高字節(jié),D7:D4=P0.3(萬位),D3:D0=P0.2(千位)
R_CaliP1L equ 0D2H ;標(biāo)定參數(shù),D7:D4=P1.1,D3:D0=P1.0
; P1.0=計量單位標(biāo)志,D0-D3分別對應(yīng)kg、lb、g、oz,=1是打開單位,缺省值為"F"
; P1.1=主單位小數(shù)點(diǎn)位數(shù),0-3,缺省為"0",D2=0有自動追重,D2=1無自動追重。
R_CaliP1H equ 0D3H ;標(biāo)定參數(shù),D7:D4=P1.3,D3:D0=P1.2
; P1.2=主單位分度值1(1)、2(2)、3(5),缺省值為"1"
; P1.3=主單位分度數(shù),0=1000,1=1200,2=1500,3=2000,4=2500,5=3000,6=4000,
; 7=5000,8=6000,9=10000,缺省為"3"
R_CaliP2L equ 0D4H ;標(biāo)定參數(shù),D7:D4=P2.1,D3:D0=P2.0
; P2.0=稱重鎖定參數(shù),0-7,缺省值為"2"
; =0-7分別對應(yīng)鎖定參數(shù)1/4d,1/2d,3/4d,1d,5/4d,3/2d,7/4d,2d
; P2.1=鎖定時間,0=無鎖定功能,5=鎖定5秒,缺省值為"5"
R_CaliP2H equ 0D5H ;標(biāo)定參數(shù),D7:D4=P2.3,D3:D0=P2.2
; P2.2=自動關(guān)機(jī)時間,0=無自動關(guān)機(jī),1-7對應(yīng)30秒-210秒,8=10秒,9=300秒后自動關(guān)機(jī)
; 缺省值為"2"(60秒自動關(guān)機(jī))
; P2.3=稱重速度參數(shù):D1D0=00/01/02/03表示連續(xù)8/7/6/5個數(shù)據(jù)接近則鎖定,缺省值為"2"
R_CaliTempe equ 0D6H ;第一環(huán)境溫度值(℃)
R_TempeRepair equ 0D7H ;溫補(bǔ)值(-12.7d到+12.7d),=0時放棄溫補(bǔ),D7=1時為負(fù)數(shù)
R_CaliParaFlag equ 0D8H ;已標(biāo)定參數(shù)標(biāo)志,=5AH為有效
R_CaliCodeFlag equ 0D9H ;已標(biāo)定內(nèi)碼標(biāo)志,=0A5H為有效
R_CaliCode0L equ 0DAH ;零點(diǎn)的標(biāo)定內(nèi)碼低字節(jié)
R_CaliCode0H equ 0DBH ;零點(diǎn)的標(biāo)定內(nèi)碼高字節(jié)
R_CaliDataL equ 0DCH ;稱重標(biāo)定數(shù)據(jù)低字節(jié)
R_CaliDataH equ 0DDH ;稱重標(biāo)定數(shù)據(jù)高字節(jié)
R_CaliChksumL equ 0DEH ;標(biāo)定數(shù)據(jù)校驗(yàn)和低字節(jié)
R_CaliChksumH equ 0DFH ;標(biāo)定數(shù)據(jù)校驗(yàn)和高字節(jié)
;
R_DecimalDigits equ 0E0H ;小數(shù)位數(shù)(由P1.1算出)
R_ScaleMarkV equ 0E1H ;分度值(由P1.2算出)
R_LockCodeNum equ 0E2H ;鎖定所有的連續(xù)有效數(shù)據(jù)個數(shù)最大值,相當(dāng)于6613H618中的0E9H
R_OffsetCode equ 0E3H ;鎖定判斷的內(nèi)碼值,相當(dāng)于6613H618中的0F5H:0F4H
R_10dCodeL equ 0E4H ;10d內(nèi)碼的低字節(jié),相當(dāng)于6613H618中的0EDH:0ECH
R_10dCodeH equ 0E5H ;10d內(nèi)碼的高字節(jié),相當(dāng)于6613H618中的0EFH:0EEH
R_MaxScaleMarkL equ 0E6H ;最大分度數(shù)(+9)低字節(jié)
R_MaxScaleMarkH equ 0E7H ;最大分度數(shù)(+9)高字節(jié)
R_TempCaliDataL equ 0E8H ;暫存稱重標(biāo)定數(shù)據(jù)低字節(jié)
R_TempCaliDataH equ 0E9H ;暫存稱重標(biāo)定數(shù)據(jù)高字節(jié)
R_UnitData0 equ 0EAH ;1d對應(yīng)的不同計量單位的值(有效數(shù)字)低字節(jié)
R_UnitData1 equ 0EBH ;1d對應(yīng)的不同計量單位的值(有效數(shù)字)高字節(jié)
R_UnitData2 equ 0ECH ;1d對應(yīng)的不同計量單位的值(浮點(diǎn)數(shù))的2的指數(shù),≥80H為負(fù)數(shù)
R_AdcDataL equ 0EDH ;暫存ADC輸出數(shù)據(jù)低字節(jié)
R_AdcDataH equ 0EEH ;暫存ADC輸出數(shù)據(jù)高字節(jié)
R_CodePointer equ 0EFH ;內(nèi)碼存儲指針
R_CodeBuffer equ 0F0H ;內(nèi)碼緩存0F0H-0FFH共8組16字節(jié)
;==============================================================================
; Program start
;==============================================================================
org 000H
GOTO L_Start ;程序開始(RESET入口)
org 004H
; GOTO L_IntProc ;中斷服務(wù)程序
L_IntProc:
MOVWF R_WORKbak ;[WORK]->R_WORKbak
MOVFW STATUS
MOVWF R_STATUSbak ;[STATUS]->R_STATUSbak
BTFSC INTF,ADIF
GOTO L_AdcInt ;ADC中斷,轉(zhuǎn)
BTFSS INTF,TMIF
GOTO L_IntProcEnd ;不是Timer中斷,轉(zhuǎn)
BCF INTF,TMIF ;清Timer中斷標(biāo)志
BSF R_PubFlag1,7 ;1->R_PubFlag1.7 置Timer中斷標(biāo)志
GOTO L_IntProcEnd
L_AdcInt:
BCF INTF,ADIF ;清ADC中斷標(biāo)志
MOVFW ADOL
MOVWF R_AdcDataL ;[ADOL]->R_AdcDataL
MOVFW ADOH
MOVWF R_AdcDataH ;[ADOH]->R_AdcDataH
MOVLW 09H ;\
ADDWF R_AdcDataL,1 ; | [R_AdcDataH:R_AdcDataL]+3D09H(15625)
MOVLW 3DH ; | ->R_AdcDataH:R_AdcDataL (轉(zhuǎn)換為正數(shù)內(nèi)碼)
ADDWFC R_AdcDataH,1 ;/
BSF R_PubFlag0,3 ;讀到ADC內(nèi)碼
L_IntProcEnd:
MOVFW R_STATUSbak
MOVWF STATUS ;[R_STATUSbak]->STATUS
MOVFW R_WORKbak ;[R_WORKbak]->WORK
RETFIE
;------------------------------------------------------------------------------
;程序開始
L_Start:
CLRF INTE ;關(guān)所有中斷
MOVLW 01000100B ;CPU指令周期=MCK/2,OSC僅使用內(nèi)部1MHz
MOVWF MCK
MOVLW 0C0H
MOVWF AIENB1 ;PT1.0-PT1.5 is Analog input channel(AIN0-AIN5)
MOVWF PT1EN ;PT1.7-PT1.6 is output
MOVLW 40H
MOVWF PT1 ;0C0H->PT1
MOVLW 0
MOVWF PT1PU ;0->PT1PU
MOVWF PT2MR ;0->PT2MR
MOVWF PT2OCB ;0->PT2OCB
MOVLW 11111000b
MOVWF PT2EN ;PT2.7-PT2.3 is output,PT2.2-PT2.0 is input
MOVLW 00001111b
MOVWF PT2PU ;PT2.3-PT2.0 with pull-up resistor
MOVWF PT2 ;07H->PT2
L_InitClrRAM:
MOVLW 80H ;\
MOVWF FSR0 ; \
L_InitClrR_Loop: ; | RAM [0FFH:80H]清零
CLRF IND0 ; |
INCFSZ FSR0,1 ; /
GOTO L_InitClrR_Loop ;/
L_InitSFR:
MOVLW 00011010B ;00011010B
MOVWF NETE ;ENVS,LB輸入選AIN4,ENLB
MOVLW 01100011B
MOVWF NETF ;ENBAND,ENVDDA,ENAGND,ENVB
MOVLW 01000001b
MOVWF PCK ;ENPUMP=1,S_CH1CK[1:0]=00,S_BEEP=0,S_PCK=1
CALL S_Delay
;
; MOVLW 11000100B
; MOVWF NETA ;INL=TEMPL,FTIN=OP1O,FTB=FTIN,INH=FTB
; MOVLW 00001110B
; MOVWF NETB ;OP1N=OP1O,VRL=VR2P,VRH=VR1P
; MOVLW 00001110B
; MOVWF NETD ;OP1EN=1,OP1P=TEMPH
;
MOVLW 01000100B
MOVWF NETA ;INL=AIN2,FTIN=OP1O,FTB=FTIN,INH=FTB
MOVLW 00100100B
MOVWF NETB ;OP1N=AIN5,VRL=AIN1,VRH=AIN0
MOVLW 00001011B
MOVWF NETD ;OP1EN=1,OP1P=AIN3
;
MOVLW 10000110B ;10000110B
MOVWF NETC ;SREFO=1,ADG=1,ADEN=1,AZ=0
MOVLW 00001100b ;00001111b ;ADM=110bADCF/8000
MOVWF ADCON ;ADRST=1,ADM=100b=ADCF/2000
;
CALL S_ClrDisp ;清LCD顯示緩沖區(qū)LCD1-LCD6
MOVLW 00100111b ;00101111b 1/2bias,1/4duty
MOVWF LCDENR ;start LCD clock,1/3bias,1/4duty
MOVLW 10001011B
MOVWF TMCON ;1/16秒中斷
L_InitCaliData:
CALL S_RdCaliData ;讀93LC46中00H-0AH的標(biāo)定數(shù)據(jù)送至RAM R_CaliMarkL-R_CaliChksumH
CALL S_CalcChksum ;計算標(biāo)定數(shù)據(jù)之和->R_PubReg3:R_PubReg2
MOVFW R_PubReg2
IORWF R_PubReg3,0
BTFSS STATUS,Z
GOTO L_InitCaliErr ;[R_PubReg3:R_PubReg2]≠0 (93LC46中00H-0AH的值錯誤) 轉(zhuǎn)
MOVLW D_CaliMark1
SUBWF R_CaliParaFlag,0
BTFSS STATUS,Z
GOTO L_InitCaliErr ;[R_CaliParaFlag]≠D_CaliMark1 (未標(biāo)定參數(shù)) 轉(zhuǎn)
MOVLW D_CaliMark2
SUBWF R_CaliCodeFlag,0
BTFSS STATUS,Z
GOTO L_InitCaliErr ;[R_CaliCodeFlag]≠D_CaliMark2 (未標(biāo)定內(nèi)碼) 轉(zhuǎn)
L_InitScaleMark:
MOVFW R_CaliP1H ;標(biāo)定參數(shù),D7:D4=P1.3,D3:D0=P1.2
CALL S_RR4Work ;[WORK]右移4位->WORK,0->WORK.7:4
CALL S_RdScaleMark ;讀分度數(shù)->WORK
MOVWF R_PubReg2 ;[WORK]->R_PubReg2
CLRF R_PubReg3 ;0->R_PubReg3
MOVLW 100
MOVWF R_PubReg4 ;100->R_PubReg4
CLRF R_PubReg5 ;0->R_PubReg5
CALL S_Multi ;[R_PubReg3:R_PubReg2]×[R_PubReg5:R_PubReg4]->R_PubReg3:R_PubReg0
MOVLW 9
ADDWF R_PubReg0,0
MOVWF R_MaxScaleMarkL ;計算出的最大分度數(shù)(+9)低字節(jié)->R_MaxScaleMarkL
MOVLW 0
ADDWFC R_PubReg1,0
MOVWF R_MaxScaleMarkH ;計算出的最大分度數(shù)(+9)高字節(jié)->R_MaxScaleMarkH
GOTO L_InitOther
L_InitCaliErr:
CLRF R_CaliMarkL ;\
MOVLW 01H ; | 0100H->R_CaliMarkH:R_CaliMarkL
MOVWF R_CaliMarkH ;/
MOVLW 0FH
MOVWF R_CaliP1L ;0FH(缺省值)->R_CaliP1L
MOVLW 31H
MOVWF R_CaliP1H ;31H(缺省值)->R_CaliP1H
MOVLW 52H
MOVWF R_CaliP2L ;52H(缺省值)->R_CaliP2L
MOVLW 22H
MOVWF R_CaliP2H ;22H(缺省值)->R_CaliP2H
MOVLW 0A0H
MOVWF R_PubCnt1 ;0A0H->R_PubCnt1,定時10秒
; MOVLW 30H
; MOVWF R_WorkStatus ;30H->R_WorkStatus,臨時修改,用于顯示內(nèi)碼
MOVLW 0C0H
MOVWF R_WorkStatus ;0C0H->R_WorkStatus,10秒后關(guān)機(jī)。
CALL S_Disp9346 ;LCD顯示" 9346"
L_InitOther:
CALL S_CalcUnitData ;計算1d對應(yīng)的不同計量單位的值(浮點(diǎn)數(shù)),
; 結(jié)果->R_UnitData2(2的指數(shù))、R_UnitData1:R_UnitData0(有效數(shù)字)
CALL S_CalcLockCode ;計算鎖定判斷的內(nèi)碼值->R_OffsetCode
CALL S_CalcOffTime ;計算自動關(guān)機(jī)時間(單位:秒)->R_OffTimerH:R_OffTimerL
CLRF INTF
MOVLW 10010100B
MOVWF INTE ;GIE=1,TMIE=1,ADIE=1
L_InitEnd:
;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -