文档库 最新最全的文档下载
当前位置:文档库 › 汇编源文件rs485,I2C总线,继电器,干触点

汇编源文件rs485,I2C总线,继电器,干触点

;//////////////////////////////////////////////////////////
;真想学习请加QQ:81773291,给你对应的PCB文件。上传这个一是为了搞点分下载,二嘛希望能够帮助到什么人吧。
;//////////////////////////////////////////////////////////
;/********************************************************************************************/
;定义
;/********************************************************************************************/
;控制
KLEFT BIT P0.0 ;键盘左
KRIGHT BIT P0.1 ;键盘右
KDOWN BIT P0.2 ;键盘上
KUP BIT P0.3 ;键盘下
YUP BIT P0.4 ;遥控
YLEFT BIT P0.5 ;遥控
YRIGHT BIT P0.6 ;遥控
YDOWN BIT P0.7 ;遥控
;限位
UP BIT P2.7 ;上限位
DOWN BIT P2.6 ;下限位
OPEN1 BIT P2.5 ;开门限位1
CLOSE1 BIT P2.4 ;关门限位1
OPEN2 BIT P2.3 ;开门限位2
CLOSE2 BIT P2.2 ;关门限位2
;马达
MUP BIT P1.0 ;马达上
MDOWN BIT P1.1 ;马达下
MOPEN1 BIT P1.2 ;马开门1
MCLOSE1 BIT P1.3 ;马关门1
MOPEN2 BIT P1.4 ;马开门2
MCLOSE2 BIT P1.5 ;马关门2
MSHA BIT P1.6 ;马达刹车
;I2C
SDA BIT P3.3 ;I2C数据线
SCL BIT P3.2 ;I2C时钟线
MTD EQU 41H ;从这里取数据,存于1021
MRD EQU 61H ;取1021数据存于此
SUBA DATA 30H
SLA DATA 31H
NUMBYTE DATA 32H
ACK BIT 10H

ORG 0000H
LJMP F_ST
ORG 0023H
LJMP INT
ORG 0040H
;/********************************************************************************************/
;初始化
;/********************************************************************************************/
F_ST: MOV R7,#0EH ;命令状态存储位归零,R7=命令状态寄存器
MOV 60H,#0AH ;串口命令标志
LCALL STEVEN

MOV 50H,#0FFH ;数据头#0DEH
MOV 51H,#0FFH ;本机地址
MOV 52H,#0FFH

;组地址
MOV 53H,#0FFH ;命令
MOV 54H,#0FFH ;校验字
MOV 55H,#0FFH ;数据尾#0E2H

MOV SUBA,#00H ;写1021子地址于#00H
MOV SLA,#0A0H ;器件1021地址
MOV NUMBYTE,#06H ;传6个数据:本机地址/组地址
LCALL IRDNBYTE ;把本机地址,组地址存于61H/62H
JMP MAIN

STEVEN: MOV TMOD,#20H ;设置9600/8/1,T1方式2
MOV TH1,#0FDH
MOV TL1,#0FDH
SETB TR1 ;开计时器
MOV SCON,#50H ;选择串口模式1
SETB EA ;开全部中
SETB ES ;开串口中断
CLR P3.5 ;只容许单片机器485接受数据
CLR P3.6
RET
;/********************************************************************************************/
;主程序
;/********************************************************************************************/
MAIN: SETB ES
PD1: CPL SDA
MOV P0,#0FFH
MOV A,P0
CJNE A,#0FH,PD3 ;有按键转键盘分类
PD2: MOV A,60H
CJNE A,#0BH,PD1 ;有中断转中断
CLR ES
LCALL MAST
JMP CMD
PD3: CLR ES
MOV A,60H
CJNE A,#0BH,PD4
LCALL MAST
JMP CMD
PD4: CPL SDA
MOV P0,#0FFH
MOV A,P0
CJNE A,#0FH,KEY ;有按键转键盘分类
CMD: MOV A,R7
CJNE A,#0AH,CMD1
LCALL TSJ_UP
JMP PD4
CMD1: CJNE A,#0BH,CMD2
LCALL TSJ_DOWN
JMP PD4
CMD2: CJNE A,#0EH,CMD3
CMD3: LCALL TSJ_STOP
MOV R7,#0EH
JMP MAIN
;//////////////////键盘判断
KEY: LCALL DELAY_5 ;延迟再检查
CPL SDA
MOV P0,#0FFH
MOV A,P0
CJNE A,#0FH,KEY1 ;有按键转键

