📄 tyjianpan5.asm
字号:
MOV A, #02h ;位选2
acall send ;调用发送程序
;
mov a, 45h
swap a
anl a, #0fh
MOV DPTR, #DATA1
MOVC A, @A+DPTR ;将数字转化为显码
acall send ;调用发送程序
;*************
clr set2
cpl set2 ;;;显示2
LCALL DELEY20MS
;**************************************************************
;*************************************************************
lcall show_zt ;显示8状态指示
MOV A, #04h ;位选3
acall send ;调用发送程序
;
mov a, 44h
;swap a
anl a, #0fh
MOV DPTR, #DATA1
MOVC A, @A+DPTR ;将数字转化为显码
acall send ;调用发送程序
;*********
clr set2
cpl set2 ;;;显示3
LCALL DELEY20MS
;***********************************************************
lcall show_zt ;显示8状态指示
MOV A, #08 ;位选4
acall send ;调用发送程序
;
mov a, 44h
swap a
anl a, #0fh
MOV DPTR, #DATA1
MOVC A, @A+DPTR ;将数字转化为显码
acall send ;调用发送程序
;*************
clr set2
cpl set2 ;;;显示4
LCALL DELEY20MS
;**************************************************************
;*************************************************************
lcall show_zt ;显示8状态指示
MOV A, #10h ;位选5
acall send ;调用发送程序
;
mov a, 43h
;swap a
anl a, #0fh
MOV DPTR, #DATA1
MOVC A, @A+DPTR ;将数字转化为显码
acall send ;调用发送程序
;*********
clr set2
cpl set2 ;;;显示5
LCALL DELEY20MS
;***********************************************************
lcall show_zt ;显示8状态指示
MOV A, #20h ;位选6
acall send ;调用发送程序
;
mov a, 43h
swap a
anl a, #0fh
MOV DPTR, #DATA1
MOVC A, @A+DPTR ;将数字转化为显码
acall send ;调用发送程序
;*************
clr set2
cpl set2 ;;;显示6
LCALL DELEY20MS
;**************************************************************
;*************************************************************
lcall show_zt ;显示8状态指示
MOV A, #40h ;位选7
acall send ;调用发送程序
;
mov a, 42h
;swap a
anl a, #0fh
MOV DPTR, #DATA1
MOVC A, @A+DPTR ;将数字转化为显码
acall send ;调用发送程序
;*********
clr set2
cpl set2 ;;;显示7
LCALL DELEY20MS
;***********************************************************
lcall show_zt ;显示8状态指示
MOV A, #80h ;位选8
acall send ;调用发送程序
;
mov a, 42h
swap a
anl a, #0fh
MOV DPTR, #DATA1
MOVC A, @A+DPTR ;将数字转化为显码
acall send ;调用发送程序
;*************
clr set2
cpl set2 ;;;显示8
LCALL DELEY20MS
;**************************************************************
;*************************************************************
ret
send: nop
rrc a ;第0位
mov c, cy
;cpl c
mov dat, c
clr clk2
cpl clk2
rrc a ;第1位
mov c, cy
;cpl c
mov dat, c
clr clk2
cpl clk2
rrc a ;第2位
mov c, cy
;cpl c
mov dat, c
clr clk2
cpl clk2
rrc a ;第3位
mov c, cy
;cpl c
mov dat, c
clr clk2
cpl clk2
rrc a ;第4位
mov c, cy
;cpl c
mov dat, c
clr clk2
cpl clk2
rrc a ;第5位
mov c, cy
;cpl c
mov dat, c
clr clk2
cpl clk2
rrc a ;第6位
mov c, cy
;cpl c
mov dat, c
clr clk2
cpl clk2
rrc a ;第7位
mov c, cy
;cpl c
mov dat, c
clr clk2
cpl clk2
;clr set
;cpl set ;;;显示
ret
DELEY20MS: PUSH 02H
PUSH ACC
MOV R4, #0fH
D200B: MOV A, #2FH
D200A: DEC A
JNZ D200A
DEC R4
CJNE R4, #00H, D200B
POP ACC
POP 02H
RET
;**********DELALL************************519012625241-4008111111
DELALL: PUSH 02H
PUSH ACC
MOV R4, #0ffH
D200B1: MOV A, #0FFH
D200A1: DEC A
JNZ D200A1
DEC R4
CJNE R4, #00H, D200B1
POP ACC
POP 02H
RET
;----------- ---------------------------------------------------------------------------------------------
;VI2C_ASM.ASM
;I2C 软件包的底层子程序,使用前要定义好SCL和SDA。在标准80C51模式
;(12 Clock)下,对主频要求是不高于12MHz(1个机器周期1us);若Fosc>12MHz
;则要增加相应的NOP指令数。在使用本软件包时,请在你的程序的未尾加入
;$INCLUDE (VI2C_ASM.ASM)即可。
;--------------------------------------------------------------------------------------------------------
;启动I2C总线子程序
START: 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
NOP
RET
;发送应答信号子程序
MACK: CLR SDA ;将SDA置0
NOP
NOP
SETB SCL
NOP ;保持数据时间,即SCL为高时间大于4.7us
NOP
NOP
NOP
NOP
CLR SCL
NOP
NOP
RET
;发送非应答信号
MNACK: SETB SDA ;将SDA置1
NOP
NOP
SETB SCL
NOP
NOP ;保持数据时间,即SCL为高时间大于4.7us
NOP
NOP
NOP
CLR SCL
NOP
NOP
RET
; 检查应答位子程序
; 返回值,ACK=1时表示有应答
CACK: SETB SDA
NOP
NOP
SETB SCL
CLR ACK
NOP
NOP
MOV C, SDA
JC CEND
SETB ACK ;判断应答位
CEND: NOP
CLR SCL
NOP
RET
;发送字节子程序
;字节数据放入ACC
;每发送一字节要调用一次CACK子程序,取应答位
WRBYTE: MOV R0, #08H
WLP: RLC A ;取数据位
JC WR1
SJMP WR0 ;判断数据位
WLP1: DJNZ R0, WLP
NOP
RET
WR1: SETB SDA ;发送1
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SCL
SJMP WLP1
WR0: CLR SDA ;发送0
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SCL
SJMP WLP1
;读取字节子程序
;读出的值在ACC
;每取一字节要发送一个应答/非应答信号
RDBYTE: 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
; 无子地址器件写字节数据
; 入口参数: 数据为ACC、器件从地址SLA
; 占用: A、R0、CY
IWRBYTE: PUSH ACC
IWBLOOP: LCALL START ;起动总线
MOV A, SLA
LCALL WRBYTE ;发送器件从地址
LCALL CACK
JNB ACK, RETWRB ;无应答则跳转
POP ACC ;写数据
LCALL WRBYTE
LCALL CACK
LCALL STOP
RET
RETWRB: POP ACC
LCALL STOP
RET
;无子地址器件读字节数据
;入口参数: 器件从地址SLA
;出口参数: 数据为ACC
;占用 A 、R0、R2 、CY
IRDBYTE: LCALL START
MOV A, SLA ;发送器件从地址
INC A
LCALL WRBYTE
LCALL CACK
JNB ACK, RETRDB
LCALL RDBYTE ;进行读字节操作
LCALL MNACK ;发送非应信号
RETRDB: LCALL STOP ;结束总线
RET
;向器件指定子地址写N个数据
;入口参数: 器件从地址SLA、器件子地址SUBA 、发送数据缓冲区MTD、发送字节数NUMBYTE
; 占用: A 、R0 、R1 、R3 、CY
IWRNBYTE: MOV A, NUMBYTE
MOV R3, A
LCALL START ;起动总线
MOV A, SLA
LCALL WRBYTE ;发送器件从地址
LCALL CACK
JNB ACK, RETWRN ;无应答则退出
MOV A, SUBA ;指定子地址
LCALL WRBYTE
LCALL CACK
MOV R1, #MTD
WRDA: MOV A, @R1
LCALL WRBYTE ;开始写入数据
LCALL CACK
JNB ACK, IWRNBYTE
INC R1
DJNZ R3, WRDA ;判断写完没有
RETWRN: LCALL STOP
RET
;向器件指定子地址读取N个数据
;入口参数: 器件从地址SLA、器件子地址SUBA、接收字节数NUMBYTE
;出口参数: 接收数据缓冲区MTD
;占用:A、 R0、 R1、 R2、 R3、 CY
IRDNBYTE: MOV R3, NUMBYTE
LCALL START
MOV A, SLA
LCALL WRBYTE ;发送器件从地址
LCALL CACK
JNB ACK, RETRDN
MOV A, SUBA ;指定子地址
LCALL WRBYTE
LCALL CACK
LCALL START ;重新起动总线
MOV A, SLA
INC A ;准备进行读操作
LCALL WRBYTE
LCALL CACK
JNB ACK, IRDNBYTE
MOV R1, #MRD
RDN1: LCALL RDBYTE ;读操作开始
MOV @R1, A
DJNZ R3, SACK
LCALL MNACK ;最后一字节发非应答位
RETRDN: LCALL STOP ;并结束总线
RET
SACK: LCALL MACK
INC R1
SJMP RDN1
;*********************************************************************************************
; 请注意
;
;占用内部资源: R0,R1,R2,R3,ACC,Cy。
;在你的程序里要做以下定义:
;使用前须定义变量: SLA 器件从地址 SUBA器件子地址 NUMBYTE读/写的字节数 ,位变量ACK
;使用前须定义常量: SDA SCL 总线位 MTD 发送数据缓冲区首址 MRD 接收数据缓冲区首址
;(ACK为调试/测试位,ACK为0时表示无器件应答)
;
;**********************************************************************************************
;DATA1: DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,0FEH,0F6H,0eeh,3eh,9ch,7ah,9eh,8eh
;0 1 2 3 4 5 6 7 8 9 a b c d e f
DATA1: DB 0b7H, 84H, 2fH, 8fH, 9cH, 9bH, 0bbH, 96H, 0bfH, 9fH, 0beh, 0b9h, 33h, 0adh, 3bh, 3ah
; 0 1 2 3 4 5 6 7 8 9 a b c d e f
;db 0fdh, 61h, 0dbh, 0f3h, 67h, 0b7h, 0bfh, 0e1h, 0ffh, 0f7h, 0efh, 3fh, 9dh, 7bh
;0. 1. 2. 3. 4. 5. 6. 7. 8. 9. a. b. c. d.
org 0ffbh
nop
ljmp main
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -