单片机I2C存储器+串行通信(汇编)
- 格式:docx
- 大小:14.88 KB
- 文档页数:4
实验要求:每0.5秒钟24LC32的0002H单元内容加1,以键盘作为外部中断输入信号,有键按下时,读取0002H单元内容送PC机显示。
SDA EQU P3.6
SCL EQU P3.7
ORG 0000H
SJMP MAIN
ORG 0003H
LJMP PIINT0
ORG 000BH
LJMP PIT0
ORG 0050H
MAIN:MOV SP,#60H
MOV TMOD,#21H ;
MOV SCON,#50H
MOV TH1,#0FDH
MOV TL1,TH1
SETB TR1
MOV TH0,#4CH ;设初值
MOV TL0,#00H
MOV R7,#20 ;计数器
SETB PX0;INT0为高优先级
CLR PT0 ;T0为低优先级
SETB EA
SETB ET0 ; 允许定时器0
SETB TR0 ;启动定时器0
SETB IT0 ;INT0边沿触发
SETB EX0 ;允许INT0中断
; 扫描键盘
MOV P2,#0FH
SJMP $
PIINT0:PUSH TH0 ;保护现场
PUSH TL0
CLR TR0
MOV R2,#02H
LCALL READ
MOV A,R3
MOV SBUF,A
M:JNB TI,M
CLR TI
POP TL0
POP TH0
SETB TR0
RETI
PIT0:MOV TH0,#4CH
MOV TL0,#00H
DJNZ R7,LOOP
MOV R7,#20
INC 30H
MOV R2,#02H
MOV R3,30H
LCALL WRITE
LOOP: RETI
WRITE: ;写数据子程序,R2是要写入的24c02的字节位置地址,R3是要写入的内容
LCALL STAR;起始条件
MOV A,#10100000B ;寻址24C02的总线硬件地址并使用写入命令
LCALL SDATA ; 传输数据A给24C02
MOV A,R2 ;确定要写入的字节位置地址
LCALL SDATA ;传输数据A给24C02
MOV A,R3 ;把数据R3写入刚指定的字节地址
LCALL SDATA ;传输数据A给24C02
LCALL STOP ;写入结束
LCALL CHULI ;提供2ms给24C02内部处理刚写入的数据
RET
READ: ;读数据子程序,R2是要读的24c02的字节位置地址,读完后A传给R3
LCALL STAR;起始条件
MOV A,#10100000B;寻址24C02的总线硬件地址并使用写入命令
LCALL SDATA ;传输数据A给24C02
MOV A,R2 ;注意,这里是使24C02的字节地址指针变成R2的值,也就是确定要读取的字节位置地址
LCALL SDATA ;传输数据A给24C02
LCALL STAR ;重复起始条件
MOV A,#10100001B;寻址24C02的总线硬件地址并使用读出命令(这里正式发起读命令)
LCALL SDATA;传输数据A给24C02
LCALL RDATA;从之前指定的字节地址中读出字节内容到A
LCALL STOP ;读取完毕(这里并没有连续读取,只能读一个字节,要多个字节连续读取,请自己在R2上做变址读取循环)
MOV R3,A ;读出的字节传给R3
RET
STAR:SETB SDA ;起始条件子程序
SETB SCL
LCALL DELAY
CLR SDA
LCALL DELAY RET
SDATA:MOV R0,#08H ;向24C02传输数据子程序
LOOP0:CLR SCL
RLC A
MOV SDA,C
NOP
NOP
SETB SCL
LCALL DELAY
DJNZ R0,LOOP0
CLR SCL
NOP
SETB SDA
NOP
NOP
SETB SCL
REP:MOV C,SDA
JC REP
NOP
NOP
NOP
CLR SCL
NOP
NOP
RET
RDATA:MOV R0,#08H ;从24C02读取数据子程序(读取一个字节以后不做应答)
LOOP1:SETB SCL
LCALL DELAY
MOV C,SDA
RLC A
CLR SCL
LCALL DELAY
DJNZ R0,LOOP1
SETB SCL
LCALL DELAY
CLR SCL
RET
STOP:CLR SDA ;结束条件
LCALL DELAY
SETB SCL
LCALL DELAY SETB SDA
LCALL DELAY
RET
DELAY: NOP
NOP
NOP
NOP
RET
CHULI:
MOV R6,#04H
WR0:MOV R5,#0F8H
DJNZ R5,$
DJNZ R6,WR0
RET
END