1、MAIN: MOV SP,#53H MOV 78H,#20H MOV 77H,00H MOV 76H,20H MOV 75H,40H ACALL TRANSHERE: SJMP HERETRANS: MOV TMOD,#20H MOV TH1,#0F3H MOV TL1,#0F3H MOV PCON,#80H SETB TR1 MOV SCON,#40H MOV IE,#00H CLR F0 MOV SBUF,78HWAIT1: JNB TI,WAIT1 CLR TI MOV SBUF,77HWAIT2: JNB TI,WAIT2 MOV SBUF,76HWAIT3: JNB TI,WAIT3
2、 MOV SBUF,75HWAIT4: JNB TI,WAIT4 MOV IE,#90H MOV DPH,78H MOV DPL,77H MOVX A,DPTR MOV SBUF,AWAIT: JNB F0,WAIT RETCOM_INT: INC DPTR MOV A,DPH CJNE A,76H,END1 MOV A,DPL CJNE A,75H,END1 SETB F0 CLR ES CLR EAEND1: RETI END乙方发送程序如下: ORG 0000H ACALL RECEIRECEI: MOV R0,#78H MOV SCON,#50H CLR 7FH JNB 7FH,WAI
3、T PUSH DPL PUSH DPH PUSH Acc CLR RI JB F0,R_DATA MOV A,SBUF MOV R0,A DEC R0 CJNE R0,#74H,RETNRETN: POP Acc POP DPH POP DPLR_DATA: MOVX DPTR,A INC 77H MOV A,77H JNZ END2 INC 78HEND2: MOV A,76H CJNE A,78H,RETN MOV A,75H CJNE A,77H,RETN SETB 7FH SJMP RETN五、实验过程中遇到的主要问题OUTBIT equ 08002h ; 位控制口OUTSEG equ
4、 08004h ; 段控制口IN equ 08001h ; 键盘读入口HasRcv equ 20h.0 ; 接收标志位LEDBuf equ 40h ; 显示缓冲RCVBuf equ 50H ; 接收缓冲 LJMP START; 串行口中断程序 JNB TI,S0_R NOP SJMP S0_RETS0_R: ; 接收数据 MOV RCVBUF,SBUF ; 保存数据 SETB HasRcv ; 提示收到数据S0_RET:LEDMAP: 八段管显示码 db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h db 7fh, 6fh, 77h, 7ch, 39h, 5eh
5、, 79h, 71hDelay: 延时子程序 mov r7, #0DelayLoop: djnz r7, DelayLoop djnz r6, DelayLoop retDisplayLED: mov r0, #LEDBuf mov r1, #6 ; 共6个八段管 mov r2, #00100000b ; 从左边开始显示Loop: mov dptr, #OUTBIT mov a, #0 movx dptr, a ; 关所有八段管 mov a, r0 mov dptr, #OUTSEG movx dptr,a mov a, r2 显示一位八段管 mov r6, #1 call Delay mov
6、 a, r2 ; 显示下一位 rr a mov r2, a inc r0 djnz r1, LoopTestKey: 输出线置为0 mov dptr, #IN movx a, dptr ; 读入键状态 cpl a anl a, #0fh ; 高四位不用KeyTable: 键码定义 db 16h, 15h, 14h, 0ffh db 13h, 12h, 11h, 10h db 0dh, 0ch, 0bh, 0ah db 0eh, 03h, 06h, 09h db 0fh, 02h, 05h, 08h db 00h, 01h, 04h, 07hGetKey: mov P2, dph mov r0,
7、 #Low(IN) mov r1, #00100000b mov r2, #6KLoop: mov a, r1 ; 找出键所在列 movx dptr, a mov r1, a ; 下一列 movx a, r0 anl a, #0fh jnz Goon1 ; 该列有键入 djnz r2, KLoop mov r2, #0ffh ; 没有键按下, 返回 0ffh sjmp ExitGoon1: 键值 = 列 X 4 + 行 dec a rl a mov r2, a ; r2 = (r2-1)*4 r1中为读入的行值 mov r1, #4LoopC: rrc a ; 移位找出所在行 jc Exit
8、inc r2 ; r2 = r2+ 行值 djnz r1, LoopCExit: 取出键码 mov dptr, #KeyTable movc a, a+dptrWaitRelease: mov dptr, #OUTBIT ; 等键释放 clr a mov r6, #10 call TestKey jnz WaitReleaseSTART: MOV SP, #60H MOV IE, #0 ; DISABLE ALL INTERRUPT MOV TMOD,#020H ; 定时器1工作于方式2 (8位重装) MOV TH1, #0F3H ; 波特率?2400BPS 12MHz MOV TL1, #0
9、F3H ANL PCON,#07FH ; SMOD 位清零 orl PCON,#80h MOV SCON,#050H ; 串行口工作方式设置 MOV LEDBuf, #0ffh ; 显示 8.8.8.8. mov LEDBuf+1, #0ffh mov LEDBuf+2, #0ffh mov LEDBuf+3, #0ffh mov LEDBuf+4, #0 mov LEDBuf+5, #0 SETB ES SETB EAmov sbuf,ajnb ti,$MLoop: jb HasRcv, RcvData ; 收到数据? call DisplayLED ; 显示 call TestKey ; 有键入? jz MLoop ; 无键入, 继续显示 call GetKey ; 读入键码 通讯口输出键码 LJMP MLoopRcvData: clr HasRcv ; 是 mov a, RcvBuf ; 显示数据 mov b,a anl a,#0fh ; 显示低位 mov dptr, #LEDMap mov LEDBuf+5, a mov a,b swap a ; 显示高位 anl a,#0fh mov LEDBuf+4, a ljmp MLoop六、实验后的心得体会
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2