📄 com.src
字号:
; void serial(void) interrupt 4//串口中断响应
RSEG ?PR?serial?COM
USING 0
serial:
PUSH ACC
PUSH PSW
MOV PSW,#00H
PUSH AR0
PUSH AR6
PUSH AR7
USING 0
; SOURCE LINE # 123
; {
; if(RI)//为接收中断
; SOURCE LINE # 125
JNB RI,?C0022
; {
; SOURCE LINE # 126
; RI=0; //清接收中断标志
; SOURCE LINE # 127
CLR RI
; LED = ~LED; //闪串口指示LED
; SOURCE LINE # 128
CPL LED
; sbuffer = SBUF; //读取串口缓冲区数据
; SOURCE LINE # 129
MOV sbuffer,SBUF
;
; if((sbuffer == 's') && (receive == 0)) //判断是否为数据头 ,是数据头则准备接收
; SOURCE LINE # 131
MOV A,sbuffer
CJNE A,#073H,?C0023
JB receive,?C0023
; {
; SOURCE LINE # 132
; receive = 1; //开始接收标志
; SOURCE LINE # 133
SETB receive
; cmd_numb = 0; //清接收计数器
; SOURCE LINE # 134
MOV cmd_numb,#00H
; re_finish = 0; //清接收完成标志
; SOURCE LINE # 135
CLR re_finish
; }
; SOURCE LINE # 136
SJMP ?C0029
?C0023:
; else if(sbuffer == 'e') //判断数据尾
; SOURCE LINE # 137
MOV A,sbuffer
CJNE A,#065H,?C0025
; {
; SOURCE LINE # 138
; re_finish = 1; //置接收完成标志
; SOURCE LINE # 139
SETB re_finish
; receive =0; //清接收标志
; SOURCE LINE # 140
CLR receive
; }
; SOURCE LINE # 141
SJMP ?C0029
?C0025:
; else if(receive){ //判断当前是否处于接收状态
; SOURCE LINE # 142
JNB receive,?C0029
;
; buffer[cmd_numb++] = sbuffer-'0'; //当前字符送缓冲区
; SOURCE LINE # 144
MOV A,sbuffer
ADD A,#0D0H
MOV R7,A
MOV R6,cmd_numb
INC cmd_numb
MOV A,#LOW (buffer)
ADD A,R6
MOV R0,A
MOV @R0,AR7
; }
; SOURCE LINE # 145
SJMP ?C0029
; else //无效命令则返回
; return;
; }
; SOURCE LINE # 148
?C0022:
; else{
; SOURCE LINE # 149
; TI=0; //为单个字符发送完中断
; SOURCE LINE # 150
CLR TI
; if(!number) //字符串发送完
; SOURCE LINE # 151
MOV A,number?
JNZ ?C0031
; { REN = 1; //允许接收
; SOURCE LINE # 152
SETB REN
; }
; SOURCE LINE # 153
SJMP ?C0029
?C0031:
; else{ //字符串未发送完
; SOURCE LINE # 154
; SBUF = buffer[i++]; //发送下一字符
; SOURCE LINE # 155
MOV R7,i
INC i
MOV A,#LOW (buffer)
ADD A,R7
MOV R0,A
MOV A,@R0
MOV SBUF,A
; number--; //发送字符数减一
; SOURCE LINE # 156
DEC number?
; }
; SOURCE LINE # 157
; }
; SOURCE LINE # 158
; }
; SOURCE LINE # 159
?C0029:
POP AR7
POP AR6
POP AR0
POP PSW
POP ACC
RETI
; END OF serial
;
; /*****************************延时函数**************************/
; void delay(unsigned int loop)
RSEG ?PR?_delay?COM
L?0058:
USING 0
L?0059:
MOV R7,#01H
MOV R6,#00H
_delay:
USING 0
; SOURCE LINE # 162
;---- Variable 'loop?542' assigned to Register 'R6/R7' ----
; { unsigned int i ; //loop 为执行空指令的次数,改变它可一改变延时时长
; SOURCE LINE # 163
; for(i=0;i<loop;i++);//循环执行空指令loop次,达到延时目的
; SOURCE LINE # 164
;---- Variable 'i?543' assigned to Register 'R4/R5' ----
CLR A
MOV R5,A
MOV R4,A
?C0033:
CLR C
MOV A,R5
SUBB A,R7
MOV A,R4
SUBB A,R6
JNC ?C0036
INC R5
CJNE R5,#00H,?C0055
INC R4
?C0055:
SJMP ?C0033
; }
; SOURCE LINE # 165
?C0036:
RET
; END OF _delay
;
;
; /*******************************I2C开始*****************************/
; void Start_I2c()
RSEG ?PR?Start_I2c?COM
Start_I2c:
USING 0
; SOURCE LINE # 169
; {
; SOURCE LINE # 170
; SDA=1;
; SOURCE LINE # 171
SETB SDA
; delay(1);
; SOURCE LINE # 172
LCALL L?0058
; SCL=1;
; SOURCE LINE # 173
SETB SCL
; delay(3);
; SOURCE LINE # 174
MOV R7,#03H
LCALL _delay
; SDA=0;
; SOURCE LINE # 175
CLR SDA
; delay(3);
; SOURCE LINE # 176
LCALL _delay
; SCL=0;
; SOURCE LINE # 177
CLR SCL
; delay(1);
; SOURCE LINE # 178
MOV R7,#01H
LJMP _delay
; END OF Start_I2c
; }
;
;
;
; /*********************************I2C结束*****************************/
; void Stop_I2c()
RSEG ?PR?Stop_I2c?COM
Stop_I2c:
USING 0
; SOURCE LINE # 184
; {
; SOURCE LINE # 185
; SDA=0;
; SOURCE LINE # 186
CLR SDA
; delay(1);
; SOURCE LINE # 187
LCALL L?0058
; SCL=1;
; SOURCE LINE # 188
SETB SCL
; delay(3);
; SOURCE LINE # 189
MOV R7,#03H
LCALL _delay
; SDA=1;
; SOURCE LINE # 190
SETB SDA
; delay(1);
; SOURCE LINE # 191
MOV R7,#01H
LJMP _delay
; END OF Stop_I2c
;
; }
;
;
; /*********************************I2C写一个字节************************/
; void SendB(uchar c)
RSEG ?PR?_SendB?COM
_SendB:
USING 0
; SOURCE LINE # 197
;---- Variable 'ack?846' assigned to Register 'R1' ----
;---- Variable 'c?844' assigned to Register 'R3' ----
MOV R3,AR7
; {
; SOURCE LINE # 198
; uchar BitCnt,ack;
; for(BitCnt=0;BitCnt<8;BitCnt++)
; SOURCE LINE # 200
;---- Variable 'BitCnt?845' assigned to Register 'R2' ----
CLR A
MOV R2,A
?C0039:
; {
; SOURCE LINE # 201
; if((c<<BitCnt)&0x80)SDA=1;
; SOURCE LINE # 202
MOV A,R3
MOV R0,AR2
INC R0
SJMP ?C0057
?C0056:
CLR C
RLC A
?C0057:
DJNZ R0,?C0056
JNB ACC.7,?C0042
SETB SDA
SJMP ?C0043
?C0042:
; else SDA=0;
; SOURCE LINE # 203
CLR SDA
?C0043:
; delay(2);
; SOURCE LINE # 204
MOV R7,#02H
MOV R6,#00H
LCALL _delay
; SCL=1;
; SOURCE LINE # 205
SETB SCL
; delay(5);
; SOURCE LINE # 206
MOV R7,#05H
LCALL _delay
; SCL=0;
; SOURCE LINE # 207
CLR SCL
; delay(2);
; SOURCE LINE # 208
MOV R7,#02H
LCALL _delay
;
; }
; SOURCE LINE # 210
INC R2
CJNE R2,#08H,?C0039
?C0040:
; delay(1);
; SOURCE LINE # 211
LCALL L?0059
; SDA=1;
; SOURCE LINE # 212
SETB SDA
; delay(5);
; SOURCE LINE # 213
MOV R7,#05H
LCALL _delay
; SCL=1;
; SOURCE LINE # 214
SETB SCL
; delay(1);
; SOURCE LINE # 215
MOV R7,#01H
LCALL _delay
; if(SDA==1)ack=0;
; SOURCE LINE # 216
JNB SDA,?C0044
CLR A
MOV R1,A
SJMP ?C0045
?C0044:
; else ack=1;
; SOURCE LINE # 217
MOV R1,#01H
?C0045:
; SCL=0;
; SOURCE LINE # 218
CLR SCL
; delay(1);
; SOURCE LINE # 219
MOV R7,#01H
MOV R6,#00H
LJMP _delay
; END OF _SendB
;
; }
;
; /******************************I2C读取一个字节****************************/
; uchar RcvB()
RSEG ?PR?RcvB?COM
RcvB:
USING 0
; SOURCE LINE # 224
; {
; SOURCE LINE # 225
; uchar retc;
; uchar BitCnt;
; retc=0;
; SOURCE LINE # 228
;---- Variable 'retc?947' assigned to Register 'R3' ----
CLR A
MOV R3,A
; SDA=1;
; SOURCE LINE # 229
SETB SDA
; for(BitCnt=0;BitCnt<8;BitCnt++)
; SOURCE LINE # 230
;---- Variable 'BitCnt?948' assigned to Register 'R2' ----
MOV R2,A
?C0047:
; {
; SOURCE LINE # 231
; delay(1);
; SOURCE LINE # 232
LCALL L?0059
; SCL=0;
; SOURCE LINE # 233
CLR SCL
; delay(5);
; SOURCE LINE # 234
MOV R7,#05H
LCALL _delay
; SCL=1;
; SOURCE LINE # 235
SETB SCL
; delay(2);
; SOURCE LINE # 236
MOV R7,#02H
LCALL _delay
; retc=retc<<1;
; SOURCE LINE # 237
MOV A,R3
ADD A,ACC
MOV R3,A
; if(SDA==1)retc=retc+1;
; SOURCE LINE # 238
JNB SDA,?C0050
INC R3
?C0050:
; delay(1);
; SOURCE LINE # 239
LCALL L?0059
; }
; SOURCE LINE # 240
INC R2
CJNE R2,#08H,?C0047
?C0048:
; SCL=0;
; SOURCE LINE # 241
CLR SCL
; delay(1);
; SOURCE LINE # 242
LCALL L?0059
; return(retc);
; SOURCE LINE # 243
MOV R7,AR3
; }
; SOURCE LINE # 244
?C0051:
RET
; END OF RcvB
;
; /*********************************I2C应答*********************************/
; void Ack_I2c(bit a)
RSEG ?PR?Ack_I2c?COM
Ack_I2c:
USING 0
; SOURCE LINE # 247
; {
; SOURCE LINE # 248
; if(a==0)SDA=0;
; SOURCE LINE # 249
JB a?1049,?C0052
CLR SDA
SJMP ?C0053
?C0052:
; else SDA=1;
; SOURCE LINE # 250
SETB SDA
?C0053:
; delay(1);
; SOURCE LINE # 251
LCALL L?0059
; SCL=1;
; SOURCE LINE # 252
SETB SCL
; delay(2);
; SOURCE LINE # 253
INC R7
LCALL _delay
; SCL=0;
; SOURCE LINE # 254
CLR SCL
; delay(1);
; SOURCE LINE # 255
DEC R7
LJMP _delay
; END OF Ack_I2c
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -