怎麼用AT89S51微控制器組合語言製作十進位制加法計算器

2022-02-09 09:35:28 字數 6759 閱讀 6490

1樓:匿名使用者

keyval equ 30h

keytm equ 31h

keyscan equ 32h

dat equ 33h

scanled equ 37h

s_dat equ 38h

d_dat equ 39h

r_datl equ 3ah

r_dath equ 3bh

calflag equ 3ch

flag bit 00h

org 0000h

ljmp main

org 000bh

ljmp t0isr

org 0030h

main:

mov sp,#5fh

mov tmod,#01h

mov th0,#0d8h

mov tl0,#0f0h

mov keyval,#0

mov p2,#00h

mov scanled,#0

mov 33h,#0h

mov 34h,#0h

mov 35h,#0h

mov 36h,#0h

mov s_dat,#0

mov d_dat,#0

clr flag

setb ea

setb et0

setb tr0

loop:

lcall keysel

mov a,keyval

cjne a,#0ffh,loop1

sjmp loop

loop1:

cjne a,#11,loop2 ;「=」

mov a,33h

mov b,#10

mul ab

add a,34h

mov d_dat,a

lcall dealdat

lcall hb2

mov a,r5

anl a,#0fh

mov 34h,a

mov a,r5

swap a

anl a,#0fh

mov 33h,a

mov a,r4

anl a,#0fh

mov 36h,a

mov a,r4

swap a

anl a,#0fh

mov 35h,a

sjmp loop

loop2:

cjne a,#15,loop3 ;「+」

lcall getdat

sjmp loop

loop3:

cjne a,#14,loop4 ;「-」

mov calflag,#1

lcall getdat

sjmp loop

loop4:

cjne a,#13,loop5 ;「*」

mov calflag,#2

lcall getdat

sjmp loop

loop5:

cjne a,#12,loop6 ;"/"

mov calflag,#3

lcall getdat

sjmp loop

loop6:

cjne a,#10,loop7 ;數字鍵loop7:

jc loop8

ljmp loop

loop8:

mov 33h,34h

mov 34h,keyval

ljmp loop

hb2:

mov r6,r_dath

mov r7,r_datl

clr  a   ;bcd碼初始化

mov  r3,a

mov  r4,a

mov  r5,a

mov  r2,#10h   ;轉換雙位元組十六進位制整數hb3:

mov  a,r7   ;從高階移出待轉換數的一位到 cy 中rlc  a

mov  r7,a

mov  a,r6

rlc  a

mov  r6,a

mov  a,r5   ;bcd碼帶進位自身相加,相當於乘2addc  a,r5

da  a   ;十進位制調整

mov  r5,a

mov  a,r4

addc  a,r4

da  a

mov  r4,a

mov  a,r3

addc  a,r3

mov  r3,a   ;雙位元組十六進位制數的萬位數不超過6,不用調整djnz  r2,hb3   ;處理完16bitretgetdat:

mov a,33h

mov b,#10

mul ab

add a,34h

mov s_dat,a

mov 33h,#0

mov 34h,#0

mov 35h,#0

mov 36h,#0

retdealdat:

mov a,calflag

jnz deal01

deal00: ;+

mov a,s_dat

add a,d_dat

mov r_datl,a

clr a

addc a,#0

mov r_dath,a

retdeal01: ;=

dec a

jnz deal02

clr c

mov a,s_dat

subb a,d_dat

mov r_datl,a

subb a,#0

mov r_dath,a

retdeal02: ;*

dec a

jnz deal03

mov a,s_dat

mov b,d_dat

mul ab

mov r_datl,a

mov r_dath,b

retdeal03: ;/

mov a,s_dat

mov b,d_dat

div ab

mov r_datl,a

mov r_dath,#0

retkeysel:

mov keyval,#0

mov keyscan,#0efh

lcall getkey

mov a,keytm

jz keys1

mov keyval,a

sjmp keyrtn

keys1:

mov keyscan,#0dfh

lcall getkey

mov a,keytm

jz keys2

clr c

add a,#4

mov keyval,a

sjmp keyrtn

keys2:

mov keyscan,#0bfh

lcall getkey

mov a,keytm

jz keys3

clr c

add a,#8

mov keyval,a

sjmp keyrtn

keys3:

mov keyscan,#7fh

lcall getkey

mov a,keytm

jz keyrtn

clr c

add a,#12

mov keyval,a

keyrtn:

lcall chgkey

retgetkey:

mov keytm,#0

mov a,keyscan

mov p3,a

nopmov a,p3

anl a,#0fh

xrl a,#0fh

jz nokey

mov r2,#10

lcall delay

