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

📄 library.asm

📁 便携式压力传感器
💻 ASM
📖 第 1 页 / 共 5 页
字号:
; LIBRARY.ASM
; 采集系统所需的通用子程序
; 2002/05/02

;=============================================
;延时子程序
;=============================================
	;********************************
	;延时子程序: 1000ms
	;********************************
DELAY:  MOV     R7,#8
	MOV     R6,#00H
	MOV     R5,#00H
DELAY1: DJNZ    R5,DELAY1
	DJNZ    R6,DELAY1
	DJNZ    R7,DELAY1
	RET

	;********************************
	;延时子程序
	;********************************
DELAY250:
	MOV     R7,#1           ;TDELAY=250ms
	MOV     R6,#00H
	MOV     R5,#00H
DELAY250_1:
	DJNZ    R5,DELAY250_1
	DJNZ    R6,DELAY250_1
	DJNZ    R7,DELAY250_1
	RET

	;********************************
	;延时子程序
	;********************************
DELAY25:
	MOV     R7,#20H         ;TDEALY=16ms
	MOV     R6,#0
DELAY25_1:
	DJNZ    R6,DELAY25_1
	DJNZ    R7,DELAY25_1
	RET

	;********************************
	;延时子程序
	;********************************
DELAY1MS:
	MOV     R6,#0           ;TDEALY=0.5ms
DELAY1MS_1:
	DJNZ    R6,DELAY1MS_1
	RET

	;********************************
	;键盘延时子程序
	;********************************
DLKEY:MOV       R7,#0           ;TDEALY=131ms
	MOV     R6,#0
DLKEY_1:
	DJNZ    R6,DLKEY_1
	DJNZ    R7,DLKEY_1
	RET

	;********************************
	;键盘延时子程序:消抖
	;********************************
DLKEY1: MOV     R7,#40          ;TDEALY=20ms
	MOV     R6,#0
DLKEY1_1:
	DJNZ    R6,DLKEY1_1
	DJNZ    R7,DLKEY1_1
	RET

	;********************************
	;ADC连续采集间延时子程序
	;********************************
DLYADC: ;MOV    R7,#20H         ;12.5ms
	MOV     R7,#2
	MOV     R6,#0
DLYADC1:
	DJNZ    R6,DLYADC1
	DJNZ    R7,DLYADC1
	RET

;=============================================
;蜂鸣器子程序
;=============================================
	;********************************
	;200HZ
	;********************************
BUZZ200:MOV     T2MOD,#10B      ;脉冲输出使能
	CLR     CT2             ;定时器功能
	MOV     RCAP2H,#0ECH    ;频率=200Hz
	MOV     RCAP2L,#78H
	SETB    TR2             ;启动蜂鸣器
	LCALL   DELAY250        ;延时
	CLR     TR2             ;关闭蜂鸣器
	RET

	;********************************
	;300HZ
	;********************************
BUZZ300:MOV     T2MOD,#10B      ;脉冲输出使能
	CLR     CT2             ;定时器功能
	MOV     RCAP2H,#0F2H    ;频率=300Hz
	MOV     RCAP2L,#0FBH
	SETB    TR2             ;启动蜂鸣器
	LCALL   DELAY250        ;延时
	CLR     TR2             ;关闭蜂鸣器
	RET
	;********************************
	;300HZ
	;********************************
BUZZ300X:MOV    T2MOD,#10B      ;脉冲输出使能
	CLR     CT2             ;定时器功能
	MOV     RCAP2H,#0F2H    ;频率=300Hz
	MOV     RCAP2L,#0FBH
	SETB    TR2             ;启动蜂鸣器
	LCALL   DELAY25 ;延时
	CLR     TR2             ;关闭蜂鸣器
	RET

	;********************************
	;400HZ
	;********************************
BUZZ400:MOV     T2MOD,#10B      ;脉冲输出使能
	CLR     CT2             ;定时器功能
	MOV     RCAP2H,#0F6H    ;频率=400Hz
	MOV     RCAP2L,#3CH
	SETB    TR2             ;启动蜂鸣器
	LCALL   DELAY250        ;延时
	CLR     TR2             ;关闭蜂鸣器
	RET

	;********************************
	;500HZ
	;********************************
