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

📄 波形信号发生器程序.asm

📁 基于单片机的移相式函数发生器设计,用汇编语言编写!
💻 ASM
📖 第 1 页 / 共 4 页
字号:
           AD0	  EQU	30H
           AD1	  EQU	31H
           AD2	  EQU	32H
           AD3	  EQU	33H
           AD4	  EQU	34H
           AD5	  EQU	35H
           AD6	  EQU	36H
           ADA	  EQU	4FH
           ADB	  EQU	5FH
           ADC	  EQU	4DH
           ADDV	  EQU	5DH
;非压缩的BCD码转换成十六数
BCDHEX :   MOV     4CH,#00H
           MOV     4DH,#00H
           MOV     4EH,#10H
           MOV     4FH,#00H
           MOV     R7,#04H
KL:        MOV     A,@R0
           MOV     @R1,A
           INC     R0
           MOV     A,@R0
           SWAP    A
           ORL     A,@R1
           MOV     @R1,A
           INC     R0
           DEC     R1
           DJNZ    R7,KL
           NOP		       ; N BYTES COMPRESSED BCD CODES TO M BYTES HEX CODES
	   MOV	   30H,#07H  ; HERE N=M=3	   BCD(4C,4D,4E,4FH)--HEX(5C,5D,5E,5FH)
	   MOV     31H,#07H
	   MOV     R1,#ADB
      	   MOV     R2,AD1
	   MOV     R3,AD0
	   MOV	   A,#ADA
	   CLR	   C
 	   SUBB    A,R3
	   INC	   A
	   MOV	   R0,A
DBNZ:      MOV	   @R1,#00H
	   DEC	   R1
	   DJNZ	   R2,DBNZ
	   SJMP	   DBNB
DBNJ:      MOV	   R1,#ADB
	   MOV	   R2,AD1
	   CLR	   00H
	   CLR	   A
DBNM:      XCH	   A,@R1
	   MOV	   B,#64H
	   MUL	   AB
	   MOV	   C,00H
	   ADDC	   A,@R1
	   MOV	   @R1,A
	   MOV	   00H,C
	   MOV	   A,B
	   DEC	   R1
	   DJNZ	   R2,DBNM
DBNB:	   CLR	   A
	   XCHD	   A,@R0
	   XCH     A,@R0
	   SWAP	   A
	   MOV	   B,#0AH
	   MUL	   AB
	   ADD	   A,@R0
	   INC	   R0
DBNA:	   MOV	   R2,AD1
	   DEC	   R2
	   MOV	   R1,#ADB
	   ADD	   A,@R1
	   MOV	   @R1,A
DBNL:	   DEC	   R1
	   CLR	   A
	   ADDC	   A,@R1
	   MOV	   @R1,A
	   DJNZ	   R2,DBNL
	   DJNZ	   R3,DBNJ
           NOP
           RET

;乘法子程序
MULNM:     NOP                                 ; N BYTES X M BYTES = N+M BYTES HERE N=4;M=4
	   MOV	30H,#07H                      ; (4C,4D,4E,4FH)*(5C,5D,5E,5FH)=(58--5FH)
	   MOV	31H,#08H
MULTT:	   MOV	A,AD0
	   MOV	R3,AD1
	   MOV	R2,A
	   ADD	A,R3
	   INC	A
	   MOV	AD2,A
	   MOV	A,#ADB
	   CLR	C
	   SUBB	A,R3
	   MOV	AD6,A
	   MOV	R1,A
	   SUBB	A,R2
	   MOV	AD5,A
	   INC	R2
MULNMZ:    MOV	@R1,#00H
	   DEC	R1
	   DJNZ	R2,MULNMZ
MULNMB:    MOV	R2,AD0
	   MOV	R1,AD6
	   MOV	R0,#ADA
	   CLR	00H
MULNML:    MOV	A,ADB
	   JZ	MULNMD
	   MOV	B,@R0
	   MUL	AB
	   ADD	A,@R1
	   MOV	@R1,A
	   JNB	00H,MULNM1
	   INC	B
MULNM1:    MOV	A,B
	   DEC	R1
	   ADDC	A,@R1
	   MOV	@R1,A
	   MOV	00H,C
	   DEC	R0
	   DJNZ	R2,MULNML
MULNMD:    MOV	R0,AD5
	   CLR	A
	   MOV	R2,AD2
MULNMS:    XCH	A,@R0
	   INC	R0
	   DJNZ	R2,MULNMS
	   DJNZ	R3,MULNMB
           NOP
           RET

;除法子程序
DIVD2:     NOP                                   ;2N BYTE / N BYTE = N BYTE ,HERE N=3 IN 31H
 	   MOV	30H,#0CH                        ;(4A,4B,4C,4D,4E,4FH)/(5D,5E,5FH)=(4D,4E,4FH)
	   MOV	31H,#06H
