;===================程序说明====================== /* 该程序就是从串口发送一串字符: COUNT DATA1 DATA2 …… COUNT:要显示的字符个数 DATA1 DATA2……是要显示的字符 如:05 00 01 02 03 04 则单片机数码管上显示 0 1 2 3 4 值得注意的是:数码管的扫描显示,发送数据与显示数据的冲突 */
程序源代码如下: DATA_OK BIT 01H ; 数据准备好 RECE BIT 02H ;允许接收 RC EQU 42H ;接收数据 计数 DC EQU 40H ;显示数据计数 RP EQU R0 ;数据接收指针 REI EQU 41H ;接收数据寄存器 COUNT EQU 30H ;显示的数据个数 DATA1 EQU 31H ;第一个数据 ; ………… ; 其他数据 ; ORG 0000H JMP MAIN ORG 0023H JMP INT_SERAIL ORG 0030H ;======================串口中断服务子程序=================== INT_SERAIL: PUSH PSW PUSH ACC JNB RI, L2 CLR RI JNB RECE, EXIT ;不允许接收 MOV A,RC CJNE A,#0,L1 ;接收数据个数 CLR DATA_OK ;开始接收数据 INC RC ;数据计数加一 MOV COUNT,SBUF JMP EXIT L1: MOV A,RC CJNE A, COUNT, L3 ;数据是否接收完毕 MOV @RP,SBUF ;接收最后一个数据 MOV RC,#0 ;接收完以后数据计数清0 MOV RP,#DATA1 ;指针重定位 SETB DATA_OK ;可以显示数据 CLR RECE ;不能接收数据,除非一轮显示完成 JMP EXIT L3: MOV @RP,SBUF INC RP INC RC JMP EXIT L2: CLR TI EXIT: POP ACC POP PSW RETI ;===================== MAIN ================================= ;初始化 MAIN: MOV SP,#50H ;堆栈 MOV TMOD,#20H ;串口初始化 MOV SCON,#50H MOV TH1,#0F3H MOV TL1,#0F3H SETB TR1 ;中断初始化 SETB EA SETB ES SETB RECE ;位定义初始化 CLR DATA_OK MOV RC ,#0 ;RAM,寄存器初始化 MOV DC, #0 MOV RP, #DATA1 MAINLOOP: JNB DATA_OK, MAINLOOP ; 若没有数据准备好泽则不显示数据 MOV DC, COUNT ; MOV R1, #DATA1 ; r1做数据显示的指针 INC DC ; 边界处理 CALL DISPLAY ; 显示 SETB RECE ; 一轮显示完以后可以再次发送别的数据 JMP MAINLOOP ;======================显示子程序============================= DISPLAY: DJNZ DC, DIS1 RET DIS1: MOV A, @R1 MOV DPTR,#TALBE MOVC A,@A+DPTR MOV P1,A MOV A,DC CJNE A,#8,DIS2 CLR P3.4 CLR P3.3 CLR P3.2 CALL DELAY ;显示一个字符后延时一段时间 INC R1 JMP DISPLAY DIS2: CJNE A,#7, DIS3 CLR P3.4 CLR P3.3 SETB P3.2 CALL DELAY INC R1 JMP DISPLAY DIS3: CJNE A,#6, DIS4 CLR P3.4 SETB P3.3 CLR P3.2 CALL DELAY INC R1 JMP DISPLAY DIS4: CJNE A,#5, DIS5 CLR P3.4 SETB P3.3 SETB P3.2 CALL DELAY INC R1 JMP DISPLAY DIS5: CJNE A,#4, DIS6 SETB P3.4 CLR P3.3 CLR P3.2 CALL DELAY INC R1 JMP DISPLAY DIS6: CJNE A,#3, DIS7 SETB P3.4 CLR P3.3 SETB P3.2 CALL DELAY INC R1 JMP DISPLAY DIS7: CJNE A,#2, DIS8 SETB P3.4 SETB P3.3 CLR P3.2 CALL DELAY INC R1 JMP DISPLAY DIS8: CJNE A,#1, DIS9 SETB P3.4 SETB P3.3 SETB P3.2 CALL DELAY INC R1 JMP DISPLAY DIS9: RET
DELAY:MOV R6,#10H L6: MOV R7,#0FFH L7: DJNZ R7,L7 DJNZ R6,L6 RET TALBE: DB 0C0H,0F9H,0A4H,0B0H DB 099H,092H,082H,0F8H DB 080H,090H END 这个程序大约1个小时就搞定了,下载到板子上也是一次成功,终于感觉到流程图的神奇魅力!建议大家在写程序之前一定先画流程图,虽然看上去时间花得比较多,其实恰恰相反,如果你没有画流程图,在程序写完之后,除非你非常有经验,心思非常缜密,否则你会发现你花在调试程序上的时间将是你写程序所花时间的几倍甚至上十倍。而流程图的魅力正在于此,他可以很方便地查错,同时也训练了你的思维能力! |