盘分类
JMP CMD
KEY1: JNB ACC.0,KEY_STOP ;停止
JNB ACC.1,DK ;调试
JNB ACC.2,KEY_DOWN ;下降
JNB ACC.3,KEY_UP ;上升
JB ACC.4,KEY_UP ;上升
JB ACC.5,KEY_STOP ;停止
JB ACC.6,DY ;调试
JB ACC.7,KEY_DOWN ;下降
JMP CMD
KEY_UP: MOV A,R7
CJNE A,#0BH,KEY_UP1
MOV R7,#0EH ;停止再延迟2S
LCALL DELAY_10
CPL SDA
JMP CMD
KEY_UP1: MOV R7,#0AH ;付值命令状态寄存器为“开”。
JMP CMD
KEY_DOWN: MOV A,R7
CJNE A,#0AH,KEY_DOWN1
MOV R7,#0EH ;停止再延迟2S
LCALL DELAY_10
CPL SDA
JMP CMD
KEY_DOWN1: MOV R7,#0BH ;付值命令状态寄存器为“关”。
JMP CMD
KEY_STOP: MOV R7,#0EH ;付值命令状态寄存器为“停”。
JMP CMD

DK: JNB KUP,DK0 ;键盘调试程序密码
JNB KDOWN,DK5 ;
JMP DK
DK0: JB KDOWN,$
CPL SDA
MOV R3,#10
DK1: MOV R2,#200
DK2: MOV R1,#247
MOV A,P0
JNB KLEFT,DK4
CPL SDA
DK3: DJNZ R1,DK3
DJNZ R2,DK2
DJNZ R3,DK1
LCALL TSJ_HCLR ;清理高度:右-上-下
JMP $
DK4: JB KUP,$
CPL SDA
LCALL TSJ_HSET ;高度设置:右-上-下-左-上
JMP F_ST
DK5: JB KUP,$
CPL SDA
JB KLEFT,$
CPL SDA
LCALL DELAY_10 ;延迟1S
JMP TSJ_TEST ;设备调试:右-下-上-左

DY: JB YUP,DY0 ;键盘调试程序密码
JB YDOWN,DY5 ;
JMP DY
DY0: JNB YDOWN,$
CPL SDA
MOV R

3,#10
DY1: MOV R2,#200
DY2: MOV R1,#247
MOV A,P0
JB YLEFT,DY4
CPL SDA
DY3: DJNZ R1,DY3
DJNZ R2,DY2
DJNZ R3,DY1
LCALL TSJ_HCLR ;清理高度:右-上-下
JMP $
DY4: JNB YUP,$
CPL SDA
LCALL TSJ_HSET ;高度设置:右-上-下-左-上
JMP F_ST
DY5: JNB YUP,$
CPL SDA
JNB YLEFT,$
CPL SDA
LCALL DELAY_10 ;延迟1S
JMP TSJ_TEST ;设备调试:右-下-上-左
;/********************************************************************************************/
;调试程序
;/********************************************************************************************/
;//////////////////下降到使用状态
TSJ_TEST: CPL SDA
MOV A,P0
CJNE A,#0FH,TSJ_TEST1 ;有按键转键盘分类
MOV P1,#0FFH
JMP TSJ_TEST
TSJ_TEST1: JNB ACC.0,TEST_BACK ;反转
JNB ACC.1,TEST_FACE ;正转
JNB ACC.2,TEST_DOWN ;下降
JNB ACC.3,TEST_UP ;上升
JB ACC.4,TEST_UP ;上升
JB ACC.5,TEST_BACK ;反转
JB ACC.6,TEST_FACE ;正转
JB ACC.7,TEST_DOWN ;下降
JMP TSJ_TEST
TEST_UP: JNB UP,TEST_UP1
MOV P1,#10111110B ;上升
JMP TSJ_TEST
TEST_UP1: MOV P1,#0FFH
JMP TSJ_TEST

TEST_DOWN: JNB DOWN,TEST_DOWN1
MOV P1,#10111101B ;下降
JMP TSJ_TEST
TEST_DOWN1: MOV P1,#0FFH
JMP TSJ_TEST
TEST_FACE: JNB CLOSE1,TEST_FACE1 ;关门
CLR MCLOSE1
JMP TEST_FACE2
TEST_FACE1: SETB MCLOSE1
TEST_FACE2: JNB CLOSE2,TEST_FACE3
CLR MCLOSE2
JMP TEST_FACE4
TEST_FACE3: SETB MCLOSE2
TEST_FACE4: JMP TSJ_TEST