DIVPP:     MOV	A,AD1
	   MOV	R2,A
	   RL	A
	   RL	A
	   RL	A
	   MOV	R3,A
	   CLR	0F0H
	   CLR	C
	   MOV	A,#ADA
	   SUBB	A,R2
	   MOV	AD3,A
	   MOV	R1,#ADB
 DIVMB2B:  MOV	A,@R1
	   JNZ	DIVM2B
	   DEC	R1
	   DJNZ	R2,DIVMB2B
	   SETB	0F0H
	   RET
 DIVM2B:   MOV	R2,AD1
	   MOV	R1,#ADB
	   MOV	R0,AD3
 DIVM2L:   MOV	A,@R0
	   SUBB	A,@R1
	   DEC	R0
	   DEC	R1
	   DJNZ	R2,DIVM2L
	   JNC	DIVM20
 DIVM2D:   LCALL SHIL1
	   JC	DIVM2S
 DIVM2C:   MOV	R0,AD3
	   MOV	R1,#ADB
	   MOV	R2,AD1
 DIVM2CL:  MOV	A,@R0
	   SUBB	A,@R1
	   DEC	R0
	   DEC	R1
	   DJNZ	R2,DIVM2CL
	   JC	DIVM2E
 DIVM2S:   INC	ADA
	   MOV	R2,AD1
	   MOV	R0,AD3
	   MOV	R1,#ADB
	   LCALL SUBMBB
 DIVM2E:   DJNZ	R3,DIVM2D
           RET
 DIVM20:   SETB	0F0H
	   RET

 SHIL1:    MOV	R2,AD0
	   MOV	R0,#ADA
 SHIL1B:   CLR	C
 SHILL:    MOV	A,@R0
	   RLC	A
	   MOV	@R0,A
	   DEC	R0
	   DJNZ	R2,SHILL
	   RET

 SUBMBB:   CLR	C
 SUBMB1:   MOV	A,@R0
	   SUBB	A,@R1
    	   MOV	@R0,A
	   DEC	R0
	   DEC	R1
	   DJNZ	R2,SUBMB1
	   RET

;24C04读写程序
;写程序
w24c02:    PUSH  PSW
           SETB  RS0
           SETB   RS1
           LCALL    WRNBYT
           LCALL    DELAY
           POP      PSW
           RET
;读程序
R24C02:    MOV      COMXSTART,#0B8H           ;液晶清屏
           MOV      COMXEND,  #0BFH
           MOV      COMYSTART,#40H
           MOV      COMYEND,  #7FH
           LCALL    CLEAR1
           LCALL    RDNBYT
           CLR      P1.2
           NOP
           NOP
           SETB     P1.2
           NOP
           NOP
           CLR      P1.2

           CLR      P1.0
           CLR      P1.1
           NOP
           MOV      P2,#01H              ;W0
           NOP
           SETB     P1.0
           NOP
           NOP
           CLR      P1.0

           NOP
           NOP
           MOV      A,50H                ;W1
           MOV      P2,A
           NOP
           SETB     P1.0
           NOP
           NOP
           CLR      P1.0


           NOP
           NOP
           MOV      A,51H                ;W2
           MOV      P2,A
           NOP
           SETB     P1.0
           NOP
           NOP
           CLR      P1.0

           NOP
           NOP
           MOV      A,52H                ;W3
           MOV      P2,A
           NOP
           SETB     P1.0
           NOP
           NOP
           CLR      P1.0

           NOP
           NOP
           MOV      A,53H                ;W4
           MOV      P2,A
           NOP
           SETB     P1.0
           NOP
           NOP
           CLR      P1.0

           NOP
           NOP
           SETB     P1.1
           NOP
           NOP
           NOP
           NOP
           CLR      P1.1
           NOP
           NOP
           NOP
           NOP
           LJMP    TSF0

WRNBYT:    PUSH     PSW                  ;现场保护
           CLR      RS0
           SETB     RS1                   ;使用1区工作寄存器
           MOV      A,      #08H             ;写数据子程序。
           MOV      R3,     A
           LCALL    STA                    ;开始子程序
           MOV      A,      #0A0H          ;定控制字,准备发送
           LCALL    WRBYT                  ;发送控制字
           LCALL    CACK                   ;应答判断子程序
           JB       FFF,    RETWRN
           MOV      A,      ADDR         ;写入24C02的地址指针。从0FH开始放数据。
           LCALL    WRBYT                ;发送数据指针。
           LCALL    CACK                 ;查应答信号。
           MOV      R1,     #DATA0       ;将40 H单元开始的数据写入24CO2,总共8个数据。
 WRDA:     MOV      A,      @R1
           LCALL    WRBYT
           LCALL    CACK
           JB       FFF,    WRNBYT
           INC      R1
           DJNZ     R3,     WRDA
