单片机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