📄 serial.src
字号:
; }
; SOURCE LINE # 84
?C0010:
RET
; END OF send
CSEG AT 00023H
LJMP serial
;
;
; /*****************************串口中断响应处理函数***********************/
;
; void serial(void) interrupt 4
RSEG ?PR?serial?SERIAL
USING 0
serial:
PUSH ACC
PUSH PSW
MOV PSW,#00H
PUSH AR0
PUSH AR6
PUSH AR7
USING 0
; SOURCE LINE # 89
; { uchar k;
; if(RI)//为接收中断
; SOURCE LINE # 91
JNB RI,?C0011
; {
; SOURCE LINE # 92
; RI=0; //清接收中断标志
; SOURCE LINE # 93
CLR RI
; LED = ~LED; //闪串口指示LED
; SOURCE LINE # 94
CPL LED
; sbuffer = SBUF; //读取串口缓冲区数据
; SOURCE LINE # 95
MOV sbuffer,SBUF
;
; if((sbuffer == 's') && (receive == 0)) //判断是否为数据头 ,是数据头则准备接收
; SOURCE LINE # 97
MOV A,sbuffer
CJNE A,#073H,?C0012
JB receive,?C0012
; {
; SOURCE LINE # 98
; receive = 1; //开始接收标志
; SOURCE LINE # 99
SETB receive
; cmd_numb = 0; //清接收计数器
; SOURCE LINE # 100
MOV cmd_numb,#00H
; re_finish = 0; //清接收完成标志
; SOURCE LINE # 101
CLR re_finish
; }
; SOURCE LINE # 102
SJMP ?C0022
?C0012:
; else if(sbuffer == 'e') //判断数据尾
; SOURCE LINE # 103
MOV A,sbuffer
CJNE A,#065H,?C0014
; {
; SOURCE LINE # 104
; if(cmd_numb<8)//接收到的字符少于8个
; SOURCE LINE # 105
MOV A,cmd_numb
CLR C
SUBB A,#08H
JNC ?C0015
; for(k=cmd_numb;k<8;k++)//则空位填空显示
; SOURCE LINE # 106
;---- Variable 'k?241' assigned to Register 'R7' ----
MOV R7,cmd_numb
?C0016:
MOV A,R7
CLR C
SUBB A,#08H
JNC ?C0015
; buffer[k] = 17;
; SOURCE LINE # 107
MOV A,#LOW (buffer)
ADD A,R7
MOV R0,A
MOV @R0,#011H
INC R7
SJMP ?C0016
?C0015:
; re_finish = 1; //置接收完成标志
; SOURCE LINE # 108
SETB re_finish
; receive =0; //清接收标志
; SOURCE LINE # 109
CLR receive
; }
; SOURCE LINE # 110
SJMP ?C0022
?C0014:
; else if(receive){ //判断当前是否处于接收状态
; SOURCE LINE # 111
JNB receive,?C0022
;
; buffer[cmd_numb++] = sbuffer-'0'; //当前字符送缓冲区
; SOURCE LINE # 113
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 # 114
SJMP ?C0022
; else //无效命令则返回
; return;
; }
; SOURCE LINE # 117
?C0011:
; else{
; SOURCE LINE # 118
; TI=0; //为单个字符发送完中断
; SOURCE LINE # 119
CLR TI
; if(!number) //字符串发送完
; SOURCE LINE # 120
MOV A,number?
JNZ ?C0024
; { REN = 1; //允许接收
; SOURCE LINE # 121
SETB REN
; }
; SOURCE LINE # 122
SJMP ?C0022
?C0024:
; else{ //字符串未发送完
; SOURCE LINE # 123
; SBUF = cash[i++]; //发送下一字符
; SOURCE LINE # 124
MOV R7,i
INC i
MOV A,#LOW (cash)
ADD A,R7
MOV R0,A
MOV A,@R0
MOV SBUF,A
; number--; //发送字符数减一
; SOURCE LINE # 125
DEC number?
; }
; SOURCE LINE # 126
; }
; SOURCE LINE # 127
; }
; SOURCE LINE # 128
?C0022:
POP AR7
POP AR6
POP AR0
POP PSW
POP ACC
RETI
; END OF serial
;
; /*****************************延时函数**********************/
; void delay(unsigned int loop)
RSEG ?PR?_delay?SERIAL
_delay:
USING 0
; SOURCE LINE # 131
;---- Variable 'loop?342' assigned to Register 'R6/R7' ----
; { unsigned int i ; //loop 为执行空指令的次数,改变它可一改变延时时长
; SOURCE LINE # 132
; for(i=0;i<loop;i++); //循环执行空指令loop次,达到延时目的
; SOURCE LINE # 133
;---- Variable 'i?343' assigned to Register 'R4/R5' ----
CLR A
MOV R5,A
MOV R4,A
?C0026:
CLR C
MOV A,R5
SUBB A,R7
MOV A,R4
SUBB A,R6
JNC ?C0029
INC R5
CJNE R5,#00H,?C0040
INC R4
?C0040:
SJMP ?C0026
; }
; SOURCE LINE # 134
?C0029:
RET
; END OF _delay
;
;
; /******************************数码管显示扫描*************************/
;
; void ledscan()
RSEG ?PR?ledscan?SERIAL
ledscan:
USING 0
; SOURCE LINE # 139
; { uchar i;
; SOURCE LINE # 140
;
; for(i=0;i<8;i++){
; SOURCE LINE # 142
;---- Variable 'i?444' assigned to Register 'R3' ----
CLR A
MOV R3,A
?C0030:
; P2 = 0xff;//关闭所有数码管
; SOURCE LINE # 143
MOV P2,#0FFH
; addr3 = 0;
; SOURCE LINE # 144
CLR addr3
; addr0 = 0;
; SOURCE LINE # 145
CLR addr0
; addr1 = 1;
; SOURCE LINE # 146
SETB addr1
; addr2 = 0;//开发板上U4(74HC574)的片选地址
; SOURCE LINE # 147
CLR addr2
; P0 =table[cash[i]]; //取一行显示数据
; SOURCE LINE # 148
MOV A,#LOW (cash)
ADD A,R3
MOV R0,A
MOV A,@R0
MOV DPTR,#table
MOVC A,@A+DPTR
MOV P0,A
; addr3 = 1;
; SOURCE LINE # 149
SETB addr3
; addr3 = 0;//在U4的11脚(锁存信号)产生上升沿
; SOURCE LINE # 150
CLR addr3
; P2 = scan[i];//取row0--row7行扫描数据
; SOURCE LINE # 151
MOV A,R3
MOV DPTR,#scan
MOVC A,@A+DPTR
MOV P2,A
; delay(50); //延时50us
; SOURCE LINE # 152
MOV R7,#032H
MOV R6,#00H
LCALL _delay
; }
; SOURCE LINE # 153
INC R3
CJNE R3,#08H,?C0030
; }
; SOURCE LINE # 154
?C0033:
RET
; END OF ledscan
;
; /********************************主函数****************************/
;
; main()
RSEG ?PR?main?SERIAL
main:
USING 0
; SOURCE LINE # 158
; {
; SOURCE LINE # 159
; initial();
; SOURCE LINE # 160
LCALL initial
?C0034:
; while(1){//主循环
; SOURCE LINE # 161
; if(re_finish){//把串口缓冲区的内容送到显示缓冲区
; SOURCE LINE # 162
JNB re_finish,?C0036
; cash[0] = buffer[0];
; SOURCE LINE # 163
MOV cash,buffer
; cash[1] = buffer[1];
; SOURCE LINE # 164
MOV cash+01H,buffer+01H
; cash[2] = buffer[2];
; SOURCE LINE # 165
MOV cash+02H,buffer+02H
; cash[3] = buffer[3];
; SOURCE LINE # 166
MOV cash+03H,buffer+03H
; cash[4] = buffer[4];
; SOURCE LINE # 167
MOV cash+04H,buffer+04H
; cash[5] = buffer[5];
; SOURCE LINE # 168
MOV cash+05H,buffer+05H
; cash[6] = buffer[6];
; SOURCE LINE # 169
MOV cash+06H,buffer+06H
; cash[7] = buffer[7];
; SOURCE LINE # 170
MOV cash+07H,buffer+07H
; re_finish = 0;//接收完成标志
; SOURCE LINE # 171
CLR re_finish
; copyOK=1;//发送缓冲区填充完成标志
; SOURCE LINE # 172
MOV copyOK,#01H
; send(); //把显示缓冲区的内容发送给电脑
; SOURCE LINE # 173
LCALL send
; }
; SOURCE LINE # 174
?C0036:
; ledscan(); //循环扫描数码管
; SOURCE LINE # 175
LCALL ledscan
; }
; SOURCE LINE # 176
SJMP ?C0034
; END OF main
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -