实验要求:由AT89S52内部定时器1,按方式1工作,每1秒钟24C02的0001H单元内容加2,以键盘作为外部中断输入信号,有键按下时,读取0001H单元内容并由LED显示。 //This is the sixth program of the homework; //Name :Wang Qi Date:2013/3/11 北京化工大学 自实1001 SDA EQU P2.0 SCL EQU P2.1 ORG 0000H //主函数入口 SJMP MAIN ORG 0013H //外部中断1入口 LJMP WZD0 ORG 001BH //计时器1入口 LJMP WT1 ORG 0050H MAIN: MOV SP,#60H MOV TMOD,#10H //设置T1工作方式 MOV TH1,#4CH //设初值 MOV TL1,#00H MOV R7,#10 //计数器 SETB EA //全局中断 SETB ET1 //允许定时器1 SETB TR1 //启动定时器1 SETB IT1 //外部中断跳变触发方式 SETB EX1 //允许外部中断1 OK: MOV C,P3.4 //扫描键盘 JNC OK1 MOV C,P3.5 JNC OK1 MOV C,P3.6 JNC OK1 MOV C,P3.7 JNC OK1 SJMP OK OK1: CLR P3.3 //中断信号 SETB P3.3 SJMP OK WZD0: SETB P3.3 //中断程序 PUSH TH1 //保护现场 PUSH TL1 CLR TR1 //停止T1计数 MOV R2,#01H CALL DU MOV P1,R3 POP TL1 POP TH1 SETB TR1 RETI WT1: MOV TH1,#4CH //定时函数 MOV TL1,#00H DJNZ R7,RET0 MOV R7,#10 //1秒到来了 INC 30H INC 30H mov R2,#01H MOV R3,30H CALL XIE RET0: RETI //////////////I2C协议摘自网络 Thanks to the author XIE: //写数据子程序,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 DU: ;读数据子程序,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 NOP NOP NOP NOP CLR SDA NOP NOP NOP NOP RET SDATA:MOV R0,#08H //向24C02传输数据子程序 LOOP0:CLR SCL RLC A MOV SDA,C NOP NOP SETB SCL NOP NOP NOP NOP 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 NOP NOP NOP NOP MOV C,SDA RLC A CLR SCL NOP NOP NOP NOP DJNZ R0,LOOP1 SETB SCL NOP NOP NOP NOP CLR SCL RET STOP:CLR SDA ;结束条件 NOP NOP NOP NOP SETB SCL NOP NOP NOP NOP SETB SDA NOP NOP NOP NOP RET CHULI: //1999uS ;这里是用于写完数据以后留给24C02的内部数据处理时间,2ms是一个非常保险的时间,最短需要1ms MOV R6,#04H WR0: MOV R5,#0F8H DJNZ R5,$ DJNZ R6,WR0 RET END
|