📄 峰值电流表.asm
字号:
;****************定点计算子程序****************
;双字节无符号16进制数减法程序 (R3R4-R6R7)=(R3R4)
;入口: R3,R4,R6,R7
;占用资源: ACC,PSW
;堆栈需求: 2字节
;出口:差在R3,R4,PSW,R3R4>=R6R7,CY=0;R3R4<R6R7,CY=1
NSUB : MOV A,R4
CLR C
SUBB A,R7
MOV R4,A
MOV A,R3
SUBB A,R6
MOV R3,A
RET
;双字节BCD码加1子程序
;入口条件:被加数在[R4R5]中
;出口信息:和在中[R4R5]
BCDADD2: MOV A,R5
ADD A,#01H
DA A
MOV R5,A
MOV A,R4
ADDC A,#00H
DA A
MOV R4,A
RET
;(1) 标号: BCDA 功能:多字节BCD码加法
;入口条件:字节数在R7中,被加数在[R0]中,加数在[R1]中。
;出口信息:和在[R0]中,最高位进位在CY中。
;影响资源:PSW、A、R2 堆栈需求: 2字节
BCDA: MOV A,R7 ;取字节数至R2中
MOV R2,A
ADD A,R0 ;初始化数据指针
MOV R0,A
MOV A,R2
ADD A,R1
MOV R1,A
CLR C
BCD1: DEC R0 ;调整数据指针
DEC R1
MOV A,@R0
ADDC A,@R1 ;按字节相加
DA A ;十进制调整
MOV @R0,A ;和存回[R0]中
DJNZ R2,BCD1 ;处理完所有字节
RET
;(21)标号: BH2 功能:双字节BCD码整数转换成双字节十六进制整数
;入口条件:待转换的双字节BCD码整数在R2、R3中。
;出口信息:转换后的双字节十六进制整数仍在R2、R3中。
;影响资源:PSW、A、B、R2、R3、R4 堆栈需求: 4字节
BH2: MOV A,R3 ;将低字节转换成十六进制
LCALL BCDH
MOV R3,A
MOV A,R2 ;将高字节转换成十六进制
LCALL BCDH
MOV B,#100 ;扩大一百倍
MUL AB
ADD A,R3 ;和低字节按十六进制相加
MOV R3,A
CLR A
ADDC A,B
MOV R2,A
RET
;(20)标号:BCDH 功能:单字节BCD码整数转换成单字节十六进制整数
;入口条件:待转换的单字节BCD码整数在累加器A中。
;出口信息:转换后的单字节十六进制整数仍在累加器A中。
;影响资源:PSW、A、B、R4 堆栈需求: 2字节
BCDH: MOV B,#10H ;分离十位和个位
DIV AB
MOV R4,B ;暂存个位
MOV B,#10 ;将十位转换成十六进制
MUL AB
ADD A,R4 ;按十六进制加上个位
RET
;****************定点计算子程序****************
;(5)标号:MULD,功能:双字节二进制无符号数乘法
;入口条件:被乘数在R2、R3中,乘数在R6、R7中。
;出口信息:乘积在R2、R3、R4、R5中。
;影响资源:PSW、A、B、R2~R7,堆栈需求:2字节
MULD: MOV A,R3 ;计算R3乘R7
MOV B,R7
MUL AB
MOV R4,B ;暂存部分积
MOV R5,A
MOV A,R3 ;计算R3乘R6
MOV B,R6
MUL AB
ADD A,R4 ;累加部分积
MOV R4,A
CLR A
ADDC A,B
MOV R3,A
MOV A,R2 ;计算R2乘R7
MOV B,R7
MUL AB
ADD A,R4 ;累加部分积
MOV R4,A
MOV A,R3
ADDC A,B
MOV R3,A
CLR A
RLC A
XCH A,R2 ;计算R2乘R6
MOV B,R6
MUL AB
ADD A,R3 ;累加部分积
MOV R3,A
MOV A,R2
ADDC A,B
MOV R2,A
RET
;(7)标号:DIVD,功能:双字节二进制无符号数除法
;入口条件:被除数在R2、R3、R4、R5中,除数在R6、R7中。
;出口信息:OV=0 时,双字节商在R2、R3中,OV=1 时溢出。
;影响资源:PSW、A、B、R1~R7,堆栈需求:2字节
DIVD: CLR C ;比较被除数和除数
MOV A,R3
SUBB A,R7;
MOV A,R2;
SUBB A,R6;
JC DVD1;
SETB OV ;溢出
RET
DVD1: MOV B,#10H ;计算双字节商
DVD2: CLR C ;部分商和余数同时左移一位
MOV A,R5;
RLC A;
MOV R5,A;
MOV A,R4;
RLC A;
MOV R4,A;
MOV A,R3;
RLC A;
MOV R3,A;
XCH A,R2;
RLC A;
XCH A,R2;
MOV F0,C ;保存溢出位
CLR C;
SUBB A,R7 ;计算(R2R3-R6R7)
MOV R1,A;
MOV A,R2;
SUBB A,R6;
ANL C,/F0 ;结果判断
JC DVD3;
MOV R2,A ;够减,存放新的余数
MOV A,R1;
MOV R3,A;
INC R5 ;商的低位置一
DVD3: DJNZ B,DVD2 ;计算完十六位商(R4R5)
MOV A,R4 ;将商移到R2R3中
MOV R2,A;
MOV A,R5;
MOV R3,A;
CLR OV ;设立成功标志
RET
;(3) 标号: HB2 功能:双字节十六进制整数转换成双字节BCD码整数
;入口条件:待转换的双字节十六进制整数在R6、R7中。
;出口信息:转换后的三字节BCD码整数在R3、R4、R5中。
;影响资源:PSW、A、R2~R7 堆栈需求: 2字节
HB2: CLR A ;BCD码初始化
MOV R3,A
MOV R4,A
MOV R5,A
MOV R2,#10H ;转换双字节十六进制整数
HB3: MOV A,R7 ;从高端移出待转换数的一位到CY中
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
MOV A,R5 ;BCD码带进位自身相加,相当于乘2
ADDC A,R5
DA A ;十进制调整
MOV R5,A
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
MOV A,R3
ADDC A,R3
MOV R3,A ;双字节十六进制数的万位数不超过6,不用调整
DJNZ R2,HB3 ;处理完16bit
RET
;******************************************
;双字节无符号16进制加法子程序
;入口条件:被加数在[R2],[R3]中,加数在[R4],[R5]中。
;出口信息:和在[R2],[R3]中,最高位进位在CY中,高位字节在前
;影响资源:PSW、A、R2
;******************************************
HEX2A: PUSH ACC
PUSH PSW
MOV A,R5
ADD A,R3
MOV R3,A
MOV A,R2
ADDC A,R4
MOV R2,A
POP PSW
POP ACC
RET
;****************定点计算子程序结束****************
;************CH452初始化子程序************
CH452_INI:
MOV CH452_CMD,#04H ;设置系统参数命令
MOV A,#01H ;禁止看门狗,关闭键盘功能,使能显示驱动,
CALL CH452_WRITE ;发出命令
MOV CH452_CMD,#05H ;设置显示参数
MOV A,#0C0H ;BCD译码方式,扫描极限为4
CALL CH452_WRITE ;发出命令
MOV CH452_CMD,#08H
MOV A,#01H ;0位显示0
CALL CH452_WRITE
MOV CH452_CMD,#09H
MOV A,#02H ;1位显示1
CALL CH452_WRITE
MOV CH452_CMD,#0AH
MOV A,#03H ;2位显示2
CALL CH452_WRITE
MOV CH452_CMD,#0BH
MOV A,#04H ;3位显示3
CALL CH452_WRITE
RET
;************CH452初始化子程序结束********
;********************CH452显示子程序****************************
DISP:
;LCALL DISP
MOV CH452_CMD,#04H ;设置系统参数命令
MOV A,#01H ;禁止看门狗,关闭键盘功能,使能显示驱动,
CALL CH452_WRITE ;发出命令
MOV CH452_CMD,#05H ;设置显示参数
MOV A,#0C0H ;BCD译码方式,扫描极限为4
CALL CH452_WRITE ;发出命令
MOV CH452_CMD,#06H ;设置闪烁命令
MOV A,#00H ;禁止命令
CALL CH452_WRITE
MOV CH452_CMD,#08H
MOV A,DISP1000 ;显示千位数
CALL CH452_WRITE
MOV CH452_CMD,#09H
MOV A,DISP100 ;显示百位数
CALL CH452_WRITE
MOV CH452_CMD,#0AH
MOV A,DISP10 ;显示十位数
ORL A,#80H
CALL CH452_WRITE
MOV CH452_CMD,#0BH
MOV A,DISP1 ;显示个位数
CALL CH452_WRITE
RET
;****************CH4522线接口子程序****************
;开始总线子程序
;开始总线子程序
CH452_I2C_START:
SETB SDA
NOP
NOP
NOP
NOP
CLR SCL ;通知CH452,将要对其操作,此段时间不要再产生按键中断
CH452_I2C_START1:
NOP
NOP ;保留足够的时间给CH452产生中断
NOP
NOP
NOP
NOP
NOP
NOP
NOP
JNB SDA,CH452_I2C_START1 ;CH452正在请求中断?
NOP
NOP
NOP
NOP
NOP
SETB SDA
SETB SCL
NOP
NOP
NOP
NOP
NOP
NOP
NOP
CLR SDA
NOP
NOP
NOP
NOP
NOP
NOP
NOP
CLR SCL ;钳住总线,准备发数据
RET
;结束总线子程序
CH452_I2C_STOP:
CLR SDA
NOP
NOP
NOP
NOP
NOP
NOP
NOP
SETB SCL ;发送结束条件的时钟信号
NOP
NOP
NOP
NOP
NOP
NOP
NOP
SETB SDA ;结束总线
RET
;发送字节子程序
;字节数据放入ACC
CH452_IIC_WR:
MOV R7,#08H
CH452_IIC_WR1:
RLC A ;取数据位
MOV SDA,C
SETB SCL
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
CLR SCL
DJNZ R7,CH452_IIC_WR1
NOP
NOP
NOP
NOP
NOP
NOP
SETB SDA
SETB SCL
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
CLR SCL
RET
;
;读取字节子程序
;读出的值在ACC
CH452_IIC_RD:
MOV R7,#08H
CH452_IIC_RD1:
SETB SDA
SETB SCL ;时钟线为高,接收数据位
NOP
NOP
NOP
NOP
NOP
NOP
NOP
MOV C,SDA ;读取数据位
CLR SCL
RLC A ;进行数据位的处理
DJNZ R7,CH452_IIC_RD1 ;未够8位,再来一次
SETB SDA
SETB SCL
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
CLR SCL
RET
; 无子地址器件写字节数据
; 入口参数: CH452_CMD命令高字节, ACC命令低字节
CH452_WRITE:
PUSH ACC
CH452_WRITE1:
CALL CH452_I2C_START ;起动总线
MOV A,CH452_CMD
RLC A
ANL A,#3EH
ORL A,#40H ;当ADDR=0时此值为40H,当ADDR=1时此值为60H
LCALL CH452_IIC_WR ;发送命令高字节
POP ACC ;写数据
LCALL CH452_IIC_WR
LCALL CH452_I2C_STOP
RET
; 读取按键值
; 返回按键值在ACC中
CH452_READ: LCALL CH452_I2C_START
MOV A,#6FH ;发送读键盘命令,当ADDR=0时此值为4FH,当ADDR=1时此值为6FH
LCALL CH452_IIC_WR ;发送命令高字节
LCALL CH452_IIC_RD ;进行读字节操作
LCALL CH452_I2C_STOP ;结束总线
RET
;
DELAY: MOV R4,#0FFH
DELAY2: MOV R5,#0FFH
DELAY1: NOP
DJNZ R5,DELAY1
DJNZ R4,DELAY2
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -