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

📄 发送,接收,运算,4x4键盘,i2c,.asm

📁 汇编语言常用程序,包括运算,掉电保存,按键,液晶显示,串口传送
💻 ASM
📖 第 1 页 / 共 3 页
字号:
     cjne a,#00h,go_on_v
     mov a,3bh    ;判断电压百位是否为0
     cjne a,#00h,go_on_i_compare
     jmp display_0w
go_on_i_compare:
     mov a,57h    ;判断电流百位是否为0
     cjne a,#00h,nmul_w
display_0w:       ;电压和电流的百位都为0,结果直接显示0
     mov 5ah,#00h
     mov 5bh,#00h
     mov 5ch,#00h
     mov 5dh,#00h
     call DISPLAY_to_count_w 
     ret
;.......................................
nmul_w:
     mov a,3bh                ; 电压,电流千位都为0,显示结果即为,电压的百位和电流的百位相乘,即3bh x 57h,
     mov b,57h
     mul ab
     mov 40h,a
     mov 41h,b
     CALL  to_rather_DATE_w
     ret
go_on_v:
     mov a,57h    ;判断电流百位是否为0
     cjne a,#00h,mul_i_and_v     
     mov 5ah,#00h         ;电压的千位不为0,但电流的百位为0,即显示结果为0,电流最大值为400
     mov 5bh,#00h
     mov 5ch,#00h
     mov 5dh,#00h
     call DISPLAY_to_count_w 
     ret
mul_i_and_v:         ;电压的千位不为0,电流的百位也不为0,即显示结果如下
     mov a,3ah
     mov b,#0ah
     mul ab
     mov 69h,a
     mov a,3bh
     add a,69h             ;电压百千位转换成十六进制放在69h
     mov 69h,a             ;已判断电压千位不为0
;......................................................
     mov a,57h
     mov b,69h           
     mul ab              ;再乘上电压的百位3bh
     mov 40h,a
     mov 41h,b 
     CALL  to_rather_DATE_w
     ret*/
   
;**************************************             
;////////////////////////////////////////////////
to_rather_DATE_w:     ;将功率的16进制转化成十进制显示
      ; MOV 40H,69H    ;低8位
      ; MOV 41H,6bH    ;高8位
     ;  MOV 40H,#0ffH    ;低8位
      ; MOV 41H,#0efH    ;高8位
       CALL H16_D10
       MOV 5dH,D1
       MOV 5cH,D2
       MOV 5bH,D3
       MOV 5aH,D4
       CALL DISPLAY_to_count_w
       ret
;***********************************************
;**********************************************接收显示转换 
from_two_DATE_i:                 ;将读回电流的16进制转化成十进制显示
      ;MOV 40H,#00H   ; 低8位
      ; MOV 41H,#08H   ; 高8位 
       MOV 40H,36H   ; 低8位
       MOV 41H,37H   ; 高8位 
       CALL H16_D10
       MOV 55H,D1     ;个
       MOV 56H,D2     ;十
       MOV 57H,D3     ;百
       MOV 58H,D4     ;千
       CALL DISPLAY_read_i   
       ret
;................................................   

DISPLAY_read_i :
       MOV p1,#0c1H           ;千位
       ACALL ENABLE  
       MOV A,58H
       MOVC A, @A+DPTR
       CALL  write2
 ;......................
       MOV p1,#0c2H           ;百位
       ACALL ENABLE  
       MOV A,57H
       MOVC A, @A+DPTR
       CALL  write2
;..........................
       MOV p1,#0c4H           ;十位
       ACALL ENABLE  
       MOV A,56H
       MOVC A, @A+DPTR
       CALL  write2
;..........................
       MOV p1,#0c5H           ;个位
       ACALL ENABLE  
       MOV A,55H
       MOVC A, @A+DPTR
       CALL  write2

	    ret
;****************************************************
DISPLAY_read_i_ffff :
       MOV p1,#0c1H           ;千位
       ACALL ENABLE  
       MOV A,#0bH
       MOVC A, @A+DPTR
       CALL  write2
 ;......................
       MOV p1,#0c2H           ;百位
       ACALL ENABLE  
       MOV A,#0bH
       MOVC A, @A+DPTR
       CALL  write2