TEST_BACK: JNB OPEN1,TEST_BACK1 ;关门
CLR MOPEN1
JMP TEST_BACK2
TEST_BACK1: SETB MOPEN1

TEST_BACK2: JNB OPEN2,TEST_BACK3
CLR MOPEN2
JMP TEST_BACK4
TEST_BACK3: SETB MOPEN2
TEST_BACK4: JMP TSJ_TEST
;/********************************************************************************************/
;运行程序
;/********************************************************************************************/
;//////////////////下降时间控制
TIME: MOV TMOD,#01H ;计数器0
CLR EA ;关全部中断
MOV TCON,#00H
MOV TH0,#00H
MOV TL0,#00H
MOV A,64H
CJNE A,#00H,TIME1 ;64H(41H)有数据转清理51
MOV A,63H
CJNE A,#00H,TIME4 ;63H(40H)有数据转清理50
MOV A,66H
CJNE A,#00H,TIME7
MOV A,65H
CJNE A,#00H,TIME7
JMP TIME9
KEY2: JMP KEY ;跳转中转
TIME1: SETB TR0 ;清理64H,启动计数器1
MOV P1,#10111101B
MOV 49H,64H
TIME2: MOV 48H,#0FFH
TIME3: CPL SDA
JNB DOWN,TIME9 ;到下限位停止
MOV P0,#0FFH ;读取键盘状态。
MOV A,P0 ;读取P0口状态(遥控口和键盘口内容)。
ANL A,#00111111B ;如果按下降键就不执行继续下降,不理会手控的下降与调试
ORL A,#00000110B ;如果按下降键就不执行继续下降,不理会遥控的下降与调试
CJNE A,#0FH,KEY2 ;遥控口和键盘口内容有变化时,跳转到KEY子程序。
JNB TF0,TIME3 ;TF0为O继续,不为0执行后面程序,
CLR TF0 ;计数器满清理计数器
DJNZ 48H,TIME3
DJNZ 49H,TIME2 ;清理完成转清理63H
TIME4: MOV A,63H
CJNE A,#00H,TIME5 ;63H有数据
AJMP TIME7 ;63H无数据转清理TH0,TL0
TIME5: SETB TR0 ;清理63H
MOV P1,#10111101B
MOV 48H,63H
TIME6: CPL SDA
JNB DOWN,TIME9 ;到下限位停止
MOV P0,#0FFH ;读取键盘状态。

MOV A,P0 ;读取P0口状态(遥控口和键盘口内容)。
ANL A,#00111111B ;如果按下降键就不执行继续下降,不理会手控的下降与调试
ORL A,#00000110B ;如果按下降键就不执行继续下降,不理会遥控的下降与调试
CJNE A,#0FH,KEY2 ;遥控口和键盘口内容有变化时,跳转到KEY子程序。
JNB TF0,TIME6 ;溢出标志
CLR TF0
DJNZ 48H,TIME6
TIME7: MOV TH0,66H ;清理65H(TH0),66H(TL0)
MOV TL0,65H
TIME8: CPL SDA
JNB DOWN,TIME9
MOV P0,#0FFH ;读取键盘状态。
MOV A,P0 ;读取P0口状态(遥控口和键盘口内容)。
ANL A,#00111111B ;如果按下降键就不执行继续下降,不理会手控的下降与调试
ORL A,#00000110B ;如果按下降键就不执行继续下降,不理会遥控的下降与调试
CJNE A,#0FH,KEY2 ;遥控口和键盘口内容有变化时,跳转到KEY子程序。
JNB TF0,TIME8
CLR TF0
CLR TR0 ;关计数器
TIME9: MOV P1,#11111111B
MOV R7,#0EH
LCALL STEVEN
RET
;//////////////////上升到关闭状态
TSJ_UP: MOV P2,#0FFH
MOV A,P2
CJNE A,#01101011B,TSJ_UP1 ;上面关门状态
MOV P1,#11111111B ;停止
MOV R7,#0EH
RET
TSJ_UP1: CJNE A,#01011111B,TSJ_UP2 ;上面2关门中1开门状态
MOV P1,#11010111B ;关门
RET
TSJ_UP2: CJNE A,#01110111B,TSJ_UP3 ;上面1关门中2开门状态
MOV P1,#11010111B ;关门
RET
TSJ_UP3: CJNE A,#01111111B,TSJ_UP4 ;上面关门中状态
MOV P1,#11010111B ;关门
RET
TSJ_UP4: CJNE A,#01010111B,TSJ_UP6 ;上面开门状态
MOV A,P1
CJNE A,#10111110B,TSJ_UP5 ;是否是上升过程,是则到位后再上升0。3S
LCALL DELAY_5
CPL SDA
LCALL DELAY_5
CPL SDA
LCALL DELAY_5
CPL SDA
TSJ_UP5:

