⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 峰值电流表.asm

📁 本程序是本人开发峰值电流表利用C8051F330的10位AD编写的汇编程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:

;****************定点计算子程序****************
;双字节无符号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 + -