问题遇到的现象和发生背景
问题相关代码,请勿粘贴截图
LED_0 EQU 30H ;千分位
LED_1 EQU 31H ;百分位
LED_2 EQU 32H ;十分位
LED_3 EQU 33H ;个位
ADC EQU 35H
CLOCK BIT P1.4 ;定义0808时钟位
ST BIT P1.5
EOC BIT P1.6
OE BIT P1.7
ORG 0000H
LJMP START
ORG 000BH
LJMP INT_T0
ORG 30H
START: MOV LED_0,#00H
MOV LED_1,#00H
MOV LED_2,#00H
MOV DPTR,#TABLE ;表格数值赋到DPTR
MOV TMOD,#02H ;定时器选择方式2
MOV TH0,#0F5H ;防止数码管数位闪动,可设定的置为小于等于245的数
MOV TL0,#00H
MOV IE,#82H ;开T0中断
SETB TR0 ;T0开始计数
WAIT: CLR ST
SETB ST ;上升沿清零SAR(SAR用来在A/D转化过程中存放暂态数字量)
CLR ST ;下降沿启动ADC工作
JNB EOC,$ ;等待转换结果
SETB OE ;ADC输出
MOV ADC,P2 ;读取AD转换结果
CLR OE
MOV A,ADC
MOV R7,A ;R7储存AD转换后的结果
MOV LED_3,#00H ;清空个位
MOV LED_2,#00H ;清空十分位
MOV A,#00H
LOOP1: ADD A,#20H ;一位二进制码对应1000mV
DA A ;结果转换成BCD码
JNC LOOP2 ;Cy为0跳转,Cy为1继续执行
MOV R4,A ;R4储存千分分位、百分位
INC LED_2 ;十分位加1
MOV A,LED_2
CJNE A,#0AH,LOOP4 十分位位不为10跳转,为10继续执行
MOV LED_2,#00H ;十分位置0
INC LED_3 ;个位加1
LOOP4: MOV A,R4
LOOP2: DJNZ R7,LOOP1 ;R7减1不为0跳转,为0继续执行
ACALL BTOD1
LCALL DISP ;调用显示子程序
LJMP WAIT
ORG 0200H
BTOD1: MOV R6,A ;R6储存R7为0后的A的值
ANL A,#0F0H ;R6与11110000B后赋给A
MOV R5,#4
LOOP3: RR A
DJNZ R5,LOOP3
MOV LED_1,A ;A右移4次后赋给百分位
MOV A,R6
ANL A,#0FH
MOV LED_0,A ;R6与00001111B后赋给千分位
RET
INT_T0: CPL CLOCK ;提供0808时钟信号
RETI
DISP: ;显示子程序
MOV A,LED_0
MOVC A,@A+DPTR
CLR P1.3 ;千分位显示
MOV P0,A
LCALL DELAY ;数值显示
SETB P1.3
MOV A,LED_1
MOVC A,@A+DPTR
CLR P1.2 ;百分位显示
MOV P0,A
LCALL DELAY ;数值显示
SETB P1.2
MOV A,LED_2
MOVC A,@A+DPTR
CLR P1.1 ;十分位显示
MOV P0,A
LCALL DELAY ;数值显示
SETB P1.1
MOV A,LED_3
MOVC A,@A+DPTR
ADD A,#80H ;显示小数点
CLR P1.0 ;个位显示
MOV P0,A
LCALL DELAY ;数值显示
SETB P1.0
RET
DELAY: MOV R6,#10 ;延时5ms
D1: MOV R7,#250
DJNZ R7,$
DJNZ R6,D1
RET
TABLE: DB 3FH,06H,5BH,4FH,66H ;共阴数码管7段值
DB 6DH,7DH,07H,7FH,6FH
END