;..........................
       MOV p1,#0c4H           ;十位
       ACALL ENABLE  
       MOV A,#0bH
       MOVC A, @A+DPTR
       CALL  write2
;..........................
       MOV p1,#0c5H           ;个位
       ACALL ENABLE  
       MOV A,#0bH
       MOVC A, @A+DPTR
       CALL  write2

	    ret
;////////////////////////////////////////////////////
;************************************************
DISPLAY_to_count_w :
       MOV p1,#0c9H           ;千位
       ACALL ENABLE  
       MOV A,5aH
       MOVC A, @A+DPTR
       CALL  write2
 ;......................
       MOV p1,#0caH           ;百位
       ACALL ENABLE  
       MOV A,5bH
       MOVC A, @A+DPTR
       CALL  write2
;..........................
       MOV p1,#0cbH           ;十位
       ACALL ENABLE  
       MOV A,5cH
       MOVC A, @A+DPTR
       CALL  write2
;..........................
       MOV p1,#0cdH           ;个位
       ACALL ENABLE  
       MOV A,5dH
       MOVC A, @A+DPTR
       CALL  write2

	    ret
;............................  
;//////////////////////////////  
ENABLE: 
        CLR RS              ;写指令 ,  以下为液晶显示子程序
        CLR RW 
        CLR E 
        ACALL DELAY 
        SETB E 
        RET 

DELAY: 
     MOV p1,#0FFH 
     CLR RS 
     SETB RW 
     CLR E 
     NOP 
     NOP
     NOP
     SETB E 
     JB p1.7,delay         ;忙检测
     RET 

write2:             ;写数据
         mov p1,a 
         SETB RS 
         CLR RW 
         CLR E 
	      NOP
         JB p1.7,$
         SETB E 
         lcall delay1
         ret
;/////////////////////////////////////////////////////
;....................................................
;////////////////////////////////////////////////////
 STA:SETB VSDA   ;启动I2C总线, 软件包
	SETB VSCL
	NOP
	NOP
	NOP
	NOP
	CLR VSDA
	NOP
	NOP
	NOP
	NOP
	CLR VSCL
	RET 
;*************************
STOP: 
	CLR 	VSDA ;停止I2C总线数据传送
	SETB 	VSCL
	NOP
	NOP
	NOP
	NOP
	SETB 	VSDA
	NOP
	NOP
	NOP
	NOP
	CLR	VSDA
	CLR 	VSCL
	RET

MACK: 
	CLR 	VSDA ;发送应答位
	SETB 	VSCL
	NOP
	NOP
	NOP
	NOP	
	CLR 	VSCL
	SETB 	VSDA
	RET 

MNACK: 
	SETB 	VSDA ;发送非应答位
	SETB 	VSCL
	NOP
	NOP
	NOP
	NOP
	CLR 	VSCL
	CLR 	VSDA
	RET 

CACK: 	SETB 	VSDA ;应答位检查
	SETB 	VSCL
	CLR 	F0
	MOV 	C,VSDA
	JNC 	CEND
	SETB 	F0 
CEND: 	CLR 	VSCL
	RET 

WRBYT:MOV 	R0,#08H ;向VSDA线上发送1个数据字节 
WLP: 	RLC 	A
	   JC 	WR1
   	AJMP 	WR0 
WLP1: DJNZ 	R0,WLP
      RET 
WR1: SETB 	VSDA
     SETB 	VSCL
    	NOP
   	NOP
   	NOP
	  NOP
	  CLR 	VSCL
	  CLR 	VSDA
	  AJMP 	WLP1 
WR0: 	CLR 	VSDA
	SETB 	VSCL
	NOP
	NOP
	NOP
	NOP
	CLR 	VSCL
	AJMP 	WLP1 

RDBYT: 	MOV 	R0,#08H ;从VSDA线上读取1个数据字节 
RLP: 	SETB 	VSDA
	SETB 	VSCL
	MOV 	C,VSDA
	MOV 	A,R2
	RLC	A
	MOV 	R2,A
	CLR 	VSCL
	DJNZ 	R0,RLP
	RET 

WRNBYT: MOV 	R3,NUMBYT ;虚拟I2C总线发送N个字节数据
	LCALL 	STA
	MOV 	A,SLA
	LCALL 	WRBYT
	LCALL 	CACK
	JB 	F0,WRNBYT
	MOV 	R1,#MTD 
