OE EQU P3.0
EOC EQU P3.1
ST EQU P3.2
CLK EQU P3.4
SHU EQU 30H
SHU_L EQU 31H
SHU_H EQU 32H
TEMP EQU 33H
PRI EQU 40H
PRI_CU EQU 43H
KEY_ADRESS EQU 50H
PREST EQU 51H
SUBX EQU 52H
TEMP_PRICE EQU 53H
DONE EQU 57H
MUL_1 EQU 58H
MUL_2 EQU 5CH
MUL_3 EQU 61H
MUL_OUT EQU 65H
PRE EQU 6BH
PRE_M EQU 6CH
DEV EQU 6DH
DEV_M EQU 6EH
ORG 0000H
AJMP INIT
ORG 000BH ;定时器T0
CPL CLK ;取反
RETI
ORG 0013H
LJMP KEY_INT1
ORG 0100H
INIT: ;初始化
MOV SP,#70H
MOV SHU,#0
MOV TEMP,#0
MOV TEMP+1,#0
MOV TEMP+2,#0
MOV TEMP+3,#0
MOV TEMP+4,#0
MOV TEMP+5,#0
MOV TEMP+6,#0
MOV PREST,#0
MOV DONE,#1
MOV PRI,#00H
MOV PRI+1,#01H
MOV PRI+2,#00H
MOV PRE,#02H
MOV DEV,#00H
MOV TMOD,#02H ;T0方式2
MOV TH0,#0FEH ;设初值(这个脉冲供给adc芯片)
MOV TL0,#00H
SETB IT1 ;int1为跳沿触发
SETB PX1 ;int1为高优先级
MOV P1,#0FH ;行线为1,列线为0
MOV IE,#86H ;开总中断和T0中断和INT1中断允许
SETB TR0 ;开定时器
MOV A,#7FH
MOV P3,A
SCAN_DATA: ;读取ADC结果子程序
CLR ST ;给ADC开始信号
SETB ST
CLR ST
M0: JNB EOC,M0 ;为0则循环等待
SETB OE ;为1,转换结束,放开内部锁存通路
MOV A,#0FFH ;准双向口做通用I/O,先写入1
MOV P2,A
M1: MOV A,P2 ;把转换结果读进来
MOV SHU,A ;转换结果存到30H
CLR OE ;关闭内部锁存通道
NEXT: ;转换数据及显示
LCALL CHANGE ;转换子函数
MOV R3,#60
ROUNDDISP:
LCALL DISP ;显示子函数
DJNZ R3,ROUNDDISP
LJMP SCAN_DATA ;重新开始ad转换
KEY_INT1: ;中断处理程序
PUSH ACC
PUSH PSW
ACALL KEYSCAN
SS2: LCALL PREST_ADRESS ;由PREST求现态首地址
MOV R3,#0FDH
SS1: INC R3
INC R3
INC R3
MOV A,R3
MOVC A,@A+DPTR
INC A
JZ SS3
DEC A
CJNE A,KEY_ADRESS,SS1
SS3: INC R3
MOV A,R3
MOVC A,@A+DPTR
MOV PREST,A
INC R3
MOV A,R3
MOVC A,@A+DPTR
MOV SUBX,A
LCALL SUB_DO ;执行子程序
MOV A,PREST
JZ SS2 ;下态为0自动再查一次表
MOV P1,#0FH
POP PSW
POP ACC
RETI
KEYSCAN:MOV P1,#0FH ;获取键码
MOV A,P1
ANL A,#0FH
MOV B,A
MOV P1,#0F0H
MOV A,P1
ANL A,#0F0H
ORL A,B
CJNE A,#0FFH,KEYPRO
RET
KEYPRO:MOV B,A
MOV DPTR,#KEYVALUE
MOV R3,#0FFH
KEY1:INC R3
MOV A,R3
MOVC A,@A+DPTR
CJNE A,B,KEY2
MOV A,R3
MOV KEY_ADRESS,A
RET
KEY2:CJNE A,#10H,KEY1
RET
PREST_ADRESS:MOV R3,PREST ;由PREST求现态首地址的子程序
CJNE R3,#00H,PP1
MOV DPTR,#PREST_0
PP1: CJNE R3,#01H,PP2
MOV DPTR,#PREST_1
PP2: CJNE R3,#02H,PP3
MOV DPTR,#PREST_2
PP3: CJNE R3,#03H,PP4
MOV DPTR,#PREST_3
PP4: CJNE R3,#04H,PP5
MOV DPTR,#PREST_4
PP5: CJNE R3,#05H,PP6
MOV DPTR,#PREST_5
PP6: CJNE R3,#06H,PP7
MOV DPTR,#PREST_6
PP7: CJNE R3,#07H,PP8
MOV DPTR,#PREST_7
PP8: CJNE R3,#08H,PP9
MOV DPTR,#PREST_8
PP9: CJNE R3,#09H,PP10
MOV DPTR,#PREST_9
PP10: CJNE R3,#0AH,PP11
MOV DPTR,#PREST_10
PP11: RET
SUB_DO: MOV R3,SUBX
CJNE R3,#01H,SSS2
LJMP SUB_1
SSS2: CJNE R3,#02H,SSS3
LJMP SUB_2
SSS3: CJNE R3,#03H,SSS4
LJMP SUB_3
SSS4: CJNE R3,#04H,SSS5
LJMP SUB_4
SSS5: CJNE R3,#05H,SSS6
LJMP SUB_5
SSS6: CJNE R3,#06H,SSS7
LJMP SUB_6
SSS7: CJNE R3,#07H,SSS8
LJMP SUB_7
SSS8: CJNE R3,#08H,SSS9
LJMP SUB_8
SSS9: CJNE R3,#09H,SSS10
LJMP SUB_9
SSS10: CJNE R3,#0AH,SSS11
LJMP SUB_10
SSS11: CJNE R3,#0BH,SSS12
LJMP SUB_11
SSS12: CJNE R3,#0CH,SSS13
LJMP SUB_12
SSS13: CJNE R3,#0DH,SSS14
LJMP SUB_13
SSS14: LJMP SUB_14
FINISH: RET
SUB_1:MOV TEMP+3,#0AH
MOV TEMP+4,#0BH
MOV TEMP+5,#0CH
MOV TEMP+6,#10H
MOV DONE,#0
LJMP FINISH
SUB_2:MOV TEMP+3,#0AH
MOV TEMP+4,#0BH
MOV TEMP+5,#0DH
MOV TEMP+6,#10H
MOV DONE,#0
LJMP FINISH
SUB_3:MOV TEMP+3,#0EH
MOV TEMP+4,#0DH
MOV TEMP+5,#0FH
MOV TEMP+6,#10H
MOV DONE,#0
LJMP FINISH
SUB_4:MOV TEMP+3,#10H
MOV TEMP+4,#10H
MOV TEMP+5,#10H
MOV R3,#0FFH
CHABIAO: INC R3
MOV DPTR,#TAB2
MOV A,R3
MOVC A,@A+DPTR
CJNE A,KEY_ADRESS,CHABIAO
MOV TEMP+6,R3
MOV DONE,#0
LJMP FINISH
SUB_5: MOV TEMP+3,#10H
MOV TEMP+4,#10H
MOV A,TEMP+6
MOV TEMP+5,A
MOV R3,#0FFH
CHABIAO1: INC R3
MOV DPTR,#TAB2
MOV A,R3
MOVC A,@A+DPTR
CJNE A,KEY_ADRESS,CHABIAO1
MOV TEMP+6,R3
MOV DONE,#0
LJMP FINISH
SUB_6:MOV A,TEMP+6
ADD A,#11H
MOV TEMP+6,A
MOV DONE,#0
LJMP FINISH
SUB_7:MOV A,TEMP+6
ADD A,#11H
MOV TEMP+6,A
MOV DONE,#0
LJMP FINISH
SUB_8: MOV A,TEMP+5
MOV TEMP+4,A
MOV A,TEMP+6
MOV TEMP+5,A
MOV R3,#0FFH
CHABIAO2: INC R3
MOV DPTR,#TAB2
MOV A,R3
MOVC A,@A+DPTR
CJNE A,KEY_ADRESS,CHABIAO2
MOV TEMP+6,R3
MOV DONE,#0
LJMP FINISH
SUB_9:MOV A,TEMP+4
CLR CY
SUBB A,#10H
JZ ZERO
MOV A,TEMP+4
MOV PRI,A
RETURNZERO:
MOV A,TEMP+5
CLR CY
SUBB A,#11H
MOV PRI+1,A
MOV A,TEMP+6
MOV PRI+2,A
MOV DONE,#1
LJMP FINISH
SUB_10:MOV DONE,#0
LJMP FINISH
SUB_11:MOV TEMP+3,#10H
MOV TEMP+4,#10H
MOV TEMP+5,#10H
MOV R3,#0FFH
CHABIAO3: INC R3
MOV DPTR,#TAB2
MOV A,R3
MOVC A,@A+DPTR
CJNE A,KEY_ADRESS,CHABIAO3
MOV PRE_M,R3
MOV TEMP+6,R3
MOV DONE,#0
LJMP FINISH
SUB_12:MOV TEMP+3,#10H
MOV TEMP+4,#10H
MOV TEMP+5,#10H
MOV R3,#0FFH
CHABIAO4: INC R3
MOV DPTR,#TAB2
MOV A,R3
MOVC A,@A+DPTR
CJNE A,KEY_ADRESS,CHABIAO4
MOV DEV_M,R3
MOV TEMP+6,R3
MOV DONE,#0
LJMP FINISH
SUB_13: MOV A,PRE_M
MOV PRE,A
MOV DONE,#1
LJMP FINISH
SUB_14: MOV A,DEV_M
MOV DEV,A
MOV DONE,#1
LJMP FINISH
ZERO:MOV PRI,#00H
LJMP RETURNZERO
DISP: ;循环显示子程序
MOV R0,#TEMP
MOV R2,#00H
DISP1: MOV A,R2
MOV DPTR,#TAB1
MOVC A,@A+DPTR ;查表,控制位选
MOV P2,A
MOV A,@R0
CJNE R2,#0,NODP
MOV DPTR,#TAB_DP
RETURN1: MOVC A,@A+DPTR ;查表,获取段码
MOV P0,A
MOV R5,#5
ACALL DELAY ;延时
INC R0
INC R2 ;加1,下一位数码管
CJNE R2,#7,DISP1 ;未显示完一轮,循环
MOV P0,#00H ;显示完一轮,重置
RET
NODP:MOV DPTR,#TAB
LJMP RETURN1
CHANGE: ;数据转换子程序
MOV A,SHU
MOV B,#100 ;除法计算时,用到B寄存器
DIV AB
MOV TEMP,A ;百位放到TEMP(因为8位adc最大256)
MOV A,B
MOV B,#10
DIV AB
MOV TEMP+1,A ;十位放到下一地址
MOV TEMP+2,B ;个位
PRICE: ;算价格
MOV A,PRI+2
MOV PRI_CU,A
LCALL MUL1
MOV A,TEMP_PRICE+3
MOV MUL_1+3,A
MOV A,TEMP_PRICE+2
MOV MUL_1+2,A
MOV A,TEMP_PRICE+1
MOV MUL_1+1,A
MOV A,TEMP_PRICE
MOV MUL_1,A
MOV A,PRI+1
MOV PRI_CU,A
LCALL MUL1
MOV A,TEMP_PRICE+3
MOV MUL_2+3,A
MOV A,TEMP_PRICE+2
MOV MUL_2+2,A
MOV A,TEMP_PRICE+1
MOV MUL_2+1,A
MOV A,TEMP_PRICE
MOV MUL_2,A
MOV A,PRI
MOV PRI_CU,A
LCALL MUL1
MOV A,TEMP_PRICE+3
MOV MUL_3+3,A
MOV A,TEMP_PRICE+2
MOV MUL_3+2,A
MOV A,TEMP_PRICE+1
MOV MUL_3+1,A
MOV A,TEMP_PRICE
MOV MUL_3,A
MOV A,MUL_1+3
MOV MUL_OUT+5,A
MOV A,MUL_1+2
ADD A,MUL_2+3
MOV B,#10
DIV AB
MOV MUL_OUT+4,B
JNZ JINWEI3
LOCAL6:MOV A,MUL_1+1
ADD A,MUL_2+2
ADD A,MUL_3+3
ADD A,R3
MOV R3,#00H
MOV B,#10
DIV AB
MOV MUL_OUT+3,B
JNZ JINWEI4
LOCAL7:MOV A,MUL_1
ADD A,MUL_2+1
ADD A,MUL_3+2
ADD A,R3
ADD A,DEV
MOV R3,#00H
MOV B,#10
DIV AB
MOV MUL_OUT+2,B
JNZ JINWEI5
LOCAL8:MOV A,MUL_2
ADD A,MUL_3+1
ADD A,R3
MOV R3,#00H
MOV B,#10
DIV AB
MOV MUL_OUT+1,B
JNZ JINWEI6
LOCAL9:MOV A,MUL_3
ADD A,R3
MOV MUL_OUT,A
LCALL MAKEDONE
RET
JINWEI3:MOV R3,A
LJMP LOCAL6
JINWEI4:MOV R3,A
LJMP LOCAL7
JINWEI5:MOV R3,A
LJMP LOCAL8
JINWEI6:MOV R3,A
LJMP LOCAL9
MAKEDONE: MOV A,DONE
JZ NODONE
MOV A,PRE
CJNE A,#00H,PRE1
MOV A,MUL_OUT+2
MOV TEMP+6,A
MOV A,MUL_OUT+1
MOV TEMP+5,A
MOV A,MUL_OUT
MOV TEMP+4,A
MOV A,#10H
MOV TEMP+3,A
LJMP NODONE
PRE1: CJNE A,#01H,PRE2
MOV A,MUL_OUT+3
MOV TEMP+6,A
MOV A,MUL_OUT+2
ADD A,#11H
MOV TEMP+5,A
MOV A,MUL_OUT+1
MOV TEMP+4,A
MOV A,MUL_OUT
MOV TEMP+3,A
LJMP