START:MOV 78H,#0 ;初始化:78H放0的段碼,其余放熄滅碼
MOV 79H,#10
MOV 7AH,#10
MOV 7BH,#10
MOV 7CH,#10
MOV 7DH,#10
MOV R5, #0 ;R5是按鍵次數,初始置0
MOV 30H,#0 ;30H是功能鍵存放單元,置為0
MOV 40H,#0 ;40H單元初始置為0
MOV 41H,#0 ;41H單元初始置為0
LOOP:LCALL DIR
LCALL KEY
INC R5
;散轉程序,判斷按下的是哪個鍵
S1:CJNE A,#10,S2 ;不是"+"鍵,跳到S2
LJMP FUN ;是"+"鍵,跳到FUN
S2:CJNE A,#11,S3 ;不是"-"鍵,跳到S3
LJMP FUN ;是"-"鍵,跳到FUN
S3:CJNE A,#12,S4 ; 不是"*"鍵,跳到S4
LJMP FUN ; 是"*"鍵,跳到FUN
S4:CJNE A,#13,S5 ; 不是"/"鍵,跳到S5
LJMP FUN ; 是"/"鍵,跳到FUN
S5:CJNE A,#14,S6 ; 不是"="鍵,跳到S6
LJMP FUN ;是"="鍵,跳到FUN
S6:CJNE A,#15,N1 ; 不是"CL"鍵,跳到N1
LJMP START ; 是"CL"鍵,跳到START
N1:CJNE R5,#1,N2 ;判斷第幾次按鍵
LJMP D11
N2:CJNE R5,#2,N3
LJMP T2
N3:CJNE R5,#3,N4
LJMP T3
N4:CJNE R5,#4,N5
LJMP T4
N5:CJNE R5,#5,N6
LJMP T5
N6:CJNE R5,#6,START
LJMP T6
D11:MOV R4,A
MOV 78H,A ;輸入值送顯示個位緩存
MOV 79H,#10
MOV 7AH,#10
MOV 7BH,#10
MOV 7CH,#10
MOV 7DH,#10
LJMP LOOP
T2:MOV R7,A
MOV B,#10
MOV A,R4
MUL AB
ADD A,R7
MOV R4,A
MOV 7AH,#10
MOV 7BH,#10
MOV 7CH,#10
MOV 7DH,#10
MOV 79H, 78H ;個位到十位
MOV 78H,R7 ;新數為個位
LJMP LOOP
T3:MOV R7,A
MOV B,#10
MOV A,R4
MUL AB
ADD A,R7
MOV R4,A
MOV 7BH,#10
MOV 7CH,#10
MOV 7DH,#10
MOV 7AH,79H ;十位到百位
MOV 79H,78H ;個位到十位
MOV 78H,R7 ; 新數為個位
LJMP LOOP
T4:MOV R7,A
MOV B,#10
MOV A,R4
MUL AB
ADD A,R7
MOV R4,A
MOV 7CH,#10
MOV 7DH,#10
MOV 7BH,7AH
MOV 7AH,79H
MOV 79H,78H
MOV 78H,R7
LJMP LOOP
T5:MOV R7,A
MOV B,#10
MOV A,R4
MUL AB
ADD A,R7
MOV R4,A
MOV 7DH,#10
MOV 7CH,7BH
MOV 7BH,7AH
MOV 7AH,79H
MOV 79H,78H
MOV 78H,R7
LJMP LOOP
T6:MOV R7,A
MOV B,#10
MOV A,R4
MUL AB
ADD A,R7
MOV R4,A
MOV 7DH,7CH
MOV 7CH,7BH
MOV 7BH,7AH
MOV 7AH,79H
MOV 79H,78H
MOV 78H,R7
LJMP LOOP
MOV 7CH,7BH
MOV 7BH,7AH
MOV 7AH,79H
MOV 79H,78H
MOV 78H,R7
LJMP LOOP
FUN:MOV 78H,#10
MOV 79H,#10
MOV 7AH,#10
MOV R0,30H ;與上次功能鍵交換
MOV 30H,A
MOV A,R0
CJNE A,#10,FUN1 ;判斷功能鍵
LJMP ADDY ;"+"
FUN1:CJNE A,#11,FUN2
LJMP SUBT ;"-"
FUN2:CJNE A,#12,FUN3
LJMP MULT ;"*"
FUN3:CJNE A,#13,FUN4
LJMP DIVI ;"/"
FUN4:CJNE A,#14,FUN5 ;首次按功能鍵,即A=#0
LJMP EQUA ;"="
FUN5:MOV 40H,R4 ;保存第壹個數
MOV R5,#0 ;按鍵次數清零
LJMP BCD ;將其拆為bcd碼,以便後來將其顯示
OF:LJMP START ;溢出處理
ADDY:MOV A,40H ;第壹個數送累加器
ADD A,R4 ;第壹個數加第二個數
JB CY,OF ;溢出
MOV 40H,A ;存本次結果
MOV R5,#0 ;按鍵次數清零
LJMP BCD
SUBT:MOV A,40H
SUBB A,R4
JB CY,OF
MOV 40H,A
MOV R5,#0
LJMP BCD
MULT:MOV A,40H
MOV B,A
MOV A,R4
MUL AB
JB OV,OF
MOV 40H,A
MOV R5,#0
LJMP BCD
DIVI:MOV A,R4
MOV B,A
MOV A,40H
DIV AB
JB OV,OF
MOV 40H,A
MOV R5,#0
LJMP BCD
EQUA:MOV R5,#0
LJMP BCD
BCD:MOV B,#10
MOV A,40H ;結果送累加器
DIV AB ;結果除10
MOV 41H,A ;暫存"商"
MOV A,B ;取個位數
MOV 78H,A ;個位數送顯示緩存
MOV A,41H
JZ RETURN ;結果是壹位數,返回LOOP
MOV B,#10
MOV A,41H
DIV AB
MOV 41H,A
MOV A,B
MOV 79H,A ;十位送顯示緩存
MOV A,41H
JZ RETURN ;結果是二位數,返回LOOP
MOV 7AH,A ;百位數送顯示緩存
RETURN:LJMP LOOP
;動態顯示子程序
DIR:MOV DPTR,#TAB ; 數碼管譯碼表首址
MOV R0,#78H ;待顯緩沖區個位地址
MOV A,#0FEH ; 個位位選信號
MOV R1,A
LD1:MOV A,@R0
MOVC A,@A+DPTR ;查表
MOV P2,R1 ;***陽極管字位選擇送到P2口
MOV P0,A ;字段碼送P0口
LCALL DELAY1ms ;調延時1ms 子程序
INC R0 ;R0指向下壹模塊
MOV A,R1 ;
JNB ACC.5,LD2 ;判斷是否發完6個數
RL A ;指向下壹個位
MOV R1,A ;位選信號存回R3
SJMP LD1 ;跳去再顯示下壹個數
LD2:RET ;發完6個數就返回
TAB:DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H,80H,90H,0FFH ;***陽極譯碼表
DELAY1ms:MOV R6,#2
LOOP1:MOV R7,#248
NOP
LOOP2:DJNZ R7,LOOP2
DJNZ R6,LOOP1
RET
KEY:LCALL KS ;調用檢測按鍵子程序
JNZ K1 ;有鍵按下繼續
LCALL DELAY2 ;無鍵按調用延時去抖
ACALL DIR ;調用動態顯示
AJMP KEY ;返回繼續檢測按鍵
K1:LCALL DELAY2 ;有鍵按下延時去抖動
LCALL KS ;再調用檢測按腱子程序
JNZ K2 ;確認有按鍵進行下壹步
ACALL DIR ;調用動態顯示
AJMP KEY ;無鍵按下返回繼續檢測
K2:MOV R2,#0EFH ;將掃描值送入R2暫存
MOV R3,#00H ;將第壹列值送入R3暫存
K3:MOV P1,R2 ;將R2值送入P1口
L0:JB P1.0,L1 ;P1.0等於1跳轉到L1
MOV A,#00H ;將第壹行值送入ACC
AJMP LK ;跳轉到鍵值處理程序
L1:JB P1.1,L2 ;P1.1等於1跳轉到L2
MOV A,#04H ;將第二行的行值送入ACC
AJMP LK ;跳轉到鍵值處理程序
L2:JB P1.2,L3 ;P1.2等於1跳轉到L3
MOV A,#08H ;將第三行行值送入ACC
AJMP LK ;跳轉到鍵值處理程序
L3:JB P1.3,NEXT ;P1.3等於1跳轉到NEXT處
MOV A,#0CH ;將第四行行值送入ACC
LK:ADD A,R3 ;行值與列值相加後的鍵值送入A
PUSH ACC ;將A中的值送入堆棧暫存
K4:LCALL DELAY2 ;調用延時去抖程序
LCALL KS ;調用按鍵檢測程序
JNZ K4 ;按鍵沒有松開繼續返回檢測
POP ACC ;將堆棧值送入ACC
MOV DPTR,#KEYTAB
MOVC A,@A+DPTR
RET
NEXT:INC R3 ;列值加壹
MOV A,R2 ;R2值送入A
JNB ACC.7,KEY ;掃描完至KEY處進行下壹掃描
RL A ;掃描未完將值左移壹位進行下壹列掃描
MOV R2,A ;將ACC值送入R2暫存
AJMP K3 ;跳轉到K3繼續
KS:MOV P1,#0FH ;將P1口高四位置0低四位置1
MOV A,P1 ;讀P1口
XRL A,#0FH ;將A中的值與A中的值相異或
RET ;子程序返回
KEYTAB:DB 1,2,3,10,4,5,6,11,7,8,9,12,15,0,14,13 ;鍵值表
DELAY2:MOV R6,#2H ;延時去抖動子程序
LP1:MOV R7,#0FAH
LP2:DJNZ R7,LP2
DJNZ R6,LP1
RET
END