WRDA: 	MOV 	A,@R1
	LCALL 	WRBYT
	LCALL 	CACK
	JB 	F0,WRNBYT
	INC 	R1
	DJNZ 	R3,WRDA
	LCALL 	STOP
	RET 
RDNBYT: MOV 	R3, NUMBYT ;模拟I2C总线接收n个 ;字节数据
	LCALL 	STA
	MOV 	A,SLA
	LCALL 	WRBYT
	LCALL 	CACK
	JB 	F0,RDNBYT 
RDN: 	MOV 	R1,#MRD 
RDN1:	LCALL 	RDBYT
	MOV 	@R1,A
	DJNZ 	R3,ACK
	LCALL 	MNACK
	LCALL 	STOP
	RET 
ACK: 	LCALL 	MACK
	INC 	R1
	SJMP 	RDN1
;////////////////////////////////////////////////////
;....................................................
;////////////////////////////////////////////////////

	
H16_D10:	
   push psw				
   ;MOV 41H,TDATA_h
	;MOV 40H,TDATA_l
	MOV 44H,#10H
	MOV 45H,#27H
	CALL DIV16
   MOV D5,40H

   MOV 40H,42H
   MOV 41H,43H
   MOV 44H,#0E8H
   MOV 45H,#03H
   CALL DIV16
   MOV D4,40H
H16_D101:
      ;MOV 42H,TDATA_L
    	;MOV 43H,TDATA_h
        MOV 40H,42H
        MOV 41H,43H
        MOV 44H,#64H
        MOV 45H,#00H
        CALL DIV16
        MOV D3,40H
        
        MOV 40H,42H
        MOV 41H,43H
        MOV 44H,#0AH
        MOV 45H,#00H
        CALL DIV16
        MOV D2,40H
        MOV D1,42H
        mov f0,c
        mov 66h,f0
        mov 66h,a

  pop psw
        RET  
;十六进制除法运算
;输入:被除数放在40H,41H,除数放在内44H,45H,商放在40H,41H,余数放在42H,43H,
DIV16:
     PUSH	PSW
	  setb rs0
     MOV R0,#40H
     MOV A,@R0
     JNZ LOP0
     INC R0
     MOV A,@R0
     JNZ LOP0
     CLR A
     MOV 42H,A
     MOV 43H,A
     RET
LOP0:MOV R0,#44H
     MOV A,@R0
     JNZ LOP1
     INC R0
     MOV A,@R0
     JNZ LOP1
     RET
LOP1:CLR A
     MOV 42H,A
     MOV 43H,A
     MOV R2,#10H
LOP2:CLR C
     MOV R3,#04H
     MOV R0,#40H
LOP3:MOV A,@R0
     RLC A
     MOV @R0,A
     INC R0
     DJNZ R3,LOP3
     MOV R0,#42H
     MOV R1,#44H
     MOV A,@R0
     CLR C
     SUBB A,@R1
     MOV 48H,A
     INC R0
     INC R1
     MOV A,@R0
     SUBB A,@R1
     MOV 49H,A
     JC LOP4
     MOV R0,#42H
     MOV R1,#48H
     MOV A,@R1
     MOV @R0,A
     INC R0
     INC R1
     MOV A,@R1
     MOV @R0,A
     MOV A,40H
     INC A
     MOV 40H,A
LOP4:DJNZ R2,LOP2
     pop PSW
     RET
;..................................
;/////////////////////////////////
DELAY2:                                 ;40ms延时去抖动子程序8*FA*2=4ms
      MOV R5,#08H                    
L7:	MOV R6,#0FAH  ;250
L8:	DJNZ R6,L8
      DJNZ R5,L7
      RET
delay1:
     mov r5,#250                       ;液晶显示刷新速度
d9:  mov r6,#250
d8: djnz r6,d8
    djnz r5,d9
    ret

/*delay100us:
			mov r5,#5
			djnz	r5,$
			ret

DELAY_10MS:
			mov r6,#100
tt2:
			mov r5,#50
			djnz r5,$
			djnz r6,tt2
			ret*/
			
tab:     db '0','1','2','3','4','5','6','7','8','9','.','F','W','V','A'
end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -