導航:首頁 > 操作系統 > 基於單片機的簡易計算器設計

基於單片機的簡易計算器設計

發布時間:2022-12-18 23:24:51

㈠ 怎樣用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 有較高的推廣利用價值。

㈡ 基於MSP430單片機的簡易計算器設計

這是我以前的,你可以看看:
第六頁 開始:模擬+程序
http://wenku..com/view/2447d32d915f804d2b16c18e.html

㈢ 怎麼用51單片機做簡易計算器

先製作出數字顯示電路,還有相應數字按鍵電路,需要幾位數就用幾個數碼管,然後根據計算邏輯編寫出相應C程序

㈣ 單片機簡易計算器設計的程序

展開全部
首先會按鍵掃描,再會數碼管或液晶屏顯示,基本上可以了
程序
流程:
掃描按鍵(最多5次,最大65536,簡易計算器嗎)獲得一個數,再掃描按鍵獲得加減乘除符號
掃描按鍵獲得另一個數
掃描按鍵獲得「=」,顯示計算結果
由於程序比較長,且與硬體有關,因此只貼出主程序:
void
main()
{
while(1)
{
c=1;
while(c<6)//輸入第1個5
位數
{
keyval=keyscan();
if(keyval<10)
{
switch(c)
{
case
1:b1=keyval;
break;
case
2:b2=keyval;
break;
case
3:b3=keyval;
break;
case
4:b4=keyval;
break;
case
5:b5=keyval;
break;
}
c++;
}
display1(b1,b2,b3,b4,b5);
}
while(c==6)
//輸入計算符號
{
keyval=keyscan();
if((keyval>=10)&&(keyval<14))
//10-13代表加減乘除
4種符號
{
d=keyval;
}
c=1;
display3(d);
}
while(c<6)
//輸入第2個5
位數
{
keyval=keyscan();
if(keyval<10)
{
switch(c)
{
case
1:d1=keyval;
break;
case
2:d2=keyval;
break;
case
3:d3=keyval;
break;
case
4:d4=keyval;
break;//

case
5:d5=keyval;
break;
}
c++;
}
display2(d1,d2,d3,d4,d5);
}
bb=
b1*10000+b2*1000+b3*100+b4*10+b5;//5個按鍵數值合成一個數
dd=d1*10000+d1*1000+d3*100+d4*10+d5;
//另外5個按鍵數值也合成一個數
while(keyval!=14)
//等待按下"="
{
keyval=keyscan();
}
Delay1ms(10);
switch(d)
{
case
10:ee=bb+dd;
break;//+
case
11:
flag1=1;//結果是負數的標志,先假定是負數
if(bb>=dd)
{
ee=bb-dd;
//結果不是負數
flag1=0;
}
else
ee=dd-bb;
//減數和被減數交換
break;
case
12:ee=bb*dd;
break;//*可能會溢出
case
13:ee=bb/dd;
//除法小數部分會丟失,保留2位
ff=bb%dd;
fd1=ff*10/dd;
fd2=ff*100/dd%10;
break;
}
f10=ee/1000000000%10;
f9=ee/100000000%10;
f8=ee/10000000%10;
f7=ee/1000000%10;
f6=ee/100000%10;
f5=ee/10000%10;
f4=ee/1000%10;
f3=ee/100%10;
f2=ee/10%10;
f1=ee%10;
display4(f10,f9,f8,f7,f6,f4,f4,f3,f2,f1,fd1,fd2);
while(keyval!=15)
{
keyval=keyscan();
}
b1=0;b2=0;b3=0;b4=0;b5=0;
d1=0;d2=0;d3=0;d4=0;d5=0;
bb=0;dd=0;ee=0;
init2();
}
}

㈤ 基於51單片機的簡易計數器設計c程序

#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code ledtab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0-9
uchar scanled;
uchar disdat[4];
uint ss,time;
sbit led=P1^0;
void dischg()
{
disdat[3]=ss%10;
disdat[2]=(ss/10)%10;
disdat[1]=(ss/100)%10;
disdat[0]=(ss/1000)%10;
}
void t0isr() interrupt 1
{
ss++;
dischg();
}
void t1isr() interrupt 3//顯示
{
TH1=(65536-5000)/256;
TL1=(65536-5000)%256;
P2=1<<scanled;
P0=~ledtab[disdat[scanled]];
scanled++;
scanled%=4;
time++;
if(time>100){time=0;led=~led;}
}
main()

{
TMOD=0x16;
TH0=0xff;
TL0=0xff;
TH1=(65536-5000)/256;
TL1=(65536-5000)%256;
TR1=1;
TR0=1;
ET0=1;
ET1=1;
EA=1;
led=0;
scanled=0;
ss=0;
dischg();
while(1);
}

