📄 scale.asm
字号:
CALL B_24C02
JMP L_InitReadSetEnd
L_InitReadSetEnd:
;初始化/工厂测试之特别处理
L_InitTestSP:
SZ R_ModeCali_F
JMP L_InitEnd ;由工厂测试过来的,不读存贮器,不看低电.
;初始化/读标定值
L_InitReadMark: ;读基准
MOV A, 9
MOV R_F24C02Cnt, A
MOV A, OFFSET R_Mark0M_0
MOV R_FArrayAddr_L, A
MOV A, Addr0M_0
MOV R_F24C02Addr, A
SET R_FI2CRead_F ;读操作
CALL B_24C02
SNZ R_FI2CErr_F
JMP L_InitReadMarkEnd
L_InitReadMarkErr1: ;显示'Err1'
MOV A, LOW TabLCDErr1
JMP L_OFFDelay ;去显示,延时3秒,关机的入口.
L_InitReadMarkEnd:
MOV A, R_Mark0M_0
MOV R_WeigCurrReg_L, A
MOV A, R_Mark0M_1
MOV R_WeigCurrReg_H, A
;初始化/结束
L_InitEnd:
MOV A, D_TMR1LCnt
MOV TMR1L, A
MOV A, D_TMR1HCnt
MOV TMR1H, A
SET ADDISCH0 ;充电
CLR ADDISCH1
SET T1ON ;启动定时器1
CLR T1F
MOV A, R_SetWarmUpCnt
MOV R_WarmUpCnt, A
;主程序/开始
L_Main: ;主程序开始
CLR WDT
SET EMI
;主程序/读单位处理
L_MainUnit: ;称重单位
SNZ R_SetUnitMode_F
JMP L_MainUnitJump
L_MainUnitKey: ;按键
SNZ R_MainLoopCnt.0
JMP L_MainUnitEnd
SZ P_KeyUnit_F
JMP L_MainUnitEnd
CLR R_AutoOffCnt
CLR R_LEDOFFCnt
CLR C
RLC R_UnitFlag
SNZ R_UnitFlag.3
JMP $+3
MOV A, 01
MOV R_UnitFlag, A
MOV A, 1
MOV R_F24C02Cnt, A
MOV A, OFFSET R_UnitFlag
MOV R_FArrayAddr_L, A
MOV A, AddrUnit
MOV R_F24C02Addr, A
CLR R_FI2CRead_F ;写操作
CALL B_24C02
JMP L_MainUnitEnd
L_MainUnitJump: ;拨动开关
CLR P_UnitGND
CLR R_UnitFlag
SNZ P_UnitKG_F ;.NOT. KG?
SET R_UnitKG_F
SNZ P_UnitLB_F ;.NOT. LB?
SET R_UnitLB_F
SZ R_UnitFlag
JMP $+2
SET R_UnitST_F ;默认为ST
L_MainUnitEnd:
;主程序/读ADC输出处理
L_MainADC:
L_MainADC_Init:
MOV A, 00
MOV R_PubReg_0, A
MOV R_PubReg_1, A
MOV R_PubReg_2, A
MOV R_PubReg_3, A
L_MainADCCharge: ;充电
CLR TMR1L
CLR TMR1H
CLR WDT
SNZ T1F ;是否够100mS?
JMP $-2
L_MainADCDischarge: ;放电
CLR ADDISCH0 ;放电
SET ADDISCH1
MOV A, 10000010B ;2分频改为4分频
MOV TMR1C, A
SET T1ON ;开定时器1
CLR T1F
CLR WDT
SZ ADCMP0 ;斜线升到顶,就为1,降到底就为0
JMP $-2
CLR T1ON ;关定时器1
MOV A, 10000001B ;4分频改为2分频
MOV TMR1C, A
MOV A, TMR1H
MOV R_PubReg_1, A
MOV A, TMR1L
MOV R_PubReg_0, A
MOV A, D_TMR1LCnt
MOV TMR1L, A
MOV A, D_TMR1HCnt
MOV TMR1H, A
SET ADDISCH0 ;充电
CLR ADDISCH1
SET T1ON ;开定时器1
CLR T1F
MOV A, R_PubReg_0
MOV R_WeigCurrReg_L, A
MOV A, R_PubReg_1
MOV R_WeigCurrReg_H, A
L_MainADCEnd:
;主程序/ADC输出滤波处理
L_MainFil: ;滑动平均滤波
L_MainFilMag:
CLR R_WeigStab_F
CLR R_WeigLock_F
SZ R_WeigCurrReg_H ;00H有其它含义,
JMP L_MainFilDiffrenc ;如果有00H,置为01H
SZ R_WeigCurrReg_L
JMP L_MainFilDiffrenc
SET R_WeigCurrReg_L.0
L_MainFilDiffrenc: ;求本轮值与上轮显示值之差
MOV A, R_WeigCurrReg_L
SUB A, R_ShowLast1Reg_L
MOV R_PubReg_0, A
MOV A, R_WeigCurrReg_H
SBC A, R_ShowLast1Reg_H
MOV R_PubReg_1, A
SZ C
JMP $+4
MOV A, 00H ;得绝对值
SUBM A, R_PubReg_0
SBCM A, R_PubReg_1
MOV A, R_Mark4DReg ;稳定与否门限值32D
MOV R_PubReg_2, A
CLR R_PubReg_3
CLR C
RLC R_PubReg_2
RLC R_PubReg_3
CLR C
RLC R_PubReg_2
RLC R_PubReg_3
CLR C
RLC R_PubReg_2
RLC R_PubReg_3
MOV A, R_PubReg_2
SUB A, R_PubReg_0
MOV A, R_PubReg_3
SBC A, R_PubReg_1
SNZ C
JMP L_MainFilUnStable ;不稳定
SET R_WeigStab_F ;设稳定标志位
JMP L_MainFilStable ;稳定
L_MainFilUnStable: ;不稳定时不显示新的值
CLR R_AutoZeroCnt
CLR R_ShowLockCnt
CLR R_AutoOFFCnt
CLR R_LEDOFFCnt
SZ R_ShowLock_F
JMP $+5
CLR R_ShowLockCnt ;不锁存
CLR R_ShowLockOFFCnt
CLR R_ShowLockReg_0
CLR R_ShowLockReg_1
MOV A, R_WeigCurrReg_L ;立即显示
MOV R_WeigFilReg_20, A
MOV R_WeigFilReg_10, A
MOV R_WeigFilReg_00, A
MOV A, R_WeigCurrReg_H
MOV R_WeigFilReg_21, A
MOV R_WeigFilReg_11, A
MOV R_WeigFilReg_01, A
JMP L_MainFilAverage
L_MainFilStable:
SET R_WeigLock_F
; MOV A, R_PubReg_0
; AND A, 11100000B ;2,0.03KG
; SNZ Z
; JMP $+2
; SET R_VeryStab_F
L_MainFilAverage: ;求平均值
CLR R_PubReg_0
CLR R_PubReg_1
CLR R_PubReg_2
MOV A, 4
MOV R_PubCnt_0, A
MOV A, OFFSET R_WeigCurrReg_L
MOV MP0, A
L_MainFilAverageLoop:
MOV A, R0
ADDM A, R_PubReg_0
INC MP0
MOV A, R0
ADCM A, R_PubReg_1
INC MP0
MOV A, 00H
ADCM A, R_PubReg_2
SDZ R_PubCnt_0
JMP L_MainFilAverageLoop
CLR C
RRC R_PubReg_2
RRC R_PubReg_1
RRC R_PubReg_0
CLR C
RRC R_PubReg_2
RRC R_PubReg_1
RRC R_PubReg_0
L_MainFilSlip: ;滑动
MOV A, R_WeigFilReg_10 ;1->2
MOV R_WeigFilReg_20, A
MOV A, R_WeigFilReg_11
MOV R_WeigFilReg_21, A
MOV A, R_WeigFilReg_00 ;0->1
MOV R_WeigFilReg_10, A
MOV A, R_WeigFilReg_01
MOV R_WeigFilReg_11, A
MOV A, R_WeigCurrReg_L ;Current->0
MOV R_WeigFilReg_00, A
MOV A, R_WeigCurrReg_H
MOV R_WeigFilReg_01, A
L_MainFilMov: ;保留求得的平均值
MOV A, R_ShowLast1Reg_L
MOV R_ShowLast2Reg_L, A
MOV A, R_ShowLast1Reg_H
MOV R_ShowLast2Reg_H, A
MOV A, R_PubReg_0 ;自动归零用
MOV R_ShowCurrReg_L, A
MOV R_ShowLast1Reg_L, A
MOV A, R_PubReg_1
MOV R_ShowCurrReg_H, A
MOV R_ShowLast1Reg_H, A
L_MainFilEnd:
;主程序/模式选择
L_MainMode: ;模式选择
CALL B_ReadKey ;读按键
SZ R_ModeNormaL_F
JMP L_MainNorm
CLR R_AutoOFFCnt ;不自动关机
SZ R_ModeSet_F
JMP L_MainSet
SZ R_ModeCali_F
JMP L_MainCali
CLR R_ModeFlag
SET R_ModeNormaL_F
JMP L_MainNorm
;主程序/普通模式/开始
L_MainNorm:
L_MainNormKey:
SNZ P_KeyCali_F
JMP L_InitTest
;预热处理
L_MainNormWarmUp:
SZ R_WarmUpCnt ;预热时跳开此部份
JMP $+2
JMP L_MainNormWarmUpEnd
L_MainNormWarmUpZero:
CLR R_AutoOFFCnt
SZ R_HalfSecond_F
DEC R_WarmUpCnt
SZ R_WarmUpCnt
JMP $+2
JMP L_MainNormWarmUpZeroChk
MOV A, R_SetWarmUpCnt
SNZ R_WeigStab_F ;不稳定 ?
MOV R_WarmUpCnt, A
CALL B_ClrLCDReg
SET R_ShowWord_F
SZ R_SetWarmUpMode_F
JMP L_MainNormWarmUpZeroALL
L_MainNormWarmUpZeroShift:
MOV A, R_MainLoopCnt
MOV R_PubCnt_0, A
CLR C
RRC R_PubCnt_0 ;4次移'8'一下
CLR C
RRC R_PubCnt_0
MOV A, R_PubCnt_0
SUB A, 03
MOV A, 03
SZ C
MOV R_PubCnt_0, A
MOV A, OFFSET R_LCDReg_3
SUB A, R_PubCnt_0
MOV MP0, A
MOV A, 08
MOV R0, A
JMP L_MainNormEnd
L_MainNormWarmUpZeroALL:
MOV A, 0BH
MOV R_PubCnt_0, A
MOV A, 40H
MOV MP1, A
MOV A, 0FH
MOV R1, A
INC MP1
SDZ R_PubCnt_0
JMP $-4
MOV A, 0FH
MOV R1, A
JMP L_MainEnd
L_MainNormWarmUpZeroChk:
; CLR R_VeryStab_F
CLR R_AutoOFFCnt ;自动关机重新计时
L_MainNormWarmUpZeroWrit:
MOV A, R_ShowLast1Reg_L
MOV R_Mark0M_0, A
MOV A, R_ShowLast1Reg_H
MOV R_Mark0M_1, A
L_MainNormWarmUpEnd:
; LED控制
L_MainNormLED: ; LED控制
SZ R_HalfSecond_F
INC R_LEDOFFCnt
MOV A, 10
SUB A, R_LEDOFFCnt
SNZ C
JMP L_MainNormLEDOff
L_MainNormLEDOn:
SET P_LED_F ; 点背光
JMP L_MainNormLEDEnd
L_MainNormLEDOff:
MOV A, 11
MOV R_LEDOFFCnt, A
CLR P_LED_F ; 灭背光
L_MainNormLEDEnd:
;主程序/普通模式/记忆值处理
L_MainNormMemory: ;锁存
MOV A, 2
MOV R_F24C02Cnt, A
MOV A, OFFSET R_LockData_L
MOV R_FArrayAddr_L, A
MOV A, AddrBase
MOV R_F24C02Addr, A
SET R_FI2CRead_F ;读操作
CALL B_24C02
L_MainNormMemorySub:
MOV A, R_ShowCurrReg_L
SUB A, R_Mark0M_0
MOV R_PubReg_2, A
MOV A, R_ShowCurrReg_H
SBC A, R_Mark0M_1
MOV R_PubReg_3, A
SZ C
JMP $+4
MOV A, 00H
SUB A, R_PubReg_2
SBC A, R_PubReg_3
MOV A, R_PubReg_2
SUB A, R_LockData_L
MOV R_PubReg_2, A
MOV A, R_PubReg_3
SBC A, R_LockData_H
MOV R_PubReg_3, A
SZ C
JMP $+4
MOV A, 00H
SUBM A, R_PubReg_2
SBCM A, R_PubReg_3
L_MainNormMemorySubChec: ;欺瞒的范围
SZ R_PubReg_3
JMP L_MainNormMemoryEnd ;新的值
SZ R_SetMemoryRange ;为零时,不记忆.
JMP $+2
JMP L_MainNormMemoryEnd ;新的值
CLR C
MOV A, R_SetMemoryRange
MOV R_PubCnt_0, A
CLR R_PubCnt_1
CLR R_PubCnt_2
MOV A, R_Mark4DReg
ADDM A, R_PubCnt_1
MOV A, 00
ADCM A, R_PubCnt_2
SDZ R_PubCnt_0
JMP $-5
CLR C
RRC R_PubCnt_2
RRC R_PubCnt_1
CLR C
RRC R_PubCnt_2
RRC R_PubCnt_1
MOV A, R_PubCnt_1
SUB A, R_PubReg_2
SNZ C
JMP L_MainNormMemoryEnd ;新的值
MOV A, R_LockData_L
ADD A, R_Mark0M_0
MOV R_ShowCurrReg_L, A
MOV A, R_LockData_H
ADC A, R_Mark0M_1
MOV R_ShowCurrReg_H, A
L_MainNormMemoryEnd:
;主程序/普通模式/计算重量处理
L_MainNormCalc: ;计算
SNZ R_ShowLock_F
JMP $+5
MOV A, R_ShowLockReg_0
MOV R_ShowCurrReg_L, A
MOV A, R_ShowLockReg_1
MOV R_ShowCurrReg_H, A
SET R_ShowPosi_F ;显示重量先置为正
CLR R_PubCnt_0 ;00->标准单位,01->实际单位
L_MainNormCalcLoop1:
MOV A, 040H ;4*400=1600=0640H
MOV R_PubReg_2, A ;乘4,以便四舍五入
MOV A, 06H
MOV R_PubReg_3, A
SNZ R_PubCnt_0.0
JMP L_MainNormCalcLoop2 ;第一次计算?
SNZ R_UnitLB_F ;LB ?
JMP $+5
MOV A, 0E4H ;4*400*2.204623/2=1764=06E4H
MOV R_PubReg_2, A ;乘2,以便四舍五入
MOV A, 06H
MOV R_PubReg_3, A
SNZ R_UnitST_F ;ST ?
JMP $+5
MOV A, 083H ;4*40*2.204623*4=1411=0583H
MOV R_PubReg_2, A ;乘4,以便四舍五入
MOV A, 05H
MOV R_PubReg_3, A
L_MainNormCalcLoop2:
SNZ R_SetMarkWeig_F ;50KG
JMP L_MainNormCalcRang
L_MainNormCalc50: ;计算
MOV A, 0D0H ;4*500=2000=07D0H
MOV R_PubReg_2, A ;乘4,以便四舍五入
MOV A, 07H
MOV R_PubReg_3, A
SNZ R_PubCnt_0.0
JMP L_MainNormCalcRang ;第一次计算?
SNZ R_UnitLB_F ;LB ?
JMP $+5
MOV A, 09DH ;4*500*2.204623/2=2205=089DH
MOV R_PubReg_2, A ;乘2,以便四舍五入
MOV A, 08H
MOV R_PubReg_3, A
SNZ R_UnitST_F ;ST ?
JMP $+5
MOV A, 0E4H ;4*50*2.204623*4=1764=06E4H
MOV R_PubReg_2, A ;乘4,以便四舍五入
MOV A, 06H
MOV R_PubReg_3, A
L_MainNormCalcRang:
CALL B_InitCalc
MOV A, R_PubReg_2
MOV R_FCalcMuL_0, A
MOV A, R_PubReg_3
MOV R_FCalcMuL_1, A
MOV A, R_ShowCurrReg_L ;<0?
SUB A, R_Mark0M_0
MOV R_PubReg_0, A
MOV A, R_ShowCurrReg_H
SBC A, R_Mark0M_1
MOV R_PubReg_1, A
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -