📄 library.asm
字号:
; 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 + -