![]() |
串口發送數據完成后,要退出發送子程序,并且要將發送中斷標志位清零,單片機串口通信是單工工作的,發送的時候不能接收,接收的時候不能發送 |
發送端 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 |