| 串口发送数据完成后,要退出发送子程序,并且要将发送中断标志位清零,单片机串口通信是单工工作的,发送的时候不能接收,接收的时候不能发送 |
|
发送端 ORG 0000H JMP START ORG 0100H START: ACALL INIT MAIN: MOV P2,#0F0H MOV A,P2 XRL A,#0F0H JZ MAIN ACALL KEYSCAN MOV A,30H MOV DPTR,#TABLE2 MOVC A,@A+DPTR MOV P1,A SETB P0.5 CLR P0.4 CLR P0.3 ACALL DELAY2 SETB P0.3 ACALL DELAY ALOOP1: MOV 40H,A MOV SBUF,#0E1H JNB TI,$;发送中断 CLR TI JNB RI,$;接收中断 CLR RI MOV A,SBUF;二号机应答信号 XRL A,#0E2H;异或判定是否准备完毕(判断发送消息是否为#0E2) JNZ ALOOP1;开始发送数据时定义初始地址,这个地址里面存储要发送的数据 MOV R0,#40H MOV R6,#00H;校验和 ALOOP2: MOV SBUF,@R0 MOV A,R6 ADD A,@R0 MOV R6,A JNB TI,$ CLR TI MOV SBUF,R6 JNB TI,$;发送中断 CLR TI JNB RI,$;接收应答中断 CLR RI MOV A,SBUF XRL A,#00H JNZ ALOOP2 JMP MAIN INIT: MOV A,#00000001B MOV P1,A ACALL ENABLE MOV A,#00111000B MOV P1,A ACALL ENABLE MOV A,#00001111B MOV P1,A ACALL ENABLE MOV A,#00000110B MOV P1,A ACALL ENABLE MOV A,#00H MOV P1,A ACALL ENABLE CLR EA MOV TMOD,#20H MOV TH1,#0F4H MOV TL1,#0F4H MOV PCON,#00H SETB TR1 MOV SCON,#50H KEYSCAN:MOV P2,#0F0H;先读列再读行 MOV A,P2 ANL A,#0F0H MOV R3,A MOV P2,#0FH MOV A,P2 ANL A,#0FH ORL A,R3 CJNE A,#0FFH,KEYPRO;检测键值是否成功读入 RET KEYPRO: MOV R3,A MOV DPTR,#KEYVALUE MOV R4,#0FFH;存键值表到键码表的偏移量 KEY1: INC R4 ;扫描键码表里面的数值 MOV A,R4 MOVC A,@A+DPTR CJNE A,03H,KEY1 MOV A,R4 MOV 30H,A DELAY1: MOV R6,#60H;延时程序 DE2: MOV R7,#90H DJNZ R7,$ DJNZ R6,DE2 RET ENABLE: CLR P0.5;写命令 CLR P0.4 CLR P0.3 ACALL DELAY2 SETB P0.3 RET DELAY2: MOV P1,#0FFH CLR P0.5 SETB P0.4 CLR P0.3 NOP SETB P0.3 JB P1.7,DELAY2 RET DELAY: MOV R5,#10H;延时程序 D1: MOV R6,#30H D2: MOV R7,#90H DJNZ R7,$ DJNZ R6,D2 DJNZ R5,D1 RET KEYVALUE:DB 0E7H,0D7H,0B7H,077H,0EBH,0DBH,0BBH,07BH,0EDH,0DDH,0BDH,07DH,0EEH,0DEH,0BEH,07EH;键码矩阵 TABLE2: DB 30H,31H,33H,38H,64H,69H,61H,6EH,6BH,65H,79H,74H,67H,3CH,5FH,3EH END |