BUZZ500:MOV     T2MOD,#10B      ;脉冲输出使能
	CLR     CT2             ;定时器功能
	MOV     RCAP2H,#0F8H    ;频率=500Hz
	MOV     RCAP2L,#30H
	SETB    TR2             ;启动蜂鸣器
	LCALL   DELAY250        ;延时
	CLR     TR2             ;关闭蜂鸣器
	RET

	;********************************
	;600HZ
	;********************************
BUZZ600:MOV     T2MOD,#10B      ;脉冲输出使能
	CLR     CT2             ;定时器功能
	MOV     RCAP2H,#0F9H    ;频率=600Hz
	MOV     RCAP2L,#7EH
	SETB    TR2             ;启动蜂鸣器
	LCALL   DELAY250        ;延时
	CLR     TR2             ;关闭蜂鸣器
	RET

	;********************************
	;700HZ
	;********************************
BUZZ700:MOV     T2MOD,#10B      ;脉冲输出使能
	CLR     CT2             ;定时器功能
	MOV     RCAP2H,#0FAH    ;频率=700Hz
	MOV     RCAP2L,#6CH
	SETB    TR2             ;启动蜂鸣器
	LCALL   DELAY250        ;延时
	CLR     TR2             ;关闭蜂鸣器
	RET

	;********************************
	;800HZ
	;********************************
BUZZ800:MOV     T2MOD,#10B      ;脉冲输出使能
	CLR     CT2             ;定时器功能
	MOV     RCAP2H,#0FBH    ;频率=800Hz
	MOV     RCAP2L,#1EH
	SETB    TR2             ;启动蜂鸣器
	LCALL   DELAY250        ;延时
	CLR     TR2             ;关闭蜂鸣器
	RET

;===================================================
; I2C串行总线内存操作
; 2001/12/13
;===================================================
	;启动I2C操作
I2CSTART:
	SETB    SDA
	SETB    SCL
	NOP
	NOP
	NOP
	CLR     SDA
	NOP
	NOP
	NOP
	CLR     SCL
	RET

	;停止I2C操作
I2CSTOP:CLR     SDA   
	SETB    SCL    
	NOP
	NOP
	NOP
	SETB    SDA
	NOP
	NOP
	NOP
	CLR     SCL
	RET

	;主控发送I2C响应状态(MASTER ACK)
I2CMACK:CLR     SDA
	SETB    SCL
	NOP
	NOP
	NOP
	CLR     SCL
	SETB    SDA
	RET

	;主控发送I2C非响应状态(MASTER NOT ACK)
I2CMNACK:
	SETB    SDA 
	SETB    SCL
	NOP
	NOP
	NOP
	CLR     SCL
	CLR     SDA
	RET

	;检测来自被控的I2C响应状态(ACK)
	;I2CACKFLAG=0被控器件正确响应
	;I2CACKFLAG=1被控器件无响应
I2CACKCHK:
	SETB    SDA 
	SETB    SCL
	CLR     I2CACKFLAG
	MOV     C,SDA
	JNC     I2CACKCHK0
	SETB    I2CACKFLAG 
I2CACKCHK0:
	CLR     SCL
	NOP
	NOP
	NOP
	RET

	;********************************
	;单字节I2C写操作
	;ACC:存放欲写入的数据(一个字节)
	;********************************
I2CWRBYT:
	MOV     R0,#08H
I2CWRLP:
	RLC     A               ;首先发送MSB位
	JC      I2CWRHIGH       ;跳至写“1”
	SJMP    I2CWRLOW        ;跳至写“0”
I2CWRLP1:
	DJNZ    R0,I2CWRLP
	RET                     ;单字节写操作完毕,返回

I2CWRHIGH:
	SETB    SDA             ;写“1”
	SETB    SCL
	NOP
	NOP
	NOP
	CLR     SCL
	CLR     SDA
	SJMP    I2CWRLP1
