导航:首页 > 操作系统 > 单片机计算器汇编

单片机计算器汇编

发布时间: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

阅读全文

与单片机计算器汇编相关的资料

热点内容
魔兽60宏命令大全 浏览:473
php志愿者网站源码 浏览:870
贸易pdf 浏览:495
dbug命令 浏览:351
开逛app如何加好友 浏览:958
ftpdos命令下载文件 浏览:75
华为如何打开语音服务器 浏览:242
python中的idle 浏览:1000
五轴联动数控编程 浏览:965
换一台电脑如何远程云服务器 浏览:132
阿里云怎么买云服务器 浏览:664
java提取文字 浏览:97
阿里云服务器同人账号问题 浏览:420
5分钟解压轴题 浏览:341
安卓桌面二级文件夹 浏览:188
eps文档加密 浏览:261
手机怎么做pdf 浏览:162
ug曲面pdf 浏览:279
液化气还是压缩气 浏览:950
阿里云公共ntp服务器地址 浏览:991