① 单片机简易计算器设计的程序
展开全部
首先会按键扫描,再会数码管或液晶屏显示,基本上可以了
程序
流程:
扫描按键(最多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编程
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里
③ 单片机编程计算
MOV A, X MOV B, #10 MUL AB MOV Z, A MOV Z+1, B MOV A, Y MOV B, #5 DIV AB ADD A, Z JNC NEXT INC Z+1 NEXT: CLR C SUBB A, #5 MOV Z, A JNC NEXT2 INC Z+1 NEXT2: END X,Y为位于内部RAM30H,31H单元的单字节变量, Z位于32H33H,低字节在前。
④ 如何用51单片机做计算器(要求用C语言编程) 由于是新手所以没积分 对不住各位了
给你参考一下的,我最近做的:
我的实验板上的键不够,所以只能做加法运算,而且两数之和不能大于十。
嘿嘿,没错这个给某种人用的。
//**********myh.h***********有两个文件,一个是头文件myh.h一个是js.c
#include<reg52.h>
typedefunsignedcharuchar;
typedefunsignedintuint;
typedefbitBOOL;
//**
sbitrs=P2^6;
sbitrw=P2^5;
sbite=P2^7;
//**
ucharKey_Down(void);//返回0到12的键盘的编码
voiddelay(uchar);//延时
voidInit(void);
voidWrite_Cmd(uchar);
voidWrite_Data(uchar);
BOOLIf_Busy();
//**
ucharcodeLcd_tab[]="0123456789+=";
ucharcodeKey_tab[]={0xb7,0xbb,0xbd,0xbe,0xd7,0xdb,0xdd,0xde,0xe7,0xeb,0xed,0xee};
//**********
uintQ0;
uintQ1;
uintQ2;
//*************js.c********
#include"myh.h"
//**************
voidmain()
{ucharm_key;
ucharm_inc=0;
Init();
Write_Cmd(0x80);
while(1)
{Q1=0;
Q0=0;
Q2=0;
m_key=Key_Down();
Write_Cmd(0x01);
Write_Data(Lcd_tab[m_key]);
Q0=m_key;
m_key=Key_Down();
Write_Data(Lcd_tab[m_key]);
m_key=Key_Down();
Write_Data(Lcd_tab[m_key]);
Q1=m_key;
m_key=Key_Down();
Write_Data(Lcd_tab[m_key]);
Q2=Q0+Q1;
Write_Data(Lcd_tab[Q2]);
}
}
//************************
ucharKey_Down(void)
{ucharKey_number=0;
ucharm_cx;
ucharm_cy;
ucharm_cxy;
P3=0x0f;
m_cx=P3;
while(1)
{if(m_cx!=0x0f)
{delay(500);
m_cx=P3;
if(m_cx!=0x0f)
break;}
else{P3=0x0f;m_cx=P3;}
}
P3=0x0f;
m_cx=P3&0x0f;
P3=0xf0;
m_cy=P3&0xf0;
m_cxy=m_cx|m_cy;
for(Key_number=0;Key_number<12;Key_number++)
{if(m_cxy==Key_tab[Key_number])
break;
}
returnKey_number;}
//**********
voiddelay(uchartime)
{ucharj;
for(;time>0;time--)
for(j=0;j<200;j++);
}
//**************
voidinit()
{delay(10);
Write_Cmd(0x38);
delay(10);
Write_Cmd(0x38);
delay(10);
Write_Cmd(0x38);
delay(10);
Write_Cmd(0x0c);
delay(10);
Write_Cmd(0x06);
delay(10);
Write_Cmd(0x01);
}
//***********
voidWrite_Cmd(ucharcmd)
{//while(If_Busy());
e=0;
rw=0;
rs=0;
delay(4);
P0=cmd;
delay(4);
e=1;
delay(10);
e=0;
}
//***
voidWrite_Data(uchardat)
{//while(If_Busy());
e=0;
rw=0;
rs=1;
delay(4);
P0=dat;
delay(4);
e=1;
delay(10);
e=0;
}
//**
BOOLIf_Busy()
{
BOOLresult;
rw=1;
rs=0;
e=1;
delay(4);
result=(BOOL)(P2&0x80);
e=0;
returnresult;
}
⑤ 单片机编程
1:
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP T0INT
ORG 0030H
MAIN:
MOV TMOD,#01H
MOV TH0,#3CH
MOV TL0,#0B0H
SETB TR0
SETB ET0
SETB EA
MOV A,#0FEH
SJMP $
T0INT:
CLR TR0
MOV TH0,#3CH
MOV TL0,#0B0H
SETB TR0
MOV P1,A
RL A
RETI
END
2:
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP T0INT
ORG 0030H
MAIN:
MOV TMOD,#01H
MOV TH0,#0FEH
MOV TL0,#0CH
SETB TR0
SETB ET0
SETB EA
SJMP $
T0INT:
CLR TR0
MOV TH0,#0FEH
MOV TL0,#0CH
SETB TR0
CPL P1.1
RETI
END
⑥ 单片机做计算器的程序
1、直接调用库函数。
⑦ 单片机如何编程计算该16个单元的数值之和
QIHE:
MOVR0,#30H
MOVR2,#16
MOVR3,#0
MOVR4,#0
LOOP:
MOVA,@R0
ADDA,R4
MOVR4,A
CLRA
ADDCA,R3
MOVR3,A
INCR0
DJNZR2,LOOP
RET
⑧ 怎样用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] = '