MOV P1,#11010111B ;关门
RET
TSJ_UP6: CJNE A,#01111011B,TSJ_UP7 ;上面1关门中2关好状态
MOV P1,#11110111B ;1关门
RET
TSJ_UP7: CJNE A,#01101111B,TSJ_UP8 ;上面2关门中1关好状态
MOV P1,#11011111B ;2关门
RET
TSJ_UP8: CJNE A,#11010111B,TSJ_UP9 ;中间状态
MOV P1,#10111110B ;上升
RET
TSJ_UP9: CJNE A,#10010111B,TSJ_UPA ;下面状态
MOV P1,#10111110B ;上升
RET
TSJ_UPA: MOV P1,#0FFH
MOV R7,#0EH
RET
;//////////////////下降到使用状态
TSJ_DOWN: MOV P2,#0FFH
MOV A,P2
CJNE A,#01010111B,TSJ_DOWN1 ;在上面门开好
MOV P1,#10111101B ;下降并计时
LCALL TIME ;计时
RET
TSJ_DOWN1: CJNE A,#01101011B,TSJ_DOWN2 ;上面关门状态
MOV P1,#11101011B ;开门
RET
TSJ_DOWN2: CJNE A,#01111111B,TSJ_DOWN3 ;上面开门中
MOV P1,#11101011B ;开门
RET
TSJ_DOWN3: CJNE A,#01111011B,TSJ_DOWN4 ;上面1开门中2关门
MOV P1,#11101011B ;开门
RET
TSJ_DOWN4: CJNE A,#01101111B,TSJ_DOWN5 ;上面2开门中1关门
MOV P1,#11101011B ;开门
RET
TSJ_DOWN5: CJNE A,#01110111B,TSJ_DOWN6 ;上面1开门中2开好
MOV P1,#11111011B ;1开门
RET
TSJ_DOWN6: CJNE A,#01011111B,TSJ_DOWN7 ;上面2开门中1开好
MOV P1,#11101111B ;2开门
RET
TSJ_DOWN7: CJNE A,#11010111B,TSJ_DOWN8 ;中间
MOV P1,#10111101B ;下降
RET
TSJ_DOWN8: CJNE A,#10010111B,TSJ_DOWN9 ;下面
TSJ_DOWN9: MOV P1,#11111111B ;停止
MOV R7,#0EH
RET
;//////////////////停止
TSJ_STOP: MOV P1,#0FFH
MOV R7,#0EH
RET
;/********************************************************************************************/
;高度设置
;/********************************************************************************************/
;//////////////////位置调整
TSJ_HSET: CLR ES ;关闭中断
TSJ_HSET1: CP

L SDA
MOV P2,#0FFH
MOV A,P2
CJNE A,#01010111B,TSJ_HSET2 ;在上面门开好
MOV P1,#10111101B ;下降并计时
MOV TMOD,#01H ;计时器1工作,
MOV IE,#00H
MOV TCON,#00H
MOV TH0,#00H
MOV TL0,#00H
SETB TR0
LCALL TSJ_TIME
RET
TSJ_HSET2: CJNE A,#01101011B,TSJ_HSET3 ;上面关门状态
MOV P1,#11101011B ;开门
JMP TSJ_HSET1
TSJ_HSET3: CJNE A,#01111111B,TSJ_HSET4 ;上面开门中
MOV P1,#11101011B ;开门
JMP TSJ_HSET1
TSJ_HSET4: CJNE A,#01111011B,TSJ_HSET5 ;上面1开门中2关门
MOV P1,#11101011B ;开门
JMP TSJ_HSET1
TSJ_HSET5: CJNE A,#01101111B,TSJ_HSET6 ;上面2开门中1关门
MOV P1,#11101011B ;开门
JMP TSJ_HSET1
TSJ_HSET6: CJNE A,#01110111B,TSJ_HSET7 ;上面1开门中2开好
MOV P1,#11111011B ;1开门
JMP TSJ_HSET1
TSJ_HSET7: CJNE A,#01011111B,TSJ_HSET8 ;上面2开门中1开好
MOV P1,#11101111B ;2开门
JMP TSJ_HSET1
TSJ_HSET8: CJNE A,#11010111B,TSJ_HSET9 ;中间
MOV P1,#10111110B ;上升
JMP TSJ_HSET1
TSJ_HSET9: CJNE A,#10010111B,TSJ_HSETA ;下面
MOV P1,#10111110B ;上升
JMP TSJ_HSET1
TSJ_HSETA: MOV P1,#0FFH
MOV R7,#0EH
RET
;//////////////////时间记录,数据存储
TSJ_TIME: MOV 41H,#0FFH
TSJ_TIME1: MOV 40H,#0FFH
TSJ_TIME2: CPL SDA
JNB KLEFT,TSJ_TIME4 ;跳转到数据保存程序,在有按右键的情况下
JB YLEFT,TSJ_TIME4
JNB DOWN,TSJ_TIME3 ;遇到下限位,再进行设置
JNB TF0,TSJ_TIME2
CLR TF0
DJNZ 40H,TSJ_TIME2 ;延时计数
DJNZ 41H,TSJ_TIME1
LCALL TSJ_HSET ;如果超数,就在次进行设置
RET
TSJ_TIME3: MOV P1,#11111111B
LCALL TSJ_HSET
RET
TSJ_TIME4: MOV P1,#0FFH