mov a,p3

anl a,#0fh

xrl a,#0fh

jz nokey

mov a,p3

anl a,#0fh

mov r7,a

sf:mov a,p3

anl a,#0fh

xrl a,#0fh

jnz sf

mov a,r7

cjne a,#0eh,nk1

mov keytm,#1

sjmp nokey

nk1:

cjne a,#0dh,nk2

mov keytm,#2

sjmp nokey

nk2:

cjne a,#0bh,nk3

mov keytm,#3

sjmp nokey

nk3:

cjne a,#07h,nokey

mov keytm,#4

nokey: ret

delay:

mov r3,#50

delay1:

mov r4,#100

djnz r4,$

djnz r3,delay1

djnz r2,delay

rett0isr:

push acc

clr tr0

mov th0,#0d8h

mov tl0,#0f0h

setb tr0

mov dptr,#ledtab

t000: ;數字顯示

mov r0,#dat

mov a,scanled

add a,r0

mov r0,a

mov a,scanled

jnz t001

mov p2,#01h

sjmp t0dis

t001:

dec a

jnz t002

mov p2,#02h

sjmp t0dis

t002:

dec a

jnz t003

mov p2,#04h

sjmp t0dis

t003:

mov p2,#08h

t0dis:

mov a,@r0

movc a,@a+dptr

; cpl a

mov p0,a

inc scanled

mov a,scanled

anl a,#03h

mov scanled,a

pop acc

reti

chgkey:

mov a,keyval

jz kv16

dec a

jnz kv01

mov keyval,#7

retkv01:

dec a

jnz kv02

mov keyval,#4

retkv02:

dec a

jnz kv03

mov keyval,#1

retkv03:

dec a

jnz kv04

mov keyval,#10

retkv04:

dec a

jnz kv05

mov keyval,#8

retkv05:

dec a

jnz kv06

mov keyval,#5

retkv06:

dec a

jnz kv07

mov keyval,#2

retkv07:

dec a

jnz kv08

mov keyval,#0

retkv08:

dec a

jnz kv09

mov keyval,#9

retkv09:

dec a

jnz kv10

mov keyval,#6

retkv10:

dec a

jnz kv11

mov keyval,#3

retkv11:

dec a

jnz kv12

mov keyval,#11 ;=

retkv12:

dec a

jnz kv13

mov keyval,#12 ;/

retkv13:

dec a

jnz kv14

mov keyval,#13 ;*

retkv14:

dec a

jnz kv15

mov keyval,#14 ;-

retkv15:

dec a

jnz kv16

mov keyval,#15 ;+

retkv16:

mov keyval,#0ffh

retledtab:

db 0c0h ;"0" 00h

db 0f9h ;"1" 01h

db 0a4h ;"2" 02h

db 0b0h ;"3" 03h

db 99h ;"4" 04h

db 92h ;"5" 05h

db 82h ;"6" 06h

db 0f8h ;"7" 07h

db 80h ;"8" 08h

db 90h ;"9" 09h

db 88h ;"a" 0ah

db 83h ;"b" 0bh

db 0c6h ;"c" 0ch

db 0a1h ;"d" 0dh

db 86h ;"e" 0eh

db 8eh ;"f" 0fh

db 0ffh ;" " 10hend

at89s51微控制器內部包含哪些主要邏輯功能部件各部分的功

微控制器 microcontrollers 是一種bai積體電路晶片,du是採用zhi超大規模積體電路技術把具有dao資料處理能回 力的 處理器答cpu 隨機儲存器ram 只讀儲存器rom 多種i o口和中斷系統 定時器 計數器等功能 可能還包括顯示驅動電路 脈寬調製電路 模擬多路轉換器 a d轉換...

51微控制器混合程式設計,51微控制器程式設計時彙編和C語言如何結合?

51微控制器程式設計時彙編和c語言如何結合?51系列微控制器混合程式設計時候 c語言定義的變數如何傳遞到組合語言?10 一般建議在組合語言裡定義變數,c語言的變數受很多因素影響,不一定都可以傳遞給彙編。大部分c語言全域性變數可以直接在彙編中使用,區域性變數不是特別熟悉不要亂用,容易受到優化的影響。一...

AT89C51微控制器和8051微控制器引腳是否相同?還有哪些相同點

相同,只不過at上多了一些第二功能 理論上是可以的,它包含了8051了。都是51系列的 我現在還用8031的原理相簿呢 肯定是可以的,沒有問題 at89c51微控制器和8051微控制器一樣嗎 mcs 51微控制器是指bai美國intel公司生產的一系列du微控制器的總稱。zhi這一系列包dao含80...