I2CWRLOW:
	CLR     SDA             ;写“0”
	SETB    SCL
	NOP
	NOP
	NOP
	CLR     SCL
	SJMP    I2CWRLP1

	;********************************
	;连续N字节I2C写操作(不含停止状态)
	;********************************
I2CWRNBYT:
	PUSH    PSW             ;CPU状态入栈
	SETB    RS0             ;使用RBANK1
	CLR     RS1
I2CWRNBYT1:
	LCALL   I2CSTART        ;启动I2C总线
	MOV     A,SLA           ;被控器件地址SLA(写)
	LCALL   I2CWRBYT
	LCALL   I2CACKCHK
	JB      I2CACKFLAG,I2CWRNBYT1   ;I2C总线无响应,继续重复发送
	MOV     R1,#I2CDBUF             ;I2C数据缓存区首地址
I2CWRDATA:
	MOV     A,@R1
	LCALL   I2CWRBYT
	LCALL   I2CACKCHK
	JB      I2CACKFLAG,I2CWRDATA    ;I2C总线无响应,继续重复发送
	INC     R1                      ;下一个待发送数据地址
	DJNZ    I2CNUMBYT,I2CWRDATA     ;共发送I2CNUMBYT个数据
	POP     PSW                     ;CPU状态出栈
	RET                             ;返回

	;********************************
	;连续N字节I2C写操作(含停止状态)
	;********************************
I2CWRNBYTP:
	LCALL   I2CWRNBYT       ;写N字节数据
	LCALL   I2CSTOP         ;停止I2C总线操作
	RET                     ;返回

	;********************************
	;单字节I2C读操作
	;R0:读字节位(bit)计数
	;R1:数据缓存间址
	;R2:数据暂存
	;********************************
I2CRDBYT:
	MOV     R0,#08H
I2CRDLP:SETB    SDA
	SETB    SCL
	MOV     C,SDA
	JNC     I2CRDLOW        ;读“0”
	SJMP    I2CRDHIGH       ;读“1”
I2CRDLP1:
	DJNZ    R0,I2CRDLP
	RET                     ;单字节读操作完毕,返回

I2CRDLOW:                       ;读“0”
	CLR     C
	MOV     A,R2
	RLC     A
	MOV     R2,A
	CLR     SCL
	SJMP    I2CRDLP1
I2CRDHIGH:                      ;读“1”
	SETB    C
	MOV     A,R2
	RLC     A
	MOV     R2,A
	CLR     SCL
	SJMP    I2CRDLP1

	;********************************
	;连续N字节I2C读操作(含停止状态)
	;ACC:存放欲写入的数据(一个字节)
	;R1:数据缓存间址
	;R2:数据暂存
	;********************************
I2CRDNBYT:
	PUSH    PSW             ;CPU状态入栈
	SETB    RS0             ;using RBANK1
	CLR     RS1
I2CRDNBYT1:
	LCALL   I2CSTART
	MOV     A,SLA           ;被控器件地址
	INC     A               ;I2C器件读地址
	LCALL   I2CWRBYT
	LCALL   I2CACKCHK
	JB      I2CACKFLAG,I2CRDNBYT1 ;I2C总线无响应,继续重复发送
	MOV     R1,#I2CDBUF     ;I2C数据缓存区首地址
I2CRDNLP:   
	LCALL   I2CRDBYT
	MOV     A,R2
	MOV     @R1,A
	DJNZ    I2CNUMBYT,I2CRDACK ;数据传送完否
	LCALL   I2CMNACK        ;发送主控非响应位
	LCALL   I2CSTOP         ;I2C总线停止
	POP     PSW             ;CPU状态出栈
	RET                     ;返回

I2CRDACK:
	LCALL   I2CMACK         ;发送主控响应位
	INC     R1
	SJMP    I2CRDNLP

;==============================================================
; AT24 I2C总线存储器操作
; 2001/12/21
;==============================================================
	;***********************************************
	;连续N字节I2C AT24存储器写操作(含停止状态)
	;***********************************************