CLR TR0
MOV A,#0FFH
CLR C
SUBB A,41H
MOV 47H,A
MOV A,#0FFH
CLR C
SUBB A,40H
MOV 46H,A
MOV A,#0FFH
CLR C
SUBB A,TL0
MOV 48H,A
MOV A,#0FFH
CLR C
SUBB A,TH0
MOV 49H,A
LCALL STEVEN
MOV 63H,46H
MOV 64H,47H
MOV 65H,48H
MOV 66H,49H
MOV 41H,46H
MOV 42H,47H
MOV 43H,48H
MOV 44H,49H
CPL SDA
MOV SUBA,#02H ;写1021子地址于#02H
MOV SLA,#0A0H ;器件1021地址
MOV NUMBYTE,#04H ;传4个数据,下降时间存放地址02H/03H/04H/05H
LCALL IWRNBYTE
RET
;/********************************************************************************************/
;清除高度
;/********************************************************************************************/
TSJ_HCLR: MOV 41H,#0FFH
MOV 42H,#0FFH
MOV 43H,#0FFH
MOV 44H,#0FFH
MOV 63H,#0FFH
MOV 64H,#0FFH
MOV 65H,#0FFH
MOV 66H,#0FFH
MOV SUBA,#02H ;写1021子地址于#02H
MOV SLA,#0A0H ;器件1021地址
MOV NUMBYTE,#04H ;传4个数据,下降时间存放地址02H/03H/04H/05H
LCALL STEVEN
LCALL IWRNBYTE
RET
;/********************************************************************************************/
;中断
;/********************************************************************************************/
INT: PUSH ACC
PUSH PSW
MOV R0,#50H
MOV R5,#06H
INT1: SETB REN
RDWAIT: JBC RI,RDNEXT
AJMP RDWAIT
RDNEXT: MOV A,SBUF
MOV @R0,A
INC R0
DJNZ R5,INT1
CLR RI
MOV A,#0BH
MOV