㈥ 單片機簡易計算器的設計要求用2*8矩陣鍵盤,程序如下,求大神把下面4*4鍵盤程序改成2*8的,可追加分數

下面這個 Keyscan(void) 程序,是我以前寫的。

uchar Keyscan(void)
{
uchar i, j, temp, Buffer[4] = {0xef, 0xdf, 0xbf, 0x7f};
for(j = 0; j < 4; j++) { //循環四次
P2 = Buffer[j]; //在P1高四位分別輸出一個低電平
temp = 0x01; //計劃先判斷P1.0位
for(i = 0; i < 4; i++) { //循環四次
if(!(P2 & temp)) //從P1低四位,截取1位
return (i + j * 4); //返回取得的按鍵值
temp <<= 1; //判斷的位,左移一位
} }
return 16; //判斷結束,沒有鍵按下,返回16
}

程序,用了一個 8 位的並口:P1,或 P2,都行。

改成2*8的,就要使用兩個介面了,用什麼?樓主應該指定出來。

㈦ 單片機的簡易計算器

單片機計算器
基本功能介紹:
簡單的加減乘除的運算。
時間顯示功能,而且能實現計算器模塊和時間模塊之間的任意切換。
按鍵音卻換功能。
原理;
多功能單片機計算器是一個實現加減乘除的和時間功能的計算器,主要的硬體組成由,一個AT89s52單片機晶元,一個LED液晶(1602液晶),一個4*4鍵盤,和4個特殊功能按鍵。
一個時鍾晶元(DS1302),一個蜂鳴器。
單個硬體模塊個的介紹
AT89S52:
主要控制晶元,它是由8kflash,256BRAM,6個中斷源,詳情參考AT89S52的技術文檔.
1602液晶
1602液晶模塊內部的字元發生存儲器(CGROM)已經存儲了160個不同的點陣字元圖形,這些字元有:阿拉伯數字、英文字母的大小寫、常用的符號等,每一個字元都有一個固定的代碼,比如大寫的英文字母「A」的代碼是01000001B(41H),顯示時模塊把地址41H中的點陣字元圖形顯示出來,我們就能看到字母「A」,而且可以實現一些復雜的字元操作:1:清顯示,游標復位到地址00H位置,2:游標和顯示模式設置 游標移動方向,高電平右移,低電平左移,屏幕上所有文字是否左移或者右移。高電平表示有效,低電平則無效 3:顯示開關控制,控制整體顯示的開與關,高電平表示開顯示,低電平表示關顯示,控制游標的開與關,高電平表示有游標,低電平表示無游標,控制游標是否閃爍,高電平閃爍,低電平不閃爍4:游標或顯示移位,高電平時移動顯示的文字,低電平時移動游標5:功能設置命令 DL:高電平時為4位匯流排,低電平時為8位匯流排 N:低電平時為單行顯示,高電平時雙行顯示 F: 低電平時顯示5x7的點陣字元,高電平時顯示5x10的點陣字元(高低電平在相應的指令上實現),詳情可參考1602的技術文檔。
1602採用標準的16腳介面: 第1腳:VSS為地電源第2腳:VDD接5V正電源第3腳:V0為液晶顯示器對比度調整端,接正電源時對比度最弱,接地電源時對比度最高,對比度過高時會產生「鬼影」,使用時可以通過一個10K的電位器調整對比度第4腳:RS為寄存器選擇,高電平時選擇數據寄存器、低電平時選擇指令寄存器。第5腳:RW為讀寫信號線,高電平時進行讀操作,低電平時進行寫操作。當RS和RW共同為低電平時可以寫入指令或者顯示地址,當RS為低電平RW為高電平時可以讀忙信號,當RS為高電平RW為低電平時可以寫入數據。第6腳:E端為使能端,當E端由高電平跳變成低電平時,液晶模塊執行命令。 第7~14腳:D0~D7為8位雙向數據線。 第15~16腳:空腳。
1602液晶和單片機的接法

4*4鍵盤,和4個特殊功能按鍵

K(切換鍵) No(復位鍵)
(時間設置鍵) C(清除鍵) +
1 2 3 —
4 5 6 *
7 8 9 %(除)
—/+ 0 。 =
前4個為特殊功能鍵,
後十六個採用鍵盤掃描接法,

