用的是stc89c52单片机,下面是汇编代码:
;************************************************ ;********************************** ;---------------------AT24C64 CODE------------------------- ;========================================================== ICSTART: ;I2C 开始 SETB SDA NOP NOP NOP NOP SETB SCK NOP NOP NOP NOP CLR SDA NOP NOP NOP NOP CLR SCK RET ;========================================================== ICSTOP: ;I2C 结束 CLR SDA NOP NOP NOP NOP CLR SCK NOP NOP NOP NOP SETB SCK NOP NOP NOP NOP SETB SDA RET ;========================================================== ICACK: ;I2C 应答 CLR SDA NOP NOP NOP NOP SETB SCK NOP NOP NOP NOP CLR SCK RET ;========================================================== NOACK: ;I2C 无应答 SETB SDA NOP NOP NOP NOP SETB SCK NOP NOP NOP NOP CLR SCK RET ;========================================================== ICREADBIT: ;I2C 读取一位 SETB SDA NOP NOP NOP NOP SETB SCK NOP NOP NOP NOP MOV C,SDA CLR SCK RET ;---------------------------------------------------------- ICREADACK: MOV R7,#200 SETB SDA NOP NOP NOP NOP SETB SCK NOP NOP NOP NOP READACKS: JNB SDA,ACKEND DJNZ R7,READACKS SETB C CLR SCK RET ACKEND: CLR C CLR SCK RET ;========================================================== ICREADBYTE: ;I2C 读取一个字节 MOV R7,#8 READLOOP: LCALL ICREADBIT RLC A DJNZ R7,READLOOP MOV R7,A RET ;========================================================== ICWRITEBIT: ;I2C 写一位 MOV SDA,C NOP NOP NOP NOP SETB SCK NOP NOP NOP NOP CLR SCK RET ;========================================================== ICWRITEBYTE: ;I2C 写一个字节 MOV A,R7 MOV R7,#8 WRITELOOP: RLC A LCALL ICWRITEBIT DJNZ R7,WRITELOOP RET ;========================================================== READAT: MOV A,R7 ;计算I2C地址 MOV B,#208 ;144 MUL AB MOV R2,B MOV R3,A LCALL ICSTART ;I2C 数据读入缓冲区 MOV R7,#0A0H ;R2R3 I2C地址 LCALL ICWRITEBYTE ;R0 缓冲区地址 LCALL ICREADACK ;R1 数据个数 JNC RACKEND RET ; RACKEND: MOV A,R2 MOV R7,A LCALL ICWRITEBYTE LCALL ICREADACK MOV A,R3 MOV R7,A LCALL ICWRITEBYTE LCALL ICREADACK LCALL ICSTART MOV R7,#0A1H LCALL ICWRITEBYTE LCALL ICREADACK MOV R0,#LRDBUF MOV R1,#208 ;144 READDATAS: LCALL ICREADBYTE LCALL ICACK MOV @R0,A INC R0 DJNZ R1,READDATAS LCALL NOACK LCALL ICSTOP RET ;========================================================== WRITEAT: ;缓冲区数据写入 I2C MOV A,R7 ;计算I2C地址 MOV B,#208 ;;144 MUL AB MOV R2,B MOV R3,A MOV R5,#13 ;9 13*16=208 MOV R0,#LRDBUF ICWRITENEXT: LCALL ICSTART MOV R7,#0A0H LCALL ICWRITEBYTE LCALL ICREADACK JNC WACKEND ; ; WACKEND: MOV A,R2 MOV R7,A LCALL ICWRITEBYTE LCALL ICREADACK MOV A,R3 MOV R7,A LCALL ICWRITEBYTE LCALL ICREADACK MOV R1,#16 WRITEDATAS: MOV A,@R0 INC R0 MOV R7,A LCALL ICWRITEBYTE LCALL ICREADACK DJNZ R1,WRITEDATAS LCALL ICSTOP MOV R7,#250 DELAY_D: MOV R6,#20 DJNZ R6,$ DJNZ R7,DELAY_D MOV A,R3 ADD A,#16 MOV R3,A MOV A,R2 ADDC A,#0 MOV R2,A DJNZ R5,ICWRITENEXT RET ;***************************************************************** ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ LRDREAD: ;红外代码读取 MOV R0,#LRDBUF ;代码缓冲区清零 MOV R1,#208 ;144 CLR A CLRLRDBUF: MOV @R0,A INC R0 DJNZ R1,CLRLRDBUF MOV R0,#LRDBUF SETB LRDR LRDTEST: SETB TR2 SETB ES ;红外代码起始检测 JB RI,LLOOP ;这里是检测有键按下时。。。。。。 CLR TR2 JNB LRDR,READSTART JB HWXX,LRDTEST ;红外学习标志位 LJMP LLLOOP LLOOP: ; CLR RI MOV A,SBUF MOV R0,#250 MOV R1,#250 LP4: JB RI,LP3 DJNZ R0,LP4 DJNZ R1,LP4 LJMP LRDTEST LP3: CLR RI CLR ES MOV A,SBUF MOV A,#00H LP2: CLR HONGWAI ;红外按钮标志位 CLR P3.3 CLR HWXX MOV SBUF,#37H JNB TI,$ CLR TI DEC SP DEC SP LJMP LOOP LLLOOP: RET ;-------------------------------------- READSTART: CLR EA ;SETB P0.6 MOV TH1,#0 MOV TL1,#12 SETB LRDR ;-------------------------------------- READLOOP_S: SETB TR1 CLR TF1 TEST_LRDR: MOV A,TH1 JB TF1,LRDOVER JNB LRDR,TEST_LRDR CLR TR1 ; INC R0 MOV A,TL1 MOV @R0,A INC R0 MOV A,TH1 MOV @R0,A INC R1 ;红外线时间 1 ;-------------------------------------- ;-------------------------------------- MOV TH1,#0 MOV TL1,#12 SETB TR1 CLR TF1 TESTLRD: MOV A,TH1 JB TF1,LRDOVER JB LRDR,TESTLRD CLR TR1 INC R0 MOV A,TL1 MOV @R0,A INC R0 MOV A,TH1 MOV @R0,A ;代码 2 INC R1 ;************************************** TEST_DATA: MOV TH1,#0 MOV TL1,#12 SETB TR1 CLR TF1 MOV A,R1 SUBB A,#101 ;44H JC READLOOP_S ;下一代码 ;-------------------------------------- LRDOVER: CLR TR1 SETB EA MOV A,R1 MOV LRDBUF,A ;代码个数缓冲 RET ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ LRD1SEND: CLR EA MOV R1,LRDBUF MOV R0,#LRDBUF MOV A,R1 JZ LRD_END SUBB A,#101 ;72 JNC LRD_END CLR EA MOV TH1,#0 LRD1OUTLOOP: CLR TR1 INC R0 MOV A,@R0 CPL A MOV TL1,A INC R0 MOV A,@R0 CPL A MOV TH1,A SETB TR1 CLR TF1 ;-------------------------------------- LRD1CONT: CPL LRD1 NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP ;发送红外波形 38K HZ JNB TF1,LRD1CONT ;红外前导代码 CLR LRD1 DJNZ R1,SEND_DATA LJMP LRD_END SEND_DATA: ;-------------------------------------- CLR TR1 INC R0 MOV A,@R0 CPL A MOV TL1,A INC R0 MOV A,@R0 CPL A MOV TH1,A SETB TR1 CLR TF1 DJNZ R1,OUT_1_CODE LRD_END: CLR TR1 CLR TF1 SETB EA RET OUT_1_CODE: JNB TF1,$ ;红外代码 ;-------------------------------------- LJMP LRD1OUTLOOP RET ;取下一个代码 ;========================================================== ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ DELAY: MOV R7,#200 DEL_L: MOV R6,#30 DJNZ R6,$ DJNZ R7,DEL_L RET DELY_2: MOV R7,#250 DEL_2: LJMP DELAY DJNZ R7,DEL_2 MOV R7,#250 DEL_3: LJMP DEL_2 DJNZ R7,DEL_3 RET
源代码下载地址:http://www.51hei.com/ziliao/file/hogwxx1.rar
上一篇:自制四位数码管显示的数字钟c程序
下一篇:STC单片机用键盘控制二极管亮灭的问题
推荐阅读最新更新时间:2024-03-16 13:07
设计资源 培训 开发板 精华推荐
- 柔灵科技陈涵:将小型、柔性的脑机接口睡眠设备,做到千家万户
- 微灵医疗李骁健:脑机接口技术正在开启意识与AI融合的新纪元
- USB Type-C® 和 USB Power Delivery:专为扩展功率范围和电池供电型系统而设计
- 景昱医疗耿东:脑机接口DBS治疗技术已实现国产替代
- 首都医科大学王长明:针对癫痫的数字疗法已进入使用阶段
- 非常见问题解答第223期:如何在没有软启动方程的情况下测量和确定软启动时序?
- 兆易创新GD25/55全系列车规级SPI NOR Flash荣获ISO 26262 ASIL D功能安全认证证书
- 新型IsoVu™ 隔离电流探头:为电流测量带来全新维度
- 英飞凌推出简化电机控制开发的ModusToolbox™电机套件
- 意法半导体IO-Link执行器电路板为工业监控和设备厂商带来一站式参考设计