60H,A
POP PSW
POP ACC
RETI
;/********************************************************************************************/
;串口命令:50H改本机地址,51H改组地址,52H停止,60H上升,61H下降
;/********************************************************************************************/
;//////////////////校验
MAST: MOV A,#0AH ;清理标志位成#0AH
MOV 60H,A
MOV A,50H
CJNE A,#0DEH,MAST9 ;数据头要求为#DEH
MOV A,51H
XRL A,#0DEH
XRL A,52H
XRL A,53H
ANL A,#7FH
CJNE A,54H,MAST9
MOV A,55H
CJNE A,#0E3H,MAST9 ;校验数据,合格检查数据,不合格转主程序
;//////////////////判断是否为广播命令
MOV A,51H ;#DEH/#00H/#00H/#XXH/#XXH/#E3H
CJNE A,#00H,ZL
MOV A,52H
CJNE A,#00H,MAST9
LJMP MAST1
;//////////////////判断是否是组命令
ZL: CJNE A,#0FFH,ZL1 ;#DEH/#FFH/#XXH/#XXH/#XXH/#E3H
MOV A,52H
CJNE A,62H,MAST9
LJMP MAST1
;//////////////////判断是否是单机命令
ZL1: MOV A,52H ;#DEH/#XXH/#FFH/#XXH/#XXH/#E3H
CJNE A,#0FFH,MAST4
MOV A,51H
CJNE A,61H,MAST9
LJMP MAST1
MAST9: RET
;//////////////////命令判断
MAST1: MOV A,53H
CJNE A,#60H,MAST2 ;上升命令
MOV R7,#0AH
RET
MAST2: CJNE A,#61H,MAST3 ;下降命令
MOV R7,#0BH
RET
MAST3: CJNE A,#52H,MAST9 ;停止
MOV R7,#0EH
RET
MAST4: CJNE A,#00H,MAST5 ;X1,X2不为0FFH/00H,进入修改本机/组地址系统
RET
MAST5: MOV A,53H ;分析命令
CJNE A,#50H,MAST6 ;#DEH/#XXH/#XXH/#50H/#XXH/#E3H,本机地址
LJMP MAST7
MAST6: CJNE A,#51H,MAST9 ;#DEH/#XXH/#XXH/#51H/#XXH/#E3H,组地址
LJMP MAST8
;//////////////////本机/组地址修改
MAST7: CPL SDA
MOV A,52H

;52H为检验机号51H为目标本机地址
CJNE A,61H,MAST9
MOV 41H,51H ;改本机地址
MOV 42H,62H ;组地址不变
MOV SUBA,#00H ;写1021子地址于#00H
MOV SLA,#0A0H ;器件1021地址
MOV NUMBYTE,#02H ;传2个数据:本机地址/组地址
LCALL IWRNBYTE ;把本机地址41H,组地址42H存于1021的01H/02H
MOV 61H,41H ;直接改写好本机地址
RET
MAST8: CPL SDA
MOV A,52H ;52H为检验机号51H为目标组地址
CJNE A,61H,MAST9
MOV 41H,61H ;本机地址不变
MOV 42H,51H ;改组地址
MOV SUBA,#00H ;写1021子地址于#00H
MOV SLA,#0A0H ;器件1021地址
MOV NUMBYTE,#02H ;传2个数据:本机地址/组地址
LCALL IWRNBYTE ;把本机地址41H,组地址42H存于61H/62H
MOV 62H,42H ;直接改写好组地址
RET
;/********************************************************************************************/
;I2C总线
;/********************************************************************************************/
;///////////起始
START: SETB SDA
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SDA
NOP
NOP
NOP
NOP
NOP
CLR SCL
NOP
RET
;///////////停止
STOP: CLR SDA
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
SETB SDA
NOP
NOP
NOP
NOP
NOP
RET
;///////////应答
MACK: CLR SDA
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SCL
NOP
NOP
RET
;///////////非应答
MNACK: SETB SDA
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SCL
NOP
NOP
RET
;///////////检查应答
CACK: SETB SDA
NOP
NOP
SETB SCL
CLR

ACK
NOP
NOP
MOV C,SDA
JC CEND
SETB ACK
CEND: NOP
CLR SCL
NOP
RET
;///////////字节发送
WRBYTE: MOV R0,#08H
WPL: RLC A
JC WR1
SJMP WR0
WPL1: DJNZ R0,WPL
NOP
RET
WR1: SETB SDA
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SCL
SJMP WPL1
WR0: CLR SDA
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SCL
SJMP WPL1
;///////////字节接受
RDBYTE: MOV R0,#08H
RLP: SETB SDA
NOP
SETB SCL
NOP
NOP
MOV C,SDA
MOV A,R2
CLR SCL
RLC A
MOV R2,A
NOP
NOP
NOP
DJNZ R0,RLP
RET
;///////////向指定地址写N个节数据
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个节数据
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
CJNE A,#50H,TEST
TEST: MOV @R1,A
DJNZ R3,SACK
LCALL MNACK
RETRDN: LCALL STOP
RET
SACK: LCALL MACK
INC R1
SJMP RDN1
;/********************************************************************************************/
;延时
;/********************************************************************************************/
DELAY_5: MOV R2,#07FH ;0.1s
DEL1: MOV R1,#0FFH
DEL2: DJNZ R1,DEL2
DJNZ R2,DEL1
RET
DELAY_10: MOV R3,#10 ;1s
DEL3: MOV R2,#200
DEL4: MOV R1,#250
DEL5: DJNZ R1,DEL5
DJNZ R2,DEL4
DJNZ R3,DEL3
RET
END

相关文档
相关文档 最新文档