RETWRN:    LCALL    STOP
           POP      PSW
           RET
RDNBYT:    PUSH     PSW                 ;现场保护
           MOV      PSW,    #18H        ;使用IV区工作寄存器
           MOV      R3,      #08H
           LCALL    STA                    ;发送开始信号
           MOV      A,       #0A0H         ;定控制字,准备发送
           LCALL    WRBYT                 ;发送控制字
           LCALL    CACK                  ;采集应答信号。
           JB       FFF,     RETRDN       ;非应答则重发
           MOV      A,       ADDR        ;准备发送地址指针。
           LCALL    WRBYT                 ;发送数据。
           LCALL    CACK                  ;采集应答信号。
           JB       FFF,     RDNBYT
           LCALL    STA                    ;从新发送开始信号。
           MOV      A,       #0A1H         ;准备发送数据令R/W=‘1’。
           LCALL    WRBYT                 ;发送
           LCALL    CACK                  ;采样应答信号
           JB       FFF,     RDNBYT
           MOV      R1,      #DATA1         ;设置采集数据保存单元。
RDN1:      LCALL    RDBYT
           MOV      @R1,     A
           DJNZ     R3,      SACK
           LCALL    MNACK
           SJMP     RETRDN
SACK:      LCALL    MACK
           INC      R1
           SJMP     RDN1
RETRDN:    LCALL    STOP
           POP      PSW
           RET
;启动I2C总线子程序
STA:       SETB       SDA
           NOP
           SETB       SCL     ;起始条件建立时间大于4.7uS
           NOP
           NOP
           NOP
           NOP
           NOP
           CLR        SDA
           NOP                ;起始条件锁定时大于4uS
           NOP
           NOP
           NOP
           NOP
           CLR        SCL     ;锁住总线,整备发数据
           NOP
           RET
 ;结束总线子程序
STOP:      CLR        SDA
           NOP
           SETB       SCL     ;发送结束条件的时钟信号
           NOP                ;结束总线时间大于4uS
           NOP
           NOP
           NOP
           NOP
           SETB       SDA     ;结束总线
           NOP                ;保证一个终止信号和起始信号的空闲时间大于4.7uS
           NOP
           NOP
           CLR        SCL
           RET
 ;发送应答信号子程序
MACK:      CLR        SDA     ;将SDA置0
           NOP
           NOP
           SETB       SCL
           NOP                ;保持数据时间,即SCL为高时间大于4.7uS
           NOP
           NOP
           NOP
           NOP
           CLR        SCL
           NOP
           SETB       SDA
           RET
;发送非应答信号子程序
MNACK:     SETB      SDA     ;将SDA置1
           NOP
           NOP
           SETB      SCL
           NOP
           NOP               ;保持数据时间,即SCL为高时间大于4.7uS
           NOP
           NOP
           NOP
           CLR       SCL
           RET
 ;检查应答位子程序
 ;在FFF=0时表示有应答
 CACK:     SETB      SDA
           NOP
           NOP
           SETB      SCL
           CLR       FFF
           NOP
           NOP
           MOV       C,      SDA
           JNC       CEND
           SETB      FFF           ;用用户位做判断应答位
 CEND:     NOP
           CLR       SCL
           NOP
           RET
 ;发送字节子程序
 ;字节数据放入ACC
 ;每发送一字节要调用一次CACK子程序,取应答位
WRBYT:     MOV       R0,     #08H
  WLP:     RLC       A               ;取数据位
           JC        WR1
           LJMP      WR0             ;判断数据位
 WLP1:     DJNZ      R0,     WLP
           NOP
           RET
 WR1:      SETB      SDA             ;发送1
           NOP
           SETB      SCL
           NOP
           NOP
           NOP
           NOP
           NOP
           CLR       SCL
           CLR       SDA
           LJMP      WLP1
 WR0:      CLR       SDA             ;发送0
           NOP
           SETB      SCL
           NOP
           NOP
           NOP
           NOP
           NOP
           CLR       SCL
           LJMP      WLP1
;读取字节子程序
;读出的值在ACC
;每取一字节要发送一个应答/非应答信号
RDBYT:     MOV       R0,     #08H
  RLP:     SETB      SDA
           NOP
           SETB      SCL             ;时钟线为高,接收数据位
           NOP
           NOP
           MOV       C,      SDA     ;读取数据位
           MOV       A,      R2
           CLR       SCL             ;将SCL拉低,时间大于4.7uS
           RLC       A               ;进行数据位的处理
           MOV       R2,     A
           NOP
           NOP
           NOP
           DJNZ      R0,     RLP     ;未够8位,再来一次
           RET

           END

⌨️ 快捷键说明

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