ORG 0000H SJMP DISPLAY ORG 0003H LJMP BUTTON ; 外部0中断入口地址 ORG 000BH LJMP DINGSHI ; 定时中断T0入口地址 ORG 0030H ; LED显示程序为主程序 DISPLAY: SETB EA ; 打开中断总开关 SETB EX0 ; 打开外部中断0开关 SETB IT0 ; 打开外部中断0下降沿触发 MOV TMOD,#51H ; 设置定时工作方式 MOV TL0,#0FFH ; 设置定时初值 MOV TH0,#0FFH MOV TH1,#00H T1清零 MOV TL1,#00H SETB P3.5 置T1为输入方式 JB P3.5,$ 等待低电平 MOV IE,#88H CPU开中断,T0开中断 SETB TR0 启动T0定时 SETB TR1 启动T1计数 MOV SP,#30H 设置堆栈指针 CLR P0.5 CLR P0.6 CLR P0.7 MOV DPTR, TAB ; 夜晶显示的字符首地址 MOV R0,#00H ; 脉宽的初值 MOV R3,#00H MOV R4,#00H MOV 60H,#200 MOV 70H,#200 LP1: LCALL DELAY DJNZ 60H,LP1 MOV 60H,#200 CLR TR1 停止T1计数 MOV 31H,TH1 将T1计数值送31H,30H MOV A 31H MOV B,#10 A小,B送10 DIV AB 除,商在A中,余数在B中 MOV 50H,A 十位送50H MOV 51H,B 个位位送51H MOV R1,#50H 显示缓冲区首地址如R1 MOV R2,#00DH 首位显示字入R2 DISC: MOV A,@R1 查段码,待查BCD码送A中 MOV DPTR,#TAB 段码表首地址送DPTR MOVC A,@A+DPTR 查段码指令 MOV P1,#A 段码送入P1 口 LCALL DELAY 延时,使视觉暂留,延时1ms INC R1 指向下一个显示单元 MOV A,R2 判断位轮流显示完 JNB ACC.0,DEND 2位完,转结束 RR A 2位未完,右移使下一显示控制口为0 MOV R2,A AJMP DISC 2位未完,继续显示 DEND:RET 2位完,程序借宿 ORG 2000H DINGSHI: ; 定时中断服务程序 CPL P0.7 JNB P0.7,Z1 ; 周期一定 MOV A,#0FFH SUBB A,R0 MOV TH0,A SETB TR0 RETI Z1: MOV TH0,R0 ; 脉宽 SETB TR0 RETI BUTTON: ; 从控制键盘中读取操作命令 PUSH ACC CLR EX0 CLR EA INC R7 ; MOV A,#0FFH MOV P2,A MOV A,P2 JNB ACC.7,AA0 JNB ACC.6,KK0 JNB ACC.5,ZZ JNB ACC.4,FF JNB ACC.3,WW0 AJMP QQ AA0: CJNE R0,#0FFH,AA1 ; 加速操作(相等顺序执行) AJMP QQ AA1: MOV A,R0 ADD A,#5 MOV R0,A AJMP QQ KK0: CJNE R0,#00H,MM ; 减速操作(相等顺序执行) AJMP QQ MM: MOV A,R0 SUBB A,#5 MOV R0,A AJMP QQ QQ: SETB EX0 LCALL DELAY LCALL DELAY LCALL DELAY SETB EA POP ACC RETI ZZ: SETB P0.5 ; 正转操作 CLR P0.6 LCALL DELAY LCALL DELAY LCALL DELAY SETB EX0 SETB EA POP ACC RETI FF: CLR P0.5 ; 反转操作 SETB P0.6 LCALL DELAY LCALL DELAY LCALL DELAY SETB EX0 SETB EA POP ACC RETI WW0: CLR P0.5 ; 停止操作 CLR P0.6 LCALL DELAY LCALL DELAY LCALL DELAY SETB EX0 SETB EA POP ACC RETI TAB:DB 3FH 06H 5BH 4FH 66H 6DH 7DH 07H 7FH 6FH “0” “1” “2” “3” “4” “5” “6” “7” “8” “9” DELAY: MOV R5,#50 延时5ms DL7: MIV R6,#50 DL6: DJNZ R6,DL6 DJNZ R5,DL7 RET
|