📄 scale.asm
字号:
;=============================================================================
;文件名 : CRE0717-A2.asm
;电路图名 : CRE0717-A1.sch
;项目名 : **人体秤
;作者 : 胡川
;母体 : HT46R72D-1
;父程序 : CRE0717-A1.asm
;检验码 : 97A0H
;修改日起 : 2007-09-10
;剩余行 : 前 234行. 后47行.
;-----------------------------------------------------------------------------
;=============================================================================
;功能:
; 按键: 'POWER'、'Cali'
; 量程: 120KG/150KG
; 过载: 重量超过标定重量125%,显示'Err'
; 单位: KG,LB,ST.
; 精度: 0.1KG/0.2oz.
; 低电: 开机低电,报错关机.称重时低电,只报错.
; 开机: 按'Power'可开机
; 显示: 开机LCD显示'8888'3秒,然后显示0.0kg
;
;操作:
; 测试: 按着'CALI'不放,开机直至LCD出现内容,即可进入测试模式
; : 先测试LCD的COM线和SEG线,然后显示内码,按标定键可进入标定模式
; 标定: 开机状态下,按'CALI'.先显示'120'或'150'然后显示内码.按'CALI'显
; : 示要放的重量.标定成功后,显示'PASS'.
;
;信息:
; ErrE: 存储器错误,其中包括存储器物理连接有误、存储器内没有写入数据
; ErrC: 开机时显示为标定数据读取错误,计数时显示为计数校机重量错误
; PL : 电池电量低
; O-LD: 重量过载
; PASS: 标定成功
;
;说明:
; A1.ADC值,两次加到一次.
; A1.改用HX的新版2402读写程序.
; A1.以LVD为低电检测方式.
; A1.锁定状态不关机.
; A1.用了两个标示位来标记半秒时间到.
; A2.解决L_MainNormClrLockLow处理的BUG.
; A2.开机低电检测放到读存贮器之前.如果低电,报错关机.
;=============================================================================
;=============================================================================
;MASK OPTION
;-----------------------------------------------------------------------------
;OSC mode RC mode
;LCDDriver clock Int. RCOSC/4
;LCDDuty 1/4Duty
;LCD bias selection 1/3 bias
;LCD functionDuring HALT OFF
;Clock Source (fs) Int. RCOSC
;LVR Disable
;LVD Enable
;INT0 trigger edge Disable
;PA0/BZ,PA1/BZB output (PA1,PA0) = (I/O, I/O)
;BZ output frequecy fS/ (2^2)
;WDT Disable
;WDT time-outPeriod 2^16/fs
;CLRWDT 1 instruction
;WDT clock source Int. RCOSC
;-----------------------------------------------------------------------------
; 7 6 5 4 3 2 1 0
;Wake-upPA0- 0 0 0 0 0 0 0 1 1:Wake-up, 0:None-Wake-up
;Pull-highPA0- 0 0 0 0 0 1 1 1 1:Pull-high, 0:None-Pull-high
;Pull-highPB0- - - - - 1 1 1 0 1:Pull-high, 0:None-Pull-high
;-----------------------------------------------------------------------------
;=============================================================================
; 包含文件
;=============================================================================
INCLUDE HT46R72D-1.INC ;inc文件内容为MCU的特殊寄存器的定义
;=============================================================================
data.section 'data'
ORG 0000H
;======================================================================================================= ;
;用户寄存器定义
;======================================================================================================= ;
;---------------------------公共寄存器
R_PubFlag_0 DB 1 ;公共标志字节
R_PubFlag_1 DB 1 ;公共标志字节
; EQU R_PubFlag_0.0
R_ShowPosi_F EQU R_PubFlag_0.1 ;显示值的极性
R_WeigStab_F EQU R_PubFlag_0.2 ;稳重稳定标志位
R_FI2CRead_F EQU R_PubFlag_0.3 ;
R_FI2CErr_F EQU R_PubFlag_0.4 ;
R_WeigLock_F EQU R_PubFlag_0.5 ;
R_ShowLock_F EQU R_PubFlag_0.6 ;
R_WeigLockOFF_F EQU R_PubFlag_0.7 ;
R_ShowWord_F EQU R_PubFlag_1.0 ;显示标示位
R_WeigLow_F EQU R_PubFlag_1.1 ;重量很小标示位
R_CaliDelay_F EQU R_PubFlag_1.2 ;标定时,延时标示位
R_FKeyCaliP_F EQU R_PubFlag_1.3 ;标定时,延时标示位
R_FKeyCaliL_F EQU R_PubFlag_1.4 ;标定时,延时标示位
R_TmrInt1Tri_F EQU R_PubFlag_1.5 ;定时器1中断触发标志位
R_FHalfSecond_F EQU R_PubFlag_1.6 ;子程序半秒时间到标示位
R_HalfSecond_F EQU R_PubFlag_1.7 ;主程序半秒时间到标示位
; R_VeryStab_F EQU ;很稳定标志位
; R_MemoryClR_F EQU ;要求清除记忆标示位
; R_ADTimpUp_F EQU ;放电时间到标示位
R_PubReg_0 DB 1 ;公共寄存器
R_PubReg_1 DB 1
R_PubReg_2 DB 1
R_PubReg_3 DB 1
R_PubReg_4 DB 1
; R_PubReg_5 DB 1
R_PubCnt_0 DB 1 ;公共计数器
R_PubCnt_1 DB 1
R_PubCnt_2 DB 1
;I/O Port
P_KeyON_F EQU PA.0 ;按键
P_KeyCali_F EQU PA.1 ;校正键
P_KeyUnit_F EQU PA.2 ;单位键
P_LED_F EQU PA.4 ;背光
P_UnitGND EQU PA.7
; P_24WP_F EQU P1.1 ;2402片选
P_SCL_F EQU PB.0 ;存储器的串行时钟线
P_SCLIn_F EQU PBC.0 ;存储器的串行时钟线为输出标志
P_SDA_F EQU PB.1 ;存储器的串行数据线
P_SDAIn_F EQU PBC.1 ;存储器的串行数据线为输出标志
P_UnitKG_F EQU PB.2 ;单位KG
P_UnitLB_F EQU PB.3 ;单位LB
;主程序用的RAM
R_AutoOFFCnt DB 1 ;自动关机用
R_AutoZEROCnt DB 1 ;自动找零点
R_CaliReg DB 1 ;校准用
R_ClrLockCnt DB 1
R_DReg_0 DB 1
R_DReg_1 DB 1
R_LCDFlag DB 1 ;显示LCD子程
R_LCDCOL_F EQU R_LCDFlag.0
R_LCDP1_F EQU R_LCDFlag.1
R_LCDLB_F EQU R_LCDFlag.2
R_LCDKG_F EQU R_LCDFlag.3
R_LCDST_F EQU R_LCDFlag.4
R_LCDReg_0 DB 1
R_LCDReg_1 DB 1
R_LCDReg_2 DB 1
R_LCDReg_3 DB 1
; R_LCDReg_4 DB 1
R_LEDOFFCnt DB 1
R_LockData_L DB 1
R_LockData_H DB 1
R_LockFlashCnt DB 1
R_Mark0M_0 DB 1 ;基准值(标定值)
R_Mark0M_1 DB 1
R_Mark1_0 DB 1
R_Mark1_1 DB 1
R_Mark2_0 DB 1
R_Mark2_1 DB 1
R_Mark3_0 DB 1
R_Mark3_1 DB 1
R_Mark4DReg DB 1
R_MainLoopCnt DB 1 ;计主循环次数
R_ModeFlag DB 1 ;工作模式
R_ModeNormal_F EQU R_ModeFlag.0 ;正常称重
R_ModeSet_F EQU R_ModeFlag.1 ;设置模式
R_ModeCali_F EQU R_ModeFlag.2 ;标定模式,显示标示值
R_ModeSetCnt DB 1 ;设置模式时的步骤
R_PowerOFFCnt DB 1 ;强制关机
R_SetFlag DB 1 ;可设置标示位
R_SetMarkMode_F EQU R_SetFlag.0 ;可设置标定方式.0->1段,1->3段.
R_SetMarkWeig_F EQU R_SetFlag.1 ;可设置标定重量.0->40KG,1->50KG.
R_SetClrLockMode_F EQU R_SetFlag.2 ;可设置有重量时解锁方式.0->解锁关机,1->解锁不关机,
R_SetWarmUpMode_F EQU R_SetFlag.3 ;可设置开机预热显示方式.0->跑8字,1->全显.
R_SetUnitMode_F EQU R_SetFlag.4 ;可设置单位方式.0->拨动选择单位,1->按键换单位.
R_SetLockCnt DB 1 ;可设置有重量时,解锁重时间.
R_SetMAX_L DB 1 ;可设置最大称重值
R_SetMAX_H DB 1
R_SetMemoryRange DB 1 ;可设置记忆值.
R_SetOFFCnt DB 1 ;可设置关机时间.
R_SetClrLockCnt DB 1 ;可设置解锁时间.外加3秒闪的时间.
R_SetWarmUpCnt DB 1 ;可设置开机预热时间
R_SetInLockCnt DB 1 ;可设置进入锁定的时间
R_SetShowMin DB 1 ;可设置显示最小值
R_SetClrMemory DB 1 ;可设置清除记忆值时间
R_UnitFlag DB 1
R_UnitKG_F EQU R_UnitFlag.0 ;公斤
R_UnitLB_F EQU R_UnitFlag.1 ;磅
R_UnitST_F EQU R_UnitFlag.2 ;磅
R_ShowCurrReg_L DB 1 ;当前显示值
R_ShowCurrReg_H DB 1
R_ShowLast1Reg_L DB 1 ;显示值
R_ShowLast1Reg_H DB 1
R_ShowLast2Reg_L DB 1 ;上次显示值
R_ShowLast2Reg_H DB 1
R_ShowLockCnt DB 1 ;锁存
R_ShowLockOFFCnt DB 1 ;锁存关机
R_ShowLockReg_0 DB 1
R_ShowLockReg_1 DB 1
R_TmrInt0Cnt DB 1
R_WeigCurrReg_L DB 1 ;当前稳重值
R_WeigCurrReg_H DB 1
R_WeigFilReg_00 DB 1 ;滑动滤波用
R_WeigFilReg_01 DB 1
R_WeigFilReg_10 DB 1
R_WeigFilReg_11 DB 1
R_WeigFilReg_20 DB 1
R_WeigFilReg_21 DB 1
R_WarmUpCnt DB 1 ;开机预热的次数
R_UnStabOFFCnt DB 1 ;不稳定时, 关机计时用.
;子程序用RAM
R_FCalcIn_0 DB 1 ;计算重量子程
R_FCalcIn_1 DB 1
R_FCalcIn_2 DB 1
R_FCalcOut_0 DB 1
R_FCalcOut_1 DB 1
R_FCalcOut_2 DB 1
R_FCalcMul_0 DB 1
R_FCalcMul_1 DB 1
R_FCalcMul_2 DB 1
R_FCalcDiv_0 DB 1
R_FCalcDiv_1 DB 1
R_FCalcDiv_2 DB 1
R_FCalcBig_0 DB 1
R_FCalcBig_1 DB 1
R_FCalcBig_2 DB 1
R_FCalcBig_3 DB 1
R_FCalcBig_4 DB 1
R_FCalcBig_5 DB 1
R_FCalcCnt DB 1
;复用的用户寄存器
R_F2Hex2DeciCnt EQU R_FCalcIn_0 ;4字节16转10进制
R_F2Hex2DeciIn_0 EQU R_FCalcIn_1
R_F2Hex2DeciIn_1 EQU R_FCalcIn_2
R_F2Hex2DeciOut_0 EQU R_FCalcOut_0
R_F2Hex2DeciOut_1 EQU R_FCalcOut_1
R_F2Hex2DeciOut_2 EQU R_FCalcOut_2
;-------- EQU
R_F24C02Cnt EQU R_FCalcIn_0 ;读写2402时的地址
R_F24C02Addr EQU R_FCalcIn_1
R_FArrayAddr_H EQU R_FCalcIn_2
R_FArrayAddr_L EQU MP0 ;R_FCalcOut_0
R_FArrayCont EQU R0 ;R_FCalcOut_1
R_FI2CData EQU R_FCalcOut_2
R_FI2CCnt EQU R_FCalcMul_0
; EQU R_FCalcMul_1
; EQU R_FCalcMul_2
R_SubReg EQU R_FCalcDiv_0
R_RWStatus EQU R_FCalcDiv_1
;---------------------------
R_FDelayCnt_L EQU R_FCalcIn_0
R_FDelayCnt_H EQU R_FCalcIn_1
R_FLCDPubCnt EQU R_FCalcIn_2
R_FPubReg_0 EQU R_FCalcOut_0
R_FPubReg_1 EQU R_FCalcOut_1
R_FPubReg_2 EQU R_FCalcOut_2
R_FPubReg_3 EQU R_FCalcMul_0
;中断用RAM
R_ITmr0Cnt DB 1
R_IAccReg DB 1
R_IStatReg DB 1
;
Addr0M_0 EQU 04H ;93C46中标定值的地址
Addr0M_1 EQU 05H
Addr1_0 EQU 06H
Addr1_1 EQU 07H
Addr2_0 EQU 08H
Addr2_1 EQU 09H
Addr3_0 EQU 0AH
Addr3_1 EQU 0BH
Addr4DReg EQU 0CH
AddrTest EQU 0FH ;测试地址
AddrFlag EQU 10H ;可设置的标示位.
AddrLockCnt EQU 11H ;锁重时间.
AddrMAX_L EQU 12H ;最大称重值
AddrMAX_H EQU 13H
AddrMemoryRange EQU 14H ;记忆值.
AddrOFFCnt EQU 15H ;关机时间.
AddrLPShow EQU 16H ;低电显示
AddrLPOFF EQU 17H ;低电关机
AddrClrLockCnt EQU 18H ;解锁时间
AddrWarmUpCnt EQU 19H ;开机预热时间
AddrInLockCnt EQU 1AH ;进入锁定的时间
AddrShowMin EQU 1BH ;最小显示值
AddrClrMemory EQU 1CH ;清除记忆值时间
AddrUnit EQU 1DH ;单位
AddrBat EQU 1FH ;低电
AddrBase EQU 020H
;
D_2402BaseNumb EQU 1 ;保存的欺骗值
D_AutoZEROCnt EQU 8 ;自动找零点的时间
D_UnStabOFFCnt EQU 240 ;不稳定时, 关机时间60秒.
D_TMR1CRisEdge EQU 10010001B ;放电时的T1设置
D_TMR1CFallEdge EQU 10010010B ;充电时的T1设置
D_TMR1LCnt EQU 0AFH ;初值为535
D_TMR1HCnt EQU 3CH
;*****************************************************************************
; Rom Begin
;*****************************************************************************
code.section 'code'
ORG 00H ;上电复位入口首地址
JMP L_Start
ORG 0004H ;外部中断入口地址
NOP
RETI
ORG 0008H ;定/计器0中断入口地址
NOP
JMP B_TmrInt0
ORG 000CH ;定/计器1中断入口地址
NOP
; JMP B_TmrInt1
RETI
;=============================================================================
;=============================================================================
;Program reset section
;=============================================================================
;程度开始
L_Start:
L_InitPort:
MOV A, 01101111B ;PA口的输出输出控制.
MOV PAC, A ;0为输出,1为输入.
MOV A, 01111111B
MOV PA, A
MOV A, 00001110B ;PB口的输出输出控制.
MOV PBC, A
L_InitRAM:
L_InitUserRAM:
MOV A, 20H ;用户RAM
MOV MP0, A
CLR R0
SIZ MP0
JMP $-2
L_InitLCDRAM:
MOV A, 01H ;MP1用于对LCD操作
MOV BP, A
MOV A, 40H ;LCD RAM
MOV MP1, A
MOV A, 0FH
MOV R_PubCnt_0, A
CLR R1
INC MP1
SDZ R_PubCnt_0
JMP $-3
CLR R1
L_InitSPRAM:
L_InitSet:
MOV A, 00001000B ;LVD enable,IRC enable.
MOV MODE, A ;
CLR Status
MOV A, 10000110B ;64分频
MOV TMR0C, A
MOV A, 10000001B
MOV TMR1C, A
MOV A, 00000101B ;开T0中断,开总中断
MOV INTC0, A
MOV A, 0H
MOV TMR0, A
MOV A, 00000000B ;关T1中断,关ADC中断
MOV INTC1, A
SET T0ON ;启动T0,每4096uS触发一次
MOV A, 00001001B ;WDT OSC Enable.
MOV WDTC, A
; MOV A, 10000001B
; MOV HALTC, A
L_InitADC:
MOV A, 01100111B ;开电压泵,频率除数为10
MOV CHPRC, A ;开稳压
MOV A, 3 ;8分频
MOV ADCD, A
MOV A, 01100011B ;开始充电,AD中断为下降沿触发
MOV ADCR, A
; MOV A, 11101100B ;充电用T1,放电用T1,使能所有自动功能
; MOV EADCR, A ;充电开始即开始充电计数
; CALL B_Recharge100mS
CALL B_Delay10mS
;初始化/低电处理
L_InitPowerLow:
CALL B_Delay100mS ;延时0.1秒等电源稳定.
SNZ LVDO ;低电?
JMP L_InitPowerLowEnd
L_InitPowerLowOFF:
MOV A, LOW TabLCDPL ;显示' PL ',表示严重低电,去关机.
JMP L_OFFDelay ;去显示,延时3秒,关机的入口.
L_InitPowerLowEnd:
;初始化/工厂测试处理
L_InitTest:
; CLR WDT
SZ P_KeyCali_F
JMP L_InitTestEnd ;退出测试
L_InitTestLCD:
CALL B_ClrLCD ;清空LCD的RAM
MOV A, 0FH
MOV R_PubReg_0, A
MOV A, 40H
MOV MP1, A
SET R1
INC MP1
CALL B_Delay100mS
SDZ R_PubReg_0
JMP $-4
SET R1
CALL B_Delay2000mS ;延时2秒
; CLR WDT
L_InitTestLoop:
CALL B_Delay100mS
SNZ P_KeyCali_F
JMP L_InitTestLoop
CALL B_Delay100mS
CALL B_Delay100mS
CLR R_ModeFlag
; SET R_ModeSet_F/2005-7-1 ;设置模式
SET R_ModeCali_F ;标定模式
CLR R_ModeSetCnt
L_InitTestEnd:
;测试读存贮器/如果没有在"AddrTest"地址读到55H,则报错关机.
L_InitTest2402: ;Test2402
MOV A, 1
MOV R_F24C02Cnt, A
MOV A, OFFSET R_PubReg_0
MOV R_FArrayAddr_L, A
MOV A, AddrTest
MOV R_F24C02Addr, A
SET R_FI2CRead_F ;读操作
CALL B_24C02
SZ R_FI2CErr_F
JMP L_InitTestErr1
MOV A, R_PubReg_0
SUB A, 55H
SZ Z
JMP L_InitTest2402End
L_InitTestErr1:
MOV A, LOW TabLCDErr1 ;显示'Err1',表示写2402出错
CALL B_ReadWord
CALL B_LCD
CALL B_Delay2000mS ;延时2秒
SNZ R_ModeCali_F
JMP L_OFF
L_InitTest2402End:
;初始化/读设置值处理
L_InitReadSet: ;给默认值
MOV A, 00000011B
MOV R_SetFlag, A
MOV A, 120 ;有重量解锁定时间:30秒
MOV R_SetLockCnt, A
MOV A, 09H ;最大量程:180.1KG
MOV R_SetMAX_L, A
MOV A, 07H
MOV R_SetMAX_H, A
MOV A, 03 ;记忆值范围:3D
MOV R_SetMemoryRange, A
MOV A, 32 ;关机时间:8秒
MOV R_SetOFFCnt, A
MOV A, 10 ;无重量时解解锁时间,5秒.8/2+3=5.
MOV R_SetClrLockCnt, A
MOV A, 12 ;开机预热时间,3秒
MOV R_SetWarmUpCnt, A
MOV A, 9 ;进入锁定的时间,2.5秒
MOV R_SetInLockCnt, A
MOV A, 25 ;最小显示值,25D.
MOV R_SetShowMin, A
MOV A, 56 ;清除记忆的时间.30秒.
MOV R_SetClrMemory, A
MOV A, 00000001B ;单位,KG.
MOV R_UnitFlag, A
MOV A, 12
MOV R_F24C02Cnt, A
MOV A, OFFSET R_SetFlag
MOV R_FArrayAddr_L, A
MOV A, AddrFlag
MOV R_F24C02Addr, A
SET R_FI2CRead_F ;读操作
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -