當前位置:編程學習大全網 - 編程語言 - 求助:關於80C51單片機簡易計算器設計的程序,要求是匯編語言。謝謝哈

求助:關於80C51單片機簡易計算器設計的程序,要求是匯編語言。謝謝哈

ORG 0000H

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

  • 上一篇:比賽路演主持詞
  • 下一篇:《花人》內容簡介
  • copyright 2024編程學習大全網