導航:首頁 > 操作系統 > 單片機計算器匯編

單片機計算器匯編

發布時間:2023-03-30 02:28:35

A. 怎樣用51單片機做計算器啊

1、硬體模擬圖

4、程序源代碼

#include <reg51.h>#include <intrins.h>

#include <ctype.h>

#include <stdlib.h>

#define uchar unsigned char

#define uint unsigned int

uchar operand1[9], operand2[9];

uchar operator;

void delay(uint);

uchar keyscan();

void disp(void);

void buf(uint value);

uint compute(uint va1,uint va2,uchar optor);

uchar code table[] = {0xc0,0xf9,0xa4,0xb0,0x99,

0x92,0x82,0xf8,0x80,0x90,0xff};

uchar dbuf[8] = {10,10,10,10,10,10,10,10};

void delay(uint z)

{

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

uchar keyscan()

{

uchar skey;

P1 = 0xfe;

while((P1 & 0xf0) != 0xf0)

{

delay(3);

while((P1 & 0xf0) != 0xf0)

{

switch(P1)

{

case 0xee: skey = '7'; break;

case 0xde: skey = '8'; break;

case 0xbe: skey = '9'; break;

case 0x7e: skey = '/'; break;

default: skey = '#';

}

while((P1 & 0xf0) != 0xf0)

;

}

}

P1 = 0xfd;

while((P1 & 0xf0) != 0xf0)

{

delay(3);

while((P1 & 0xf0) != 0xf0)

{

switch(P1)

{

case 0xed: skey = '4'; break;

case 0xdd: skey = '5'; break;

case 0xbd: skey = '6'; break;

case 0x7d: skey = '*'; break;

default: skey = '#';

}

while((P1 & 0xf0) != 0xf0)

;

}

}

P1 = 0xfb;

while((P1 & 0xf0) != 0xf0)

{

delay(3);

while((P1 & 0xf0) != 0xf0)

{

switch(P1)

{

case 0xeb: skey = '1'; break;

case 0xdb: skey = '2'; break;

case 0xbb: skey = '3'; break;

case 0x7b: skey = '-'; break;

default: skey = '#';

}

while((P1 & 0xf0) != 0xf0)

;

}

}

P1 = 0xf7;

while((P1 & 0xf0) != 0xf0)

{

delay(3);

while((P1 & 0xf0) != 0xf0)

{

switch(P1)

{

case 0xe7: skey = '$'; break;

case 0xd7: skey = '0'; break;

case 0xb7: skey = '='; break;

case 0x77: skey = '+'; break;

default: skey = '#';

}

while((P1 & 0xf0) != 0xf0)

;

}

}

return skey;

}

void main()

{

uint value1, value2, value;

uchar ckey, cut1 = 0, cut2 = 0;

uchar operator;

uchar i, bool = 0;

init:

buf(0);

disp();

value = 0;

cut1 = cut2 = 0;

bool = 0;

for(i = 0;i < 9;i++)

{

operand1[i] = '';

operand2[i] = '';

}

while(1)

{

ckey = keyscan();

if(ckey != '#')

{

if(isdigit(ckey))

{

switch(bool)

{

case 0:

operand1[cut1] = ckey;

operand1[cut1+1] = '';

value1 = atoi(operand1);

cut1++;

buf(value1);

disp();

break;

case 1:

operand2[cut2] = ckey;

operand2[cut2+1] = '';

value2 = atoi(operand2);

cut2++;

buf(value2);

disp();

break;

default: break;

}

}

else if(ckey=='+'||ckey=='-'||ckey=='*'||ckey=='/')

{

bool = 1;

operator = ckey;

buf(0);

dbuf[7] = 10;

disp();

}

else if(ckey == '=')

{

value = compute(value1,value2,operator);

buf(value);

disp();

while(1)

{

ckey = keyscan();

if(ckey == '$')

goto init;

else

{

buf(value);

disp();

}

}

}

else if(ckey == '$')

{ goto init;}

}

disp();

}

}

uint compute(uint va1,uint va2,uchar optor)

{

uint value;

switch(optor)

{

case '+' : value = va1+va2; break;

case '-' : value = va1-va2; break;

case '*' : value = va1*va2; break;

case '/' : value = va1/va2; break;

default : break;

}

return value;

}

void buf(uint val)

{

uchar i;

if(val == 0)

{

dbuf[7] = 0;

i = 6;

}

else

for(i = 7; val > 0; i--)

{

dbuf[i] = val % 10;

val /= 10;

}

for( ; i > 0; i--)

dbuf[i] = 10;

}

void disp(void)

{

uchar bsel, n;

bsel=0x01;

for(n=0;n<8;n++)

{

P2=bsel;

P0=table[dbuf[n]];

bsel=_crol_(bsel,1);

delay(3);

P0=0xff;

}

}

(1)單片機計算器匯編擴展閱讀:

PROTEUS 是單片機課堂教學的先進助手

PROTEUS不僅可將許多單片機實例功能形象化,也可將許多單片機實例運行過程形象化。前者可在相當程度上得到實物演示實驗的效果,後者則是實物演示實驗難以達到的效果。

它的元器件、連接線路等卻和傳統的單片機實驗硬體高度對應。這在相當程度上替代了傳統的單片機實驗教學的功能,例:元器件選擇、電路連接、電路檢測、電路修改、軟體調試、運行結果等。

課程設計、畢業設計是學生走向就業的重要實踐環節。由於PROTEUS提供了實驗室無法相比的大量的元器件庫,提供了修改電路設計的靈活性、提供了實驗室在數量、質量上難以相比的虛擬儀器、儀表,因而也提供了培養學生實踐精神、創造精神的平台

隨著科技的發展,「計算機模擬技術」已成為許多設計部門重要的前期設計手段。它具有設計靈活,結果、過程的統一的特點。可使設計時間大為縮短、耗資大為減少,也可降低工程製造的風險。相信在單片機開發應用中PROTEUS也能茯得愈來愈廣泛的應用。

使用Proteus 軟體進行單片機系統模擬設計,是虛擬模擬技術和計算機多媒體技術相結合的綜合運用,有利於培養學生的電路設計能力及模擬軟體的操作能力;

在單片機課程設計和全國大學生電子設計競賽中,我們使用 Proteus開發環境對學生進行培訓,在不需要硬體投入的條件下,學生普遍反映,對單片機的學習比單純學習書本知識更容易接受,更容易提高。

實踐證明,在使用 Proteus 進行系統模擬開發成功之後再進行實際製作,能極大提高單片機系統設計效率。因此,Proteus 有較高的推廣利用價值。

B. 用89C51單片機設計4*4矩陣式鍵盤計算器程序 要匯編的

KEYBUF EQU 40H ;鍵號存放單元
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN: MOV KEYBUF,#0 ;初始鍵號設位0,也可以為任意值
MOV R0,#30H ;顯示首地址
MOV R2,#0CH ;計算數據存放單元個數
CLR A
QING: MOV @R0,A ;將數據存放單元清零
INC R0
DJNZ R2,QING
MOV P0,#8FH ;關閉顯示
MOV R1,#30H ;將顯示首地址存放R1里
;===============================================
;五位無符號顯示子程序
DIS1: MOV R0,#30H ;把顯示數據第一位放在R0里
MOV R2,#04H ;把顯示的位碼放在R2里
MOV R3,#05H ;把顯示的長度放在R3里
DIS2: MOV A,@R0
ANL A,#0FH ;屏蔽顯示數據的高四位
MOV B,A
MOV A,R2
ANL A,#0FH ;屏蔽位碼的高四位
SWAP A
ORL A,B
MOV P0,A ;送總顯示數據到P0顯示
LCALL DELY4ms ;調用延時4ms
INC R0 ;取下一個顯示數據
DEC R2
DJNZ R3,DIS2 ;四位顯示晚後重新開始顯示
;===================================================
;鍵盤掃描子程序
WAIT: MOV P1,#0FFH ;P1口送高電平
CLR P1.0 ;第一行清零
MOV A,P1 ;讀P1口
ANL A,#0F0H ;低位屏蔽
XRL A,#0F0H ;判斷低位是否有低電平 ,即判斷是否有按鍵按下
JZ NOKEY1 ;地位有低電平繼續掃描,否者跳到第而行去掃描
LCALL DELY10ms ;延時10ms去抖在進行判斷是否有按鍵按下
MOV A,P1 ;繼續讀P1口
ANL A,#0F0H ;判斷低位是否有低電平
CJNE A,#0E0H,NK1 ;如果掃描數據不為0E0H就轉到NK1
MOV KEYBUF,#0 ;否者判斷為0號鍵
AJMP DK ;轉DK1查表程序
NK1: CJNE A,#0D0H,NK2 ;如果掃描數據不為0D0H就轉到NK2
MOV KEYBUF,#1 ;否者判斷為1號鍵
AJMP DK ;轉DK2查表程序
NK2: CJNE A,#0B0H,NK3 ;如果掃描數據不為0B0H就轉到NK3
MOV KEYBUF,#2 ;否者判斷為2號鍵
AJMP DK ;轉DK3查表程序
NK3: CJNE A,#70H,NK4 ;如果掃描數據不為70H就轉到NK4
LJMP SAN_CHU
NK4: NOP
NOKEY1: MOV P1,#0FFH ;和上面相同
CLR P1.1
MOV A,P1
ANL A,#0F0H
XRL A,#0F0H
JZ NOKEY2
LCALL DELY10MS
MOV A,p1
ANL A,#0F0H
XRL A,#0F0H
JZ NOKEY2
MOV A,P1
ANL A,#0F0H
CJNE A,#0E0H,NK5
MOV KEYBUF,#3
AJMP DK
NK5: CJNE A,#0D0H,NK6
MOV KEYBUF,#4
AJMP DK
NK6: CJNE A,#0B0H,NK7
MOV KEYBUF,#5
AJMP DK
NK7: CJNE A,#70H,NK8
MOV KEYBUF,#10 ;否者判斷為3號鍵
AJMP DK ;轉DK4查表程序
NK8: NOP
NOKEY2: MOV P1,#0FFH
CLR P1.2
MOV A,P1
ANL A,#0F0H
XRL A,#0F0H
JZ NOKEY3
LCALL DELY10MS
MOV A,P1
ANL A,#0F0H
XRL A,#0F0H
JZ NOKEY3
MOV A,P1
ANL A,#0F0H
CJNE A,#0E0H,NK9
MOV KEYBUF,#6
AJMP DK
NK9: CJNE A,#0D0H,NK10
MOV KEYBUF,#7
AJMP DK
NK10: CJNE A,#0B0H,NK11
MOV KEYBUF,#8
AJMP DK
NK11: CJNE A,#70H,NK12
LJMP DENG_HAO
NK12: NOP
NOKEY3: MOV P1,#0FFH
CLR P1.3
MOV A,P1
ANL A,#0F0H
XRL A,#0F0H
JZ NOKEY4
LCALL DELY10MS
MOV A,P1
ANL A,#0F0H
XRL A,#0F0H
JZ NOKEY4
MOV A,P1
ANL A,#0F0H
CJNE A,#0E0H,NK13
LJMP CHU
NK13: CJNE A,#0D0H,NK14
LJMP CHENG
NK14: CJNE A,#0B0H,NK15
LJMP JIAN
NK15: CJNE A,#70H,NK16
LJMP JIA
NK16: NOP
;=======================================================
;查表求鍵值程序
DK: MOV B,#00H
MOV A,KEYBUF ;查表程序 查對應的鍵號數據
MOV DPTR,#TABLE ;把表頭地址放入DPTR
MOVC A,@A+DPTR ;A裡面存放的為鍵號,利用A和表頭地址找到對應的鍵號數據
MOV B,A ;把查到的數據送往顯示單元
INC R1 ;取下一個顯示單元
MOV A,R1
CJNE A,#36H,DKA1 ;判斷顯示單元是否已滿
MOV R1,#35H ;35H,36H單元用於更好的控制五位顯示
AJMP DKA
DKA1: MOV 34H,33H ;按鍵代碼按左移顯示,先按先顯示
MOV 33H,32H
MOV 32H,31H
MOV 31H,30H
MOV 30H,B
DKA: MOV A,P1 ;讀P1口
ANL A,#0F0H ;屏蔽高四位
XRL A,#0F0H ;地位是有低電平
JNZ DKA ;如果有低電平繼續讀P1口,否者向下執行,查找第二行
NOKEY4: LJMP DIS1
;===================================
;功能按鍵功能設定
DENG_HAO:MOV DPTR,#JI_SUAN ;等號鍵功能通過加、減、乘、除設定的偏移量來調用子程序
MOV A,3CH ;3CH存放的為功能程序入口地址偏移量
JMP @A+DPTR ;轉移到按鍵功能程序
JI_SUAN: AJMP JIA1 ;加計運算元程序
AJMP JIAN1 ;減計運算元程序
AJMP CHENG1 ;乘計運算元程序
AJMP CHU ;除計運算元程序
;=======刪除鍵功能
SAN_CHU: ACALL QING_DIS
AJMP DKA
;=======加鍵功能
JIA: MOV 3CH,#00H
ACALL CUN_SHU
ACALL QING_DIS
AJMP DKA
;=======減鍵功能
JIAN: MOV 3CH,#02H
ACALL CUN_SHU
ACALL QING_DIS
AJMP DKA
;=======乘鍵功能
CHENG: MOV 3CH,#04H
ACALL CUN_SHU
ACALL QING_DIS
AJMP DKA
;=======除鍵功能
CHU: MOV 3DH,#06H
ACALL CUN_SHU
ACALL QING_DIS
AJMP DKA

;=================================
;存被加(減、乘、除)數,存放在37H~3BH里
CUN_SHU: MOV 37H,30H ;36H存放的為最低位
MOV 38H,31H
MOV 39H,32H
MOV 3AH,33H
MOV 3BH,34H ;3AH存放的為最高位
RET
;================================
;清除顯示單元
QING_DIS: MOV R1,#30H
QING1: MOV @R1,#00H
INC R1
MOV A,R1
CJNE A,#36H,QING1
MOV R1,#30H
LOP1: RET
;================================
;十進制加法子程序
JIA1:
MOV A,37H ;個位被加數
ADD A,30H ;個位被加數+加數
MOV B,#10 ;十六進制除10轉換成BCD碼
DIV AB
MOV 30H,B ;余數即個位存放在30H
MOV 37H,A ;商存放在37H
MOV A,38H ;十位被加數
ADD A,31H ;十位被加數+加數
ADD A,37H ;加上個位之和的進位
MOV 37H,#00H ;清除37H
MOV B,#10 ;十六進制除10轉換成BCD碼
DIV AB
MOV 31H,B ;余數即十位存放在31H
MOV 38H,A ;商存放在38H
MOV A,39H ;百位計算同十位
ADD A,32H
ADD A,38H
MOV 38H,#00H
MOV B,#10
DIV AB
MOV 32H,B
MOV 39H,A
MOV A,3AH ;千位計算同十位
ADD A,33H
ADD A,39H
MOV 39H,#00H
MOV B,#10
DIV AB
MOV 33H,B
MOV 3AH,A
MOV A,3BH ;萬位計算同十位
ADD A,34H
ADD A,3AH
MOV 3AH,#00H
MOV B,#10
DIV AB
MOV 34H,B
MOV 3BH,#00H
AJMP DKA
;=====================
JIAN1: AJMP DKA
CHENG1: AJMP DKA
CHU1: AJMP DKA
;=============================================
;延時程序和查表表格
DELY4ms: MOV R6,#8 ;延時4毫秒
D1: MOV R7,#248
DJNZ R7,$
DJNZ R6,D1
RET
DELY10ms:MOV R6,#20 ;延時10毫秒
D2: MOV R7,#248
DJNZ R7,$
DJNZ R6,D2
RET
TABLE: DB 07H, 04H, 01H ; / 本表格是以鍵盤為參考 7 8 9 /
DB 08H, 05H, 02H ; * 4 5 6 *
DB 09H, 06H, 03H ; - 1 2 3 -
DB 00H, 00H ;= + 清除 0 = +
END

C. 怎麼用AT89S51單片機匯編語言製作一個十進制加法計算器

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碼帶旅讓進位自身相加,相當於乘2

ADDC 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 ;處理完16bit

RET

;------------------

GETDAT:

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

RET

;------------------

DEALDAT:

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

RET

DEAL01: ;=

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

RET

DEAL02: ;*

DEC A

JNZ DEAL03

MOV A,S_DAT

MOV B,D_DAT

MUL AB

MOV R_DATL,A

MOV R_DATH,B

RET

DEAL03: ;/

MOV A,S_DAT

MOV B,D_DAT

DIV AB

MOV R_DATL,A

MOV R_DATH,#0

RET

;------------------

KEYSEL:

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

RET

;--------------------

GETKEY:

MOV KEYTM,#0

MOV A,KEYSCAN

MOV P3,A

NOP

MOV 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

RET

;--------------------

T0ISR:

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

RET

KV01:

DEC A

JNZ KV02

MOV KEYVAL,#4

RET

KV02:

DEC A

JNZ KV03

MOV KEYVAL,#1

RET

KV03:

DEC A

JNZ KV04

MOV KEYVAL,#10

RET

KV04:

DEC A

JNZ KV05

MOV KEYVAL,#8

RET

KV05:

DEC A

JNZ KV06

MOV KEYVAL,#5

RET

KV06:

DEC A

JNZ KV07

MOV KEYVAL,#2

RET

KV07:

DEC A

JNZ KV08

MOV KEYVAL,#0

RET

KV08:

DEC A

JNZ KV09

MOV KEYVAL,#9

RET

KV09:

DEC A

JNZ KV10

MOV KEYVAL,#6

RET

KV10:

DEC A

JNZ KV11

MOV KEYVAL,#3

RET

KV11:

DEC A

JNZ KV12

MOV KEYVAL,#11 ;=

RET

KV12:

DEC A

JNZ KV13

MOV KEYVAL,#12 ;/

RET

KV13:

DEC A

JNZ KV14

MOV KEYVAL,#13 ;*

RET

KV14:

DEC A

JNZ KV15

MOV KEYVAL,#14 ;-

RET

KV15:

DEC A

JNZ KV16

MOV KEYVAL,#15 ;+

RET

KV16:

MOV KEYVAL,#0FFH

RET

;--------------------

LEDTAB:

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 ;" " 10H

;--------------------

D. 怎麼用51單片機4*4鍵盤實現簡單計算器 就要加減就可以 匯編語言 麻煩可

這是一個用匯編做的計算器,是數碼管顯示的。
KEYVAL EQU30H
KEYTM EQU蔽伏31H
KEYSCAN EQU32H
DAT EQU33H
SCANLED EQU37H
S_DAT EQU38H
D_DAT EQU39H
R_DATL EQU3AH
R_DATH EQU3BH
CALFLAG EQU3CH
FLAG BIT00H
ORG0000H
LJMPMAIN
ORG000BH
LJMPT0ISR
ORG0030H
MAIN:
MOVSP,#5FH
MOVTMOD,#01H
MOV慎嘩TH0,#0D8H
MOVTL0,#0F0H
MOVKEYVAL,#0
MOVP2,#00H
MOVSCANLED,#0
MOV33H,#0H
MOV34H,#0H
MOV35H,#0H
MOV36H,#0H
MOVS_DAT,#0
MOVD_DAT,#0
CLRFLAG
SETBEA
SETBET0
SETBTR0
LOOP:
LCALLKEYSEL
MOVA,KEYVAL
CJNEA,#0FFH,LOOP1
SJMPLOOP
LOOP1:
CJNEA,#11,LOOP2 ;「=」
MOVA,33H
MOVB,#10
MULAB
ADDA,34H
MOVD_DAT,A
LCALLDEALDAT
LCALLHB2
MOVA,R5
ANLA,#0FH
MOV34H,A
MOVA,R5
SWAPA
ANLA,#0FH
MOV33H,A
MOVA,R4
ANLA,#0FH
MOV36H,A
MOVA,R4
SWAPA
ANLA,#0FH
MOV35H,A
SJMPLOOP
LOOP2:
CJNEA,#15,LOOP3 ;「+」
LCALLGETDAT
SJMPLOOP
LOOP3:
CJNEA,#14,LOOP4 ;「-」
MOVCALFLAG,#1
LCALLGETDAT
SJMPLOOP
LOOP4:
CJNEA,#13,LOOP5 ;「*」
MOVCALFLAG,#2
LCALLGETDAT
SJMPLOOP
LOOP5:
CJNEA,#12,LOOP6 ;"/"
MOVCALFLAG,#3
LCALLGETDAT
SJMPLOOP
LOOP6:
CJNEA,#10,LOOP7 ;數字寬並行鍵
LOOP7:
JCLOOP8
LJMPLOOP
LOOP8:
MOV33H,34H
MOV34H,KEYVAL
LJMPLOOP
;------------------
HB2:
MOVR6,R_DATH
MOVR7,R_DATL
CLRA;BCD碼初始化
MOVR3,A
MOVR4,A
MOVR5,A
MOVR2,#10H;轉換雙位元組十六進制整數
HB3:
MOVA,R7;從高端移出待轉換數的一位到CY中
RLCA
MOVR7,A
MOVA,R6
RLCA
MOVR6,A
MOVA,R5;BCD碼帶進位自身相加,相當於乘2
ADDCA,R5
DAA;十進制調整
MOVR5,A
MOVA,R4
ADDCA,R4
DAA
MOVR4,A
MOVA,R3
ADDCA,R3
MOVR3,A;雙位元組十六進制數的萬位數不超過6,不用調整
DJNZR2,HB3;處理完16bit
RET
;------------------
GETDAT:
MOVA,33H
MOVB,#10
MULAB
ADDA,34H
MOVS_DAT,A
MOV33H,#0
MOV34H,#0
MOV35H,#0
MOV36H,#0
RET
;------------------
DEALDAT:
MOVA,CALFLAG
JNZDEAL01
DEAL00: ;+
MOVA,S_DAT
ADDA,D_DAT
MOVR_DATL,A
CLRA
ADDCA,#0
MOVR_DATH,A
RET
DEAL01: ;=
DECA
JNZDEAL02
CLRC
MOVA,S_DAT
SUBBA,D_DAT
MOVR_DATL,A
SUBBA,#0
MOVR_DATH,A
RET
DEAL02: ;*
DECA
JNZDEAL03
MOVA,S_DAT
MOVB,D_DAT
MULAB
MOVR_DATL,A
MOVR_DATH,B
RET
DEAL03: ;/
MOVA,S_DAT
MOVB,D_DAT
DIVAB
MOVR_DATL,A
MOVR_DATH,#0
RET
;------------------
KEYSEL:
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:
LCALLCHGKEY
RET
;--------------------
GETKEY:
MOVKEYTM,#0
MOV A,KEYSCAN
MOV P3,A
NOP
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY
MOVR2,#10
LCALLDELAY
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:
MOVR3,#50
DELAY1:
MOVR4,#100
DJNZR4,$
DJNZR3,DELAY1
DJNZR2,DELAY
RET
;--------------------
T0ISR:
PUSHACC
CLRTR0
MOVTH0,#0D8H
MOVTL0,#0F0H
SETBTR0
MOVDPTR,#LEDTAB
T000: ;數字顯示
MOVR0,#DAT
MOVA,SCANLED
ADDA,R0
MOVR0,A
MOVA,SCANLED
JNZT001
MOVP2,#01H
SJMPT0DIS
T001:
DECA
JNZT002
MOVP2,#02H
SJMPT0DIS
T002:
DECA
JNZT003
MOVP2,#04H
SJMPT0DIS
T003:
MOVP2,#08H
T0DIS:
MOVA,@R0
MOVCA,@A+DPTR
; CPLA
MOVP0,A
INCSCANLED
MOVA,SCANLED
ANLA,#03H
MOVSCANLED,A
POPACC
RETI
;--------------------
CHGKEY:
MOVA,KEYVAL
JZKV16
DECA
JNZKV01
MOVKEYVAL,#7
RET
KV01:
DECA
JNZKV02
MOVKEYVAL,#4
RET
KV02:
DECA
JNZKV03
MOVKEYVAL,#1
RET
KV03:
DECA
JNZKV04
MOVKEYVAL,#10
RET
KV04:
DECA
JNZKV05
MOVKEYVAL,#8
RET
KV05:
DECA
JNZKV06
MOVKEYVAL,#5
RET
KV06:
DECA
JNZKV07
MOVKEYVAL,#2
RET
KV07:
DECA
JNZKV08
MOVKEYVAL,#0
RET
KV08:
DECA
JNZKV09
MOVKEYVAL,#9
RET
KV09:
DECA
JNZKV10
MOVKEYVAL,#6
RET
KV10:
DECA
JNZKV11
MOVKEYVAL,#3
RET
KV11:
DECA
JNZKV12
MOVKEYVAL,#11 ;=
RET
KV12:
DECA
JNZKV13
MOVKEYVAL,#12 ;/
RET
KV13:
DECA
JNZKV14
MOVKEYVAL,#13 ;*
RET
KV14:
DECA
JNZKV15
MOVKEYVAL,#14 ;-
RET
KV15:
DECA
JNZKV16
MOVKEYVAL,#15 ;+
RET
KV16:
MOVKEYVAL,#0FFH
RET
;--------------------
LEDTAB:
DB0C0H ;"0" 00H
DB0F9H ;"1" 01H
DB0A4H ;"2" 02H
DB0B0H ;"3" 03H
DB99H ;"4" 04H
DB92H ;"5" 05H
DB82H ;"6" 06H
DB0F8H ;"7" 07H
DB80H ;"8" 08H
DB90H ;"9" 09H
DB88H ;"A" 0AH
DB83H ;"B" 0BH
DB0C6H ;"C" 0CH
DB0A1H ;"D" 0DH
DB86H ;"E" 0EH
DB8EH ;"F" 0FH
DB0FFH ;"" 10H
;--------------------
END

E. 51單片機為基礎用匯編語言編寫用數碼管顯示一個同時有"加""減""乘""除"法功能的計算器程序,急用參考

ORG 0000H


LJMP MAIN


ORG 0100H


MAIN:MOV SP,#7EH


MOV 22H,#00H


CLR P2.0


CLR P2.3


MOV 20H,#00H


MOV 21H,#00H


MOV 30H, #00H


MOV 31H, #00H


MOV 32H, #00H ;初始化


SU: MOV 7DH,#0FFH


MOV 7EH,#0FFH


MOV 7FH,#0FFH


KEYI:ACALL KS1


CJNE A,#0F0H,LK1


ACALL DIR


AJMP KEYI


LK1:ACALL DIR


ACALL DIR


ACALL KS1


CJNE A, #0F0H,LK2


ACALL DIR


AJMP KEYI


LK2: ACALL KS1


MOV R2,A


ORL A,#0FH


MOV P0,A


ANL A,#0FH


ADD A,R2 ;鍵特徵值


CJNE A,#0EEH,JZHI1


MOV A,#00H


PUSH ACC


JZHI1: CJNE A,#0DEH,JZHI2


MOV A,#01H


PUSH ACC


JZHI2: CJNE A,#0BEH, JZHI3


MOV A,#02H


PUSH ACC


JZHI3: CJNE A,#7EH,JZHI4


MOV A,#03H


PUSH ACC


JZHI4: CJNE A, #0EDH, JZHI5


MOV A,#04H


PUSH ACC


JZHI5: CJNE A,#0DDH, JZHI6


MOV A, #05H


PUSH ACC


JZHI6: CJNE A,#0BDH, JZHI7


MOV A, #06H


PUSH ACC


JZHI7: CJNE A,#07DH, JZHI8


MOV A, #07H


PUSH ACC


JZHI8: CJNE A,#0EBH, JZHI9


MOV A, #08H


PUSH ACC


JZHI9: CJNE A,#0DBH, JZHI10


MOV A, #09H


PUSH ACC


JZHI10: CJNE A,#0BBH, JZHI11


MOV 20H,#01H


JZHI11: CJNE A,#07BH,FAN


MOV 21H, #01H


LCALL GMI


SETB P2.2 ;滅綠燈


LJMP SU ;改密


FAN: MOV A, 81H


CJNE A,#7FH, KEYI


JNB (20H).0, KEYITMP


MOV 20H,#00H


JBC (21H).0,LOOP


POP ACC


CJNE A,32H,NOTE


MOV 7FH,A


POP ACC


CJNE A,31H,NOTE


MOV 7EH,A


POP ACC


CJNE A,30H,NOTE


MOV 7DH,A


CLR P2.2


KEYITMP:LJMP KEYI


NOTE:LCALL BAOJ ;NOT是保留字不能做標號


SUTMP:LJMP SU


BAOJ:MOV SP,#7EH


INC 22H


JNB (22H).1, SUTMP


CLR P2.1


SETB P2.3


ACALL DELY1


CPL P2.1


CPL P2.3


MOV 22H,#00H


RET


GMI:JNB P2.2,SUTMP


LOOP:POP 32H


POP 31H


POP 30H


RET


DIR:MOV R0,#7DH


MOV R3,#01H


LD1: MOV A,@R0


MOV P1,A


MOV P3,R3


LCALL DELY


INC R0


MOV A,R3


JB ACC.2,LD2


RL A


MOV R3,A


SJMP LD1


LD2:RET ;顯示


DELY:MOV R7,#249


DL:DJNZ R7,DL


RET ;1ms延時


DELY1:MOV R5,#200


MOV R4,#50


LOOP1:MOV R3,#248


NOP


LOOP2:DJNZ R3,LOOP2


DJNZ R5,LOOP1


DJNZ R4,LOOP1


RET ;10s延時


KS1:MOV P0,#0F0H


MOV A,P0


ANL A, #0F0H


RET ;鍵是否按下


end


F. 怎樣用51單片機做計算器啊

1、首先第一步就是要進行查找元器件並放入到原理圖中,如下圖所示。



(6)單片機計算器匯編擴展閱讀


電腦模擬:

單片機有了開發系統,隨著單片機的發展開發系統也在不斷發展。 keil是一種先進的單片機集成開發系統。

它代表著匯編語言單片機開發系統的最新發展,首創多項便利技術,將開發的編程/模擬/調試/寫入/加密等所有過程一氣呵成,中間不須任何編譯或匯編。

功能特性:

1、可以模擬63K程序空間,接近64K 的16位地址空間;

2、可以模擬64Kxdata 空間,全部64K 的16位地址空間;

3、可以真實模擬全部32 條IO腳;

4,完全兼容keilC51 UV2 調試環境,可以通過UV2 環境進行單步,斷點, 全速等操作;

5、可以使用C51語言或者ASM匯編語言進行調試 ;

6、可以非常方便地進行所有變數觀察,包括滑鼠取值觀察,即滑鼠放在某 變數上就會立即顯示出它此的值;

7、可選 使用用戶晶振,支持0-40MHZ晶振頻率;

8、片上帶有768位元組的xdata,您可以在模擬時選 使用他們,進行xdata 的模擬;

9、可以模擬雙DPTR 指針;

10、可以模擬去除ALE 信號輸出. ;

11、自適應300-38400bps 的所有波特率通訊;

12、體積非常細小,非常方便插入到用戶板中.插入時緊貼用戶板,沒有連接電纜,這樣可以有效地減少運行中的干擾,避免模擬時出現莫名其妙的故障;

13、模擬插針採用優質鍍金插針,可以有效地防止日久生銹,選擇優質園腳IC插座,保護模擬插針,同時不會損壞目標板上的插座. ;

14,模擬時監控和用戶代碼分離,不可能產生不能模擬的軟故障;

15、RS-232介面不計成本採用MAX202集成電路,串列通訊穩定可靠,絕非一般三極體的簡易電路可比。

功能限制:

模擬器佔用單片機串口及定時器2,與Keil C(PC)通訊,故不支持串口及定時器2 的模擬功能。全速運行時單片機串口及定時器2 可供用戶使用。

使用方法:

1、將模擬器插入需模擬的用戶板的CPU插座中,模擬器由用戶板供電;

2、將模擬器的串列電纜和PC機接好,打開用戶板電源;

3、通過Keil C 的IDE 開發模擬環境UV2 下載用戶程序進行模擬、調試。

G. 單片機匯編語言用部分積左移法算出來的結果與計算器的結果不一致,麻煩有相關經驗的老師幫我看一下謝謝

之前用飛肆納思卡爾的MC9RS08KA4_8單片機做了個電壓採集板辯雹滑,12位精度,基準為4.5V。
上頭點評了一下我的程序,說result = ADCR * 4500/4096;這一句的效率不高,可以用移位法。
下面我把我的程序精簡出來如攜臘下,哪位高手可以用移位法來高效地實現這個程序呢?
word StartConvert(byte channel)
{
int temp;
word result;
ADCSC1 = channel; //選擇通道
while(!ADCSC1_COCO); //轉換是否完成?
result = ADCR * 4500/4096; //計算轉換結果
return result;
}

H. 匯編做一個簡易計算器,51單片機,最好有模擬圖

KEYVALEQU30H

KEYTMEQU31H

KEYSCANEQU32H

DAT EQU33H

SCANLEDEQU37H

S_DATEQU38H

D_DATEQU39H

R_DATLEQU3AH

R_DATHEQU3BH

CALFLAGEQU3CH

FLAGBIT00H

ORG0000H

LJMPMAIN

ORG000BH

LJMPT0ISR

ORG0030H

MAIN:

MOVSP,#5FH

MOVTMOD,#01H

MOVTH0,#0D8H

MOVTL0,#0F0H

MOVKEYVAL,#0

MOVP2,#00H

MOVSCANLED,#0

MOV33H,#0H

MOV34H,#0H

MOV35H,#0H

MOV36H,#0H

MOVS_DAT,#0

MOVD_DAT,#0

CLRFLAG

SETBEA

SETBET0

SETBTR0

LOOP:

LCALLKEYSEL

MOVA,KEYVAL

CJNEA,#0FFH,LOOP1

老伏 SJMPLOOP

LOOP1:

CJNEA,#11,LOOP2;「=」

MOVA,33H

MOVB,#10

MULAB

ADDA,34H

MOVD_DAT,A

LCALLDEALDAT

LCALLHB2

MOVA,R5

ANLA,#0FH

MOV34H,A

MOVA,R5

SWAPA

ANLA,#0FH

MOV33H,A

MOVA,R4

ANLA,#0FH

MOV36H,A

MOVA,R4

SWAPA

ANLA,#0FH

MOV35H,A

SJMPLOOP

LOOP2:

CJNEA,#15,LOOP3;「+」

LCALLGETDAT

SJMPLOOP

LOOP3:

CJNEA,#14,LOOP4;「-」

MOVCALFLAG,#1

LCALLGETDAT

SJMPLOOP

LOOP4:

CJNEA,#13,LOOP5;「*」

MOVCALFLAG,#2

LCALLGETDAT

SJMPLOOP

LOOP5:

CJNEA,#12,LOOP6;"/"

MOVCALFLAG,#3

LCALLGETDAT

SJMPLOOP

LOOP6:

CJNEA,#10,LOOP7 ;數字鍵

LOOP7:

JCLOOP8

LJMPLOOP

LOOP8:

MOV33H,34H

MOV34H,KEYVAL

LJMPLOOP

;------------------

HB2:

MOVR6,R_DATH

MOVR7,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碼帶進位自身相加,相當於乘2

ADDC 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 ;處理完16bit

RET

;------------------

GETDAT:

MOVA,33H

MOVB,#10

MULAB

ADDA,34H

MOVS_DAT,A

MOV33H,#0

MOV34H,#0

MOV35H,#0

侍缺攜 MOV36H,#0

RET

;------------------

DEALDAT:

MOVA,CALFLAG

JNZDEAL01

DEAL00: ;+

MOVA,S_DAT

ADDA,D_DAT

MOVR_DATL,A

CLRA

ADDCA,#0

MOVR_DATH,A

RET

DEAL01: ;=

DECA

JNZDEAL02

CLRC

MOVA,S_DAT

SUBBA,D_DAT

MOVR_DATL,A

扮純 SUBBA,#0

MOVR_DATH,A

RET

DEAL02: ;*

DECA

JNZDEAL03

MOVA,S_DAT

MOVB,D_DAT

MULAB

MOVR_DATL,A

MOVR_DATH,B

RET

DEAL03: ;/

MOVA,S_DAT

MOVB,D_DAT

DIVAB

MOVR_DATL,A

MOVR_DATH,#0

RET

;------------------

KEYSEL:

MOVKEYVAL,#0

MOVKEYSCAN,#0EFH

LCALLGETKEY

MOVA,KEYTM

JZKEYS1

MOVKEYVAL,A

SJMPKEYRTN

KEYS1:

MOVKEYSCAN,#0DFH

LCALLGETKEY

MOVA,KEYTM

JZKEYS2

CLRC

ADDA,#4

MOVKEYVAL,A

SJMPKEYRTN

KEYS2:

MOVKEYSCAN,#0BFH

LCALLGETKEY

MOVA,KEYTM

JZKEYS3

CLRC

ADDA,#8

MOVKEYVAL,A

SJMPKEYRTN

KEYS3:

MOVKEYSCAN,#7FH

LCALLGETKEY

MOVA,KEYTM

JZKEYRTN

CLRC

ADDA,#12

MOVKEYVAL,A

KEYRTN:

LCALLCHGKEY

RET

;--------------------

GETKEY:

MOVKEYTM,#0

MOVA,KEYSCAN

MOVP3,A

NOP

MOVA,P3

ANLA,#0FH

XRLA,#0FH

JZNOKEY

MOVR2,#10

LCALLDELAY

MOVA,P3

ANLA,#0FH

XRLA,#0FH

JZNOKEY

MOVA,P3

ANLA,#0FH

MOVR7,A

SF:

MOVA,P3

ANLA,#0FH

XRLA,#0FH

JNZSF

MOVA,R7

CJNEA,#0EH,NK1

MOVKEYTM,#1

SJMPNOKEY

NK1:

CJNEA,#0DH,NK2

MOVKEYTM,#2

SJMPNOKEY

NK2:

CJNEA,#0BH,NK3

MOVKEYTM,#3

SJMPNOKEY

NK3:

CJNEA,#07H,NOKEY

MOVKEYTM,#4

NOKEY:RET

;--------------------

DELAY:

MOVR3,#50

DELAY1:

MOVR4,#100

DJNZR4,$

DJNZR3,DELAY1

DJNZR2,DELAY

RET

;--------------------

T0ISR:

PUSHACC

CLRTR0

MOVTH0,#0D8H

MOVTL0,#0F0H

SETBTR0

MOVDPTR,#LEDTAB

T000: ;數字顯示

MOVR0,#DAT

MOVA,SCANLED

ADDA,R0

MOVR0,A

MOVA,SCANLED

JNZT001

MOVP2,#01H

SJMPT0DIS

T001:

DECA

JNZT002

MOVP2,#02H

SJMPT0DIS

T002:

DECA

JNZT003

MOVP2,#04H

SJMPT0DIS

T003:

MOVP2,#08H

T0DIS:

MOVA,@R0

MOVCA,@A+DPTR

; CPLA

MOVP0,A

INCSCANLED

MOVA,SCANLED

ANLA,#03H

MOVSCANLED,A

POPACC

RETI

;--------------------

CHGKEY:

MOVA,KEYVAL

JZKV16

DECA

JNZKV01

MOVKEYVAL,#7

RET

KV01:

DECA

JNZKV02

MOVKEYVAL,#4

RET

KV02:

DECA

JNZKV03

MOVKEYVAL,#1

RET

KV03:

DECA

JNZKV04

MOVKEYVAL,#10

RET

KV04:

DECA

JNZKV05

MOVKEYVAL,#8

RET

KV05:

DECA

JNZKV06

MOVKEYVAL,#5

RET

KV06:

DECA

JNZKV07

MOVKEYVAL,#2

RET

KV07:

DECA

JNZKV08

MOVKEYVAL,#0

RET

KV08:

DECA

JNZKV09

MOVKEYVAL,#9

RET

KV09:

DECA

JNZKV10

MOVKEYVAL,#6

RET

KV10:

DECA

JNZKV11

MOVKEYVAL,#3

RET

KV11:

DECA

JNZKV12

MOVKEYVAL,#11;=

RET

KV12:

DECA

JNZKV13

MOVKEYVAL,#12;/

RET

KV13:

DECA

JNZKV14

MOVKEYVAL,#13;*

RET

KV14:

DECA

JNZKV15

MOVKEYVAL,#14;-

RET

KV15:

DECA

JNZKV16

MOVKEYVAL,#15;+

RET

KV16:

MOVKEYVAL,#0FFH

RET

;--------------------

LEDTAB:

DB0C0H;"0"00H

DB0F9H;"1"01H

DB0A4H;"2"02H

DB0B0H;"3"03H

DB99H;"4"04H

DB92H;"5"05H

DB82H;"6"06H

DB0F8H;"7"07H

DB80H;"8"08H

DB90H;"9"09H

DB88H;"A"0AH

DB83H;"B"0BH

DB0C6H;"C"0CH

DB0A1H;"D"0DH

DB86H;"E"0EH

DB8EH;"F"0FH

DB0FFH;""10H

;--------------------

I. 用匯編語言寫一個單片機定時器/計數器的程序

1.以查詢方式工作,每計滿100個脈沖,則取反P1.0口線狀態。


ORG0000H
MOVTMOD,#06H
MOVTH0,#156
MOVTL0,#156
SETBTR0
LP:JNBTF0,LP
CPLP1.0
SJMPLP

END


2.以中斷方式工作,每計滿200個脈沖,則取反P1.0口線狀態。


ORG0000H
SJMPSTART
ORG000BH
CPLP1.0
RETI
START:
MOVTMOD,#06H
MOVTH0,#56
MOVTL0,#56
SETBTR0
MOVIE,#82H
SJMP$

END

J. 求助:關於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

閱讀全文

與單片機計算器匯編相關的資料

熱點內容
安卓手機微信發不出視頻怎麼弄 瀏覽:229
壓縮機專用工具 瀏覽:575
qtcreator可以編譯cp嗎 瀏覽:405
小項目是雲伺服器還是本地好 瀏覽:14
墨痕齋是什麼游戲的伺服器 瀏覽:942
word文件如何壓縮大小 瀏覽:279
遵義聯通伺服器地址是什麼 瀏覽:29
ansys約束命令流 瀏覽:814
解壓軟體電腦版如何下載 瀏覽:791
閃電匕首演算法球 瀏覽:692
linuxredis停止命令 瀏覽:670
大麥賬號怎麼加密 瀏覽:113
穿越火線怎麼找伺服器 瀏覽:526
秘密加密社交軟體app 瀏覽:256
c語言編譯器怎麼找文件 瀏覽:836
數學不好能編程嗎 瀏覽:254
微雲里的視頻加密 瀏覽:41
3大加密貨幣交易平台 瀏覽:647
鈑金激光切割機編程 瀏覽:496
vivo手機手電筒app在哪裡 瀏覽:787