掃描原理:
首先給p3口賦11111110(0xfe),然後再讀取p3口的值,如果為11101110(0xee)說明是第一排第一個被按下,如果是11011110(0xde)說明是第一排第二個被按下,如果是10111110(0xbe)說明是第一排第三個被按下,如果是0111110(0x7e)說明是第一排第四個被按下,
判斷二三四排的按鍵,都採用同樣的方法,只要分別給P3口賦不同的值即可,在讀取p3口的值,在判斷。用這樣的方法即可實現4*4鍵盤的掃描,只要有鍵按下,就可以知道是那個鍵按下,通過這種方法可大大節省單片機的io口的資源。詳情可參考網上的鍵盤掃描原理
時鍾晶元(DS1302)
DS1302 是DALLAS 公司推出的涓流充電時鍾晶元內含有一個實時時鍾/日歷和31 位元組靜態RAM ,通過簡單的串列介面與單片機進行通信實時時鍾/日歷電路提供秒分時日日期月年的信息每月的天數和閏年的天數可自動調整時鍾操作可通過AM/PM 指示決定採用24 或12 小時格式DS1302 與單片機之間能簡單地採用同步串列的方式進行通信僅需用到三個口線1 RES 復位2 I/O 數據線3 SCLK串列時鍾時鍾/RAM 的讀/寫數據以一個位元組或多達31 個位元組的字元組方式
實時時鍾具有能計算2100 年之前的秒分時日日期星期月年的能力還有閏年調整的能力(詳情可參考DS1302的技術文檔
管腳描述
X1 X2 32.768KHz 晶振管腳
GND 地
RST 復位腳
I/O 數據輸入/輸出引腳
SCLK 串列時鍾
Vcc1,Vcc2 電源供電管腳

計算器工作大概流程

㈧ 基於51單片機的簡易計算器設計,急

//功能 0 1 2 3 4 5 6 7 8 9 + - × ÷ = 清零 表3-1 3.2 計算器的軟體設計

#include<reg51.h> //頭文件

#define uint unsigned int //

#define uchar unsigned char

sbit lcden=P2^3; //定義引腳

sbit rs=P2^4;

sbit rw=P2^0;

sbit busy=P0^7;

char i,j,temp,num,num_1;

long a,b,c; //a,第一個數 b,第二個數 c,得數

float a_c,b_c;

uchar flag,fuhao;//flag表示是否有符號鍵按下,fuhao表徵按下的是哪個符號

uchar code table[]={ 7,8,9,0, 4,5,6,0, 1,2,3,0, 0,0,0,0};

uchar code table1[]={

7,8,9,0x2f-0x30,

4,5,6,0x2a-0x30,

1,2,3,0x2d-0x30,

0x01-0x30,0,0x3d-0x30,0x2b-0x30};

void delay(uchar z) // 延遲函數

{

uchar y;

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

for(y=0;y<110;y++);

} void check() // 判斷忙或空閑

{

do{

P0=0xFF;

rs=0; //指令

rw=1; //讀

lcden=0; //禁止讀寫

delay(1); //等待,液晶顯示器處理數據

lcden=1; //允許讀寫

}while(busy==1); //判斷是否為空閑,1為忙,0為空閑

}

void write_com(uchar com) // 寫指令函數

{

P0=com; //com指令付給P0口

rs=0;

rw=0;

lcden=0;

check();

lcden=1;

}

void write_date(uchar date) // 寫數據函數

{

P0=date;

rs=1;

rw=0;

lcden=0;

check();

lcden=1;

}

void init() //初始化

{

num=-1;

lcden=1; //使能信號為高電平

write_com(0x38); //8位,2行

write_com(0x0c); //顯示開,游標關,不閃爍*/

write_com(0x06); //增量方式不移位 顯竟獗暌貧 柚?

write_com(0x80); //檢測忙信號

write_com(0x01); //顯示開,游標關,不閃爍

num_1=0;

i=0;

j=0;

a=0; //第一個參與運算的數

b=0; //第二個參與運算的數

c=0;

flag=0; //flag表示是否有符號鍵按下,

fuhao=0; // fuhao表徵按下的是哪個符號

}

void keyscan() // 鍵盤掃描程序

{

P3=0xfe;

if(P3!=0xfe)

{

delay(20); //延遲20ms

if(P3!=0xfe)

{

temp=P3&0xf0;

switch(temp)

{

case 0xe0:num=0;

break;

case 0xd0:num=1;

break;

case 0xb0:num=2;

break;

case 0x70:num=3;

break;

}

}

while(P3!=0xfe);

if(num==0||num==1||num==2)//如果按下的是'7','8'或'9

{

if(j!=0)

{

write_com(0x01);

j=0;

}

if(flag==0)//沒有按過符號鍵

{

a=a*10+table[num];

}

else//如果按過符號鍵

{

b=b*10+table[num];

}

}

else//如果按下的是'/'

{

flag=1;

fuhao=4;//4表示除號已按

}

i=table1[num];

write_date(0x30+i);

}

P3=0xfd;

if(P3!=0xfd)

{

delay(5);

if(P3!=0xfd)

{

temp=P3&0xf0;

switch(temp)

{

case 0xe0:num=4;

break;

case 0xd0:num=5;

break;

case 0xb0:num=6;

break;

case 0x70:num=7;

break;

}

}

while(P3!=0xfd);

if(num==4||num==5||num==6&&num!=7)//如果按下的是'4','5'或'6'

{

if(j!=0)

{

write_com(0x01);

j=0;

}

if(flag==0)//沒有按過符號鍵

{

a=a*10+table[num];

}

else//如果按過符號鍵

{

b=b*10+table[num];

}

}

else//如果按下的是'/'

{

flag=1;

fuhao=3;//3表示乘號已按

}

i=table1[num];

write_date(0x30+i);

}

P3=0xfb; if(P3!=0xfb)

{

delay(5);

if(P3!=0xfb)

{

temp=P3&0xf0;

switch(temp)

{

case 0xe0:num=8;

break;

case 0xd0:num=9;

break;

case 0xb0:num=10;

break;

case 0x70:num=11;

break;

}

}

while(P3!=0xfb);

if(num==8||num==9||num==10)//如果按下的是'1','2'或'3'

{

if(j!=0)

{

write_com(0x01);

j=0;

}

if(flag==0)//沒有按過符號鍵

{

a=a*10+table[num];

}

else//如果按過符號鍵

{

b=b*10+table[num];

}

}

else if(num==11)//如果按下的是'-'

{

flag=1;

fuhao=2;//2表示減號已按

}

i=table1[num];

write_date(0x30+i);

}

P3=0xf7;

if(P3!=0xf7)

{

delay(5);

if(P3!=0xf7)

{

temp=P3&0xf0;

switch(temp)

{

case 0xe0:num=12;

break;

case 0xd0:num=13;

break;

case 0xb0:num=14;

break;

case 0x70:num=15;

break;

}

}

while(P3!=0xf7);

switch(num)

{

case 12:{write_com(0x01);a=0;b=0;flag=0;fuhao=0;}//按下的是"清零"

break;

case 13:{ //按下的是"0"

if(flag==0) //沒有按過符號鍵

{

a=a*10;

write_date(0x30);

P1=0;

}

else if(flag==1)//如果按過符號鍵

{

b=b*10;

write_date(0x30);

}

}

break;

case 14:{j=1;

if(fuhao==1){write_com(0x80+0x4f);//按下等於鍵,游標前進至第二行最後一個顯示處

write_com(0x04); //設置從後住前寫數據,每寫完一個數據,游標後退一格

c=a+b;

while(c!=0)

{

write_date(0x30+c%10);

c=c/10;

}

write_date(0x3d); //再寫"="

a=0;b=0;flag=0;fuhao=0;

}

else if(fuhao==2){write_com(0x80+0x4f); //游標前進至第二行最後一個顯示處

write_com(0x04); //設置從後住前寫數據,每寫完一個數據,游標後退一格

//(這個照理說順序不對,可顯示和上段一樣)

if(a-b>0)

c=a-b;

else

c=b-a;

while(c!=0)

{

write_date(0x30+c%10);

c=c/10;

}

if(a-b<0)

write_date(0x2d);

write_date(0x3d); //再寫"="

a=0;b=0;flag=0;fuhao=0;

}

else if(fuhao==3){write_com(0x80+0x4f);

write_com(0x04);

c=a*b;

while(c!=0)

{

write_date(0x30+c%10);

c=c/10;

}

write_date(0x3d);

a=0;b=0;flag=0;fuhao=0;

}

else if(fuhao==4){write_com(0x80+0x4f);

write_com(0x04);

i=0;

c=(long)(((float)a/b)*1000);

while(c!=0)

{

write_date(0x30+c%10);

c=c/10;

i++;

if(i==3)

write_date(0x2e);

}

if(a/b<=0)

write_date(0x30);

write_date(0x3d);

a=0;b=0;flag=0;fuhao=0;

}

}

break;

case 15:{write_date(0x30+table1[num]);flag=1;fuhao=1;}

break;

}

}

}


main()

{

init();

while(1)

{

keyscan();

}

}

㈨ 用單片機設計簡易計算器

給你些子程序,自己看著湊吧。呵呵。有了這些,寫出來應該不難了。

;@@@@@@@@@雙位元組整數運算@@@@@@@@@@@@@@@@@@
;***********雙位元組無符號加法**************
;入口:R6(H),R7,R4(H),R5,出口:和R6(H),R7(L)
UADD: MOV A,R7
ADD A,R5
MOV R7,A
MOV A,R6
ADDC A,R4
MOV R6,A
RET
;***********雙位元組無符號減法**************
;入口:被減數R6(H),R7(L),減數R4(H),R5(L),出口:差R6(H),R7(L)
CLR C
MOV A,R7
SUBB A,R5
MOV R7,A
MOV A,R6
SUBB A,R4
MOV R6,A
RET
;***********雙位元組無符號乘法**************
;入口:R6(H),R7(L),R4(H),R5(L),出口:積R6(H),R7(L)
UMUL: MOV A,R7
MOV B,R5
MUL AB
MOV R0,B
XCH A,R7
MOV B,R4
MUL AB
ADD A,R0
XCH A,R6
MOV B,R5
MUL AB
ADD A,R6
MOV R6,A
RET

;***********雙位元組無符號除法*****************
;入口:R6(H),R7(L),R4(H),R5(L),出口:商R6(H),R7(L),余R4(H),R5(L)
;影響:R2,R3,
;堆棧需求:1
UDIV: CLR C
CLR A
MOV R2,A
MOV R3,A
MOV B,#10H
MOVBIT: MOV A,R7;R6、R7中數據左移一位到R2、R3中,C到R7
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
MOV A,R3
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
CLR C ;R2R3-R4R5
MOV A,R3
SUBB A,R5
PUSH Acc
MOV A,R2
SUBB A,R4
JBC Cy,MOVBIT0;不夠減,清C繼續左移
MOV R2,A;夠減,存回余數並置位C
POP Acc
MOV R3,A
SETB C
SJMP MOVBIT1
MOVBIT0: POP Acc
MOVBIT1: DJNZ B,MOVBIT
MOV A,R7
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
MOV A,R2
MOV R4,A
MOV A,R3
MOV R5,A
RET

(7) 標號: DIVD 功能:雙位元組二進制無符號數除法

入口條件:被除數在R2、R3、R4、R5中,除數在R6、R7中。
出口信息:OV=0 時,雙位元組商在R2、R3中,OV=1 時溢出。
影響資源:PSW、A、B、R1~R7 堆棧需求: 2位元組
DIVD: CLR C ;比較被除數和除數
MOV A,R3
SUBB A,R7
MOV A,R2
SUBB A,R6
JC DVD1
SETB OV ;溢出
RET
DVD1: MOV B,#10H ;計算雙位元組商
DVD2: CLR C ;部分商和余數同時左移一位
MOV A,R5
RLC A
MOV R5,A
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
XCH A,R2
RLC A
XCH A,R2
MOV F0,C ;保存溢出位
CLR C
SUBB A,R7 ;計算(R2R3-R6R7)
MOV R1,A
MOV A,R2
SUBB A,R6
ANL C,/F0 ;結果判斷
JC DVD3
MOV R2,A ;夠減,存放新的余數
MOV A,R1
MOV R3,A
INC R5 ;商的低位置一
DVD3: DJNZ B,DVD2 ;計算完十六位商(R4R5)
MOV A,R4 ;將商移到R2R3中
MOV R2,A
MOV A,R5
MOV R3,A
CLR OV ;設立成功標志
RET

㈩ 求基於單片機的簡易計算器設計 以及開題報告

如果有給的
我也希望看看
我做的小數不能處理
只能處理20位以內的正數

閱讀全文

與基於單片機的簡易計算器設計相關的資料

熱點內容
扣扣加密技巧 瀏覽:720
蘋果如何創建伺服器錯誤 瀏覽:495
軟考初級程序員大題分值 瀏覽:473
js壓縮視頻文件 瀏覽:578
linux如何通過命令創建文件 瀏覽:989
應用加密app還能訪問應用嘛 瀏覽:433
安卓怎麼用支付寶交違章罰款 瀏覽:665
php面向對象的程序設計 瀏覽:504
數據挖掘演算法書籍推薦 瀏覽:894
投訴聯通用什麼app 瀏覽:150
web伺服器變更ip地址 瀏覽:954
java正則表達式驗證郵箱 瀏覽:360
成熟商務男裝下載什麼軟體app 瀏覽:609
加密2h代表長度是多少厘米 瀏覽:23
拍賣程序員 瀏覽:101
電腦的圖片放在哪個文件夾 瀏覽:276
unsignedintjava 瀏覽:217
編譯器下載地址 瀏覽:43
什麼是面對對象編程 瀏覽:709
b站伺服器什麼時候恢復 瀏覽:722