ORG 0000H
SJMP MAIN
ORG 000BH
LJMP DVT0 ;定时器T0中断
ORG 0030H
MAIN:
MOV SP ,#50H ;设置堆栈区
MOV 31H,#0
MOV 30H,#0 ;计数单元清零
MOV 7AH,#10
MOV 7BH,#10
MOV 7CH,#10
MOV 7DH,#10 ;复位状态字型码送缓冲区
MOV 01H,#14H
MOV TMOD,#51H ;设置T0、T1工作方式字
MOV TH0,#3CH
MOV TL0,#0B0H
MOV TH1,#0
MOV TL1,#0 ;T0、T1置初值
LOOP1:
LCALL DISPLAY ;重复显示、查键
LCALL KEY
CLR C
CJNE A,#0FH,LOOP2
LOOP2:
JNC LOOP1
CJNE A,#00H,LOOP3 ;启动键没被按下
SETB ET0
SETB TR0
SETB EA
SETB TR1
LJMP LOOP1
LOOP3:
CJNE A,#01H,LOOP4 ;停止键没被按下
CLR TR1
CLR TR0
CLR ET0
CLR EA
LJMP LOOP1
LOOP4:
CJNE A,#02H,LOOP1 ;复位键没被按下 .
LJMP MAIN
DVT0:
PUSH PSW ;T0中断程序
PUSH ACC ;相关内容入栈保护
MOV TH0,#3CH
MOV TL0,#0B0H ;T0重装初值
DJNZ 01H,RTN ;1s定时未到
MOV 01H,#14H
CLR ET0
CLR TR1
CLR EA
CLR TR0
MOV 31H,TH1
MOV 30H,TL1
MOV TH1,#0
MOV TL1,#0 ;计数器T1清零,准备下一轮计数
LCALL HEX_BCD
LCALL DISPLAY
SETB ET0
SETB TR1
SETB EA
SETB TR0
RTN:
POP ACC
POP PSW
RETI
HEX_BCD: ;数码转化子程序
PUSH PSW
SETB RS0
SETB RS1
MOV A,30H
MOV B,#60
MUL AB
MOV 31H,B
MOV 30H,A
LCALL EXCH ;二进制到BCD码的转化
MOV A,33H ;以下是将转化后的BCD码存入相应缓冲区
ANL A,#0FH
MOV 7BH,A
MOV A,33H
SWAP A
ANL A,#0FH
MOV 7AH,A
MOV A,32H
ANL A,#0FH
MOV 7DH,A
MOV A,32H
SWAP A
ANL A,#0FH
MOV 7CH,A
CLR RS0
CLR RS1
POP PSW
RET EXCH:
MOV 40H,#0
MOV 41H,#0
MOV R7,#10H
LP1:
MOV R0,#30H
MOV R6,#2
CLR C
LP2:
MOV A,@R0
RLC A
MOV @R0,A
INC R0
DJNZ R6,LP2
MOV R1,#41H
MOV R5,#02H
LP3:
MOV A,@R1
ADDC A,@R1
DA A
MOV @R1,A
DEC R1
DJNZ R5,LP3
DJNZ R7,LP1
MOV 33H,40H
MOV 32H,41H
RET KEY:
PUSH PSW ; 按键扫描子程序
JB P3.0,X1
LCALL DISPLAY ;延时去抖
JB P3.0,X1
MOV A,#0
SJMP X4
X1:
JB P3.1,X2
LCALL DISPLAY
JB P3.1,X2
MOV A,#1
SJMP X4
X2:
JB P3.2,X3
LCALL DISPLAY
JB P3.2,X3
MOV A,#2
SJMP X4
X3:
MOV A,#0FH
X4:
POP PSW
RET
DISPLAY:
PUSH ACC ;显示子程序
PUSH PSW ;A,PSW入栈
SETB RS1
SETB RS0
MOV DPTR,#TAB
MOV R0,#7AH
MOV R6,#0FEH ;扫描显示初始化
NEXT:
MOV A,@R0 ;四位轮流扫描显示
MOVC A,@A+DPTR
MOV P0,A
MOV A,R6
MOV P2,A
LCALL DELAY
MOV P2,#0FFH ;显示中的消隐处理
INC R0
RL A
MOV R6,A
CJNE R6,#0EFH,NEXT
POP PSW
POP ACC
RET
DELAY:
MOV R4,#4 ;软件延时1ms
DLY:
MOV R7,#123
DJNZ R7,$
DJNZ R4,DLY
RET
TAB:
DB 0C0H ;0 ;字形编码表
DB 0F9H ;1
DB 0A4H ;2
DB 0B0H ;3
DB 99H ;4
DB 92H ;5
DB 82H ;6
DB 0F8H ;7
DB 80H ;8
DB 90H ;9
DB 0BFH ;-
END
这是不是你自己写的程序?
把里面的全角标点逗号(,)、分号(;)都换过来,变成半角符号。可以使用“查找、替换”方法,免得有遗漏。
CLR RS0
CLR RS1
POP PSW
PSW入栈保护,RS0、RS1没有必要再恢复。PSW出栈就已经恢复了。
欢迎光临 (http://www.51hei.com/bbs/) | Powered by Discuz! X3.1 |