AT24WRNBYTP:
	PUSH    PSW             ;CPU状态入栈
	SETB    RS0             ;使用RBANK1
	CLR     RS1
AT24WRNBYT1:
	LCALL   I2CSTART        ;启动I2C总线
	MOV     A,SLA           ;I2C被控器件地址SLA(写)
	LCALL   I2CWRBYT
	LCALL   I2CACKCHK
	JB      I2CACKFLAG,AT24WRNBYT1 ;I2C总线无响应,继续重复发送
	MOV     A,SUBAH         ;I2C被控器件子地址-高字节SUBAH
	LCALL   I2CWRBYT
	LCALL   I2CACKCHK
	JB      I2CACKFLAG,AT24WRNBYT1 ;I2C总线无响应,继续重复发送
	MOV     A,SUBAH         ;I2C被控器件子地址-低字节SUBAL
	LCALL   I2CWRBYT
	LCALL   I2CACKCHK
	JB      I2CACKFLAG,AT24WRNBYT1 ;I2C总线无响应,继续重复发送
	MOV     R1,#I2CDBUF     ;I2C数据缓存区首地址
AT24WRDATA:
	MOV     A,@R1
	LCALL   I2CWRBYT
	LCALL   I2CACKCHK
	JB      I2CACKFLAG,AT24WRDATA   ;I2C总线无响应,继续重复发送
	INC     R1                      ;下一个待发送数据地址
	DJNZ    I2CNUMBYT,AT24WRDATA    ;共发送I2CNUMBYT个数据
	POP     PSW                     ;CPU状态出栈
	LCALL   I2CSTOP                 ;停止I2C总线操作
	RET                             ;返回
  
	;***********************************************
	;连续N字节I2C AT24存储器读操作
	;***********************************************
AT24RDNBYT:
	PUSH    PSW             ;CPU状态入栈
	SETB    RS0             ;using RBANK1
	CLR     RS1
AT24RDNBYT1:
	LCALL   I2CSTART
	MOV     A,SLA           ;被控器件地址
	LCALL   I2CWRBYT
	LCALL   I2CACKCHK
	JB      I2CACKFLAG,AT24RDNBYT1 ;I2C总线无响应,继续重复发送

	MOV     A,SUBAH         ;被控器件子地址-高字节
	LCALL   I2CWRBYT
	LCALL   I2CACKCHK
	JB      I2CACKFLAG,AT24RDNBYT1 ;I2C总线无响应,继续重复发送

	MOV     A,SUBAL         ;被控器件子地址-低字节
	LCALL   I2CWRBYT
	LCALL   I2CACKCHK
	JB      I2CACKFLAG,AT24RDNBYT1 ;I2C总线无响应,继续重复发送

	LCALL   I2CSTART
	MOV     A,SLA           ;被控器件地址
	INC     A               ;I2C器件读地址
	LCALL   I2CWRBYT
	LCALL   I2CACKCHK
	JB      I2CACKFLAG,AT24RDNBYT1 ;I2C总线无响应,继续重复发送
	MOV     R1,#I2CDBUF     ;I2C数据缓存区首地址
AT24RDNLP:   
	LCALL   I2CRDBYT
	MOV     A,R2
	MOV     @R1,A
	DJNZ    I2CNUMBYT,AT24RDACK ;数据传送完否
	LCALL   I2CMNACK        ;发送主控非响应位
	LCALL   I2CSTOP         ;I2C总线停止
	POP     PSW             ;CPU状态出栈
	RET                     ;返回

AT24RDACK:
	LCALL   I2CMACK         ;发送主控响应位
	INC     R1
	SJMP    AT24RDNLP

;===================================================
; PCF8574T I2C总线并行扩展口操作
; 2001/12/14
;===================================================
PCF8574TWR:
	MOV     SLA,#PCF8574T
	MOV     I2CNUMBYT,#1            ;单字节写
	LCALL   I2CWRNBYTP
	RET

PCF8574TRD:
	MOV     SLA,#PCF8574T
	MOV     I2CNUMBYT,#1            ;单字节读

⌨️ 快捷键说明

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