单片机计算器课程设计
『壹』 单片机设计计算器
下面是我以前写的一个简单的计算器的程序,你可以参考参考
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit E=P2^7; //1602使能引脚
sbit RW=P2^6; //1602读写引脚
sbit RS=P2^5; //1602数据/命令选择引脚
uchar temp,num,k,m,flag,flag1,tt,a;
uint table[10];
uint val[8];
uint shu,shu1,shu2;
void init();
void delay(uint z);
void write_com(uchar com);
void write_date(uchar date);
uchar keyscan();
void input();
void output();
void main()
{
init();
while(1)
{
input();
output();
}
}
void delay(uint z)
{
int i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
void init()
{
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x80);
write_com(0x01);
}
void write_com(uchar com)
{
P0=com;
RS=0;
RW=0;
E=0;
delay(5);
E=1;
delay(5);
}
void write_date(uchar date)
{
P0=date;
RS=1;
RW=0;
E=0;
delay(5);
E=1;
delay(5);
}
uchar keyscan()
{
P1=0xfe;//对矩阵键盘的第一行全赋0,扫描第一行
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)//消抖
{
delay(10);
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;//将P1的值读入temp中,否则temp的值始终为0xf0
//因为当程序运行到松手检测循环时,要退出松手
//检测循环就必须是temp值为0xf0
switch(temp)
{
case 0xee:num=7;break;//break是跳出switch语句,
case 0xde:num=8;break;//而不是跳出while语句
case 0xbe:num=9;break;
case 0x7e:num=13;break;//num=13表示除号
}
while(temp!=0xf0) //松手检测
{ //即当手松开时,也即无按键被按下
temp=P1; //则temp值就等于0xf0,
temp=temp&0xf0; //退出此循环
}
}
}
P1=0xfd;//对矩阵键盘的第二行全赋0,扫描第二行
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xed:num=4;break;
case 0xdd:num=5;break;
case 0xbd:num=6;break;
case 0x7d:num=12;break;//num=12表示乘号
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
P1=0xfb;//对矩阵键盘的第三行全赋0,扫描第三行
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xeb:num=1;break;
case 0xdb:num=2;break;
case 0xbb:num=3;break;
case 0x7b:num=11;break;//num=11表示减号
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
P1=0xf7;//对矩阵键盘的第四行全赋0,扫描第四行
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xe7:num=15;break;//num=15表示清零
case 0xd7:num=16;break;//num=16表示0
case 0xb7:num=14;break;//num=14表示等号
case 0x77:num=10;break;//num=10表示加号
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
return num;
}
void digit(uchar number)
{
write_com(0x80+a);
write_date(number+'0');
table[a]=tt;
delay(5);
tt=0;
num=0;
a++;
}
void input()
{
uint i,j;
tt=keyscan();
if(tt==15) //清零
{
write_com(0x01);
tt=0;
num=0;
a=0;
m=0;
flag1=0;
flag=0;
}
if(tt==1) digit(1);
if(tt==2) digit(2);
if(tt==3) digit(3);
if(tt==4) digit(4);
if(tt==5) digit(5);
if(tt==6) digit(6);
if(tt==7) digit(7);
if(tt==8) digit(8);
if(tt==9) digit(9);
if(tt==16)
{
write_com(0x80+a);
write_date(0+'0');
table[a]=0;
delay(5);
tt=0;
num=0;
a++;
}
if(tt==10)//检测到加号
{
m=1;//表示加法
shu1=0;
j=1;
write_com(0x80+a);
write_date('+');
delay(5);
flag=a;
for(i=flag;i>0;i--)
{
shu1+=(table[i-1]*j);
j*=10;
}
tt=0;
num=0;
a++;
}
if(tt==11)//检测到减号
{
m=2;//表示减法
shu1=0;
j=1;
write_com(0x80+a);
write_date('-');
delay(5);
flag=a;
for(i=flag;i>0;i--)
{
shu1+=(table[i-1]*j);
j*=10;
}
tt=0;
num=0;
a++;
}
if(tt==12)//检测到乘号
{
m=3;//表示乘法
shu1=0;
j=1;
write_com(0x80+a);
write_date('*');
delay(5);
flag=a;
for(i=flag;i>0;i--)
{
shu1+=(table[i-1]*j);
j*=10;
}
tt=0;
num=0;
a++;
}
if(tt==13)//检测到除号
{
m=4;//表示除法
shu1=0;
j=1;
write_com(0x80+a);
write_date('/');
delay(5);
flag=a;
for(i=flag;i>0;i--)
{
shu1+=(table[i-1]*j);
j*=10;
}
tt=0;
num=0;
a++;
}
if(tt==14) //检测到等号
{
flag1=1;
write_com(0x80+a);
write_date('=');
shu2=0;
j=1;
for(i=a-1;i>flag;i--)
{
shu2+=(table[i]*j);
j*=10;
}
num=0;
tt=0;
}
}
void output()
{
uint value;
uchar n;
if((m==1)&&(flag1==1))//加的时候
{
value=shu1+shu2;
if(value>=0&&value<10)
{
val[0]=value;
write_com(0xc0);
for(n=0;n<1;n++)
{
write_date(val[n]+'0');
delay(2);
}
}
if(value>=10&&value<100)
{
val[0]=value/10;
val[1]=value%10;
write_com(0xc0);
for(n=0;n<2;n++)
{
write_date(val[n]+'0');
delay(2);
}
}
if(value>=100&&value<1000)
{
val[0]=value/100;
val[1]=value%100/10;
val[2]=value%10;
write_com(0xc0);
for(n=0;n<3;n++)
{
write_date(val[n]+'0');
delay(2);
}
}
if(value>=1000&&value<10000)
{
val[0]=value/1000;
val[1]=value%1000/100;
val[2]=value%1000%100/10;
val[3]=value%10;
write_com(0xc0);
for(n=0;n<4;n++)
{
write_date(val[n]+'0');
delay(2);
}
}
if(value>=10000&&value<100000)
{
val[0]=value/10000;
val[1]=value%10000/1000;
val[2]=value%10000%1000/100;
val[3]=value%10000%1000%100/10;
val[4]=value%10;
write_com(0xc0);
for(n=0;n<5;n++)
{
write_date(val[n]+'0');
delay(2);
}
}
}
if((m==2)&&(flag1==1))//减的时候
{
value=shu1-shu2;
if(value>=0&&value<10)
{
val[0]=value;
write_com(0xc0);
for(n=0;n<1;n++)
{
write_date(val[n]+'0');
delay(2);
}
}
if(value>=10&&value<100)
{
val[0]=value/10;
val[1]=value%10;
write_com(0xc0);
for(n=0;n<2;n++)
{
write_date(val[n]+'0');
delay(2);
}
}
if(value>=100&&value<1000)
{
val[0]=value/100;
val[1]=value%100/10;
val[2]=value%10;
write_com(0xc0);
for(n=0;n<3;n++)
{
write_date(val[n]+'0');
delay(2);
}
}
if(value>=1000&&value<10000)
{
val[0]=value/1000;
val[1]=value%1000/100;
val[2]=value%1000%100/10;
val[3]=value%10;
write_com(0xc0);
for(n=0;n<4;n++)
{
write_date(val[n]+'0');
delay(2);
}
}
if(value>=10000&&value<100000)
{
val[0]=value/10000;
val[1]=value%10000/1000;
val[2]=value%10000%1000/100;
val[3]=value%10000%1000%100/10;
val[4]=value%10;
write_com(0xc0);
for(n=0;n<5;n++)
{
write_date(val[n]+'0');
delay(2);
}
}
}
if((m==3)&&(flag1==1))//乘的时候
{
value=shu1*shu2;
if(value>=0&&value<10)
{
val[0]=value;
write_com(0xc0);
for(n=0;n<1;n++)
{
write_date(val[n]+'0');
delay(2);
}
}
if(value>=10&&value<100)
{
val[0]=value/10;
val[1]=value%10;
write_com(0xc0);
for(n=0;n<2;n++)
{
write_date(val[n]+'0');
delay(2);
}
}
if(value>=100&&value<1000)
{
val[0]=value/100;
val[1]=value%100/10;
val[2]=value%10;
write_com(0xc0);
for(n=0;n<3;n++)
{
write_date(val[n]+'0');
delay(2);
}
}
if(value>=1000&&value<10000)
{
val[0]=value/1000;
val[1]=value%1000/100;
val[2]=value%1000%100/10;
val[3]=value%10;
write_com(0xc0);
for(n=0;n<4;n++)
{
write_date(val[n]+'0');
delay(2);
}
}
if(value>=10000&&value<100000)
{
val[0]=value/10000;
val[1]=value%10000/1000;
val[2]=value%10000%1000/100;
val[3]=value%10000%1000%100/10;
val[4]=value%10;
write_com(0xc0);
for(n=0;n<5;n++)
{
write_date(val[n]+'0');
delay(2);
}
}
}
if((m==4)&&(flag1==1))//除的时候
{
value=shu1/shu2;
if(value>=0&&value<10)
{
val[0]=value;
write_com(0xc0);
for(n=0;n<1;n++)
{
write_date(val[n]+'0');
delay(2);
}
}
if(value>=10&&value<100)
{
val[0]=value/10;
val[1]=value%10;
write_com(0xc0);
for(n=0;n<2;n++)
{
write_date(val[n]+'0');
delay(2);
}
}
if(value>=100&&value<1000)
{
val[0]=value/100;
val[1]=value%100/10;
val[2]=value%10;
write_com(0xc0);
for(n=0;n<3;n++)
{
write_date(val[n]+'0');
delay(2);
}
}
if(value>=1000&&value<10000)
{
val[0]=value/1000;
val[1]=value%1000/100;
val[2]=value%1000%100/10;
val[3]=value%10;
write_com(0xc0);
for(n=0;n<4;n++)
{
write_date(val[n]+'0');
delay(2);
}
}
if(value>=10000&&value<100000)
{
val[0]=value/10000;
val[1]=value%10000/1000;
val[2]=value%10000%1000/100;
val[3]=value%10000%1000%100/10;
val[4]=value%10;
write_com(0xc0);
for(n=0;n<5;n++)
{
write_date(val[n]+'0');
delay(2);
}
}
}
}
『贰』 急求!用89C51单片机设计4*4矩阵式键盘计算器程序
^这是郭天祥老师写的:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit la=P2^6;
sbit wela=P2^7;
sbit key1=P3^4;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0};
uchar num,temp,num1;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
uchar keyscan();
void display(uchar aa);
void main()
{
num=17;
la=1;
P0=0;
la=0;
wela=1;
P0=0xc0;
wela=0;
while(1)
{
display(keyscan());
}
}
void display(uchar aa)
{
la=1;
P0=table[aa-1];
la=0;
}
uchar keyscan()
{
P3=0xfe;
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xee:num=1;
break;
case 0xde:num=2;
break;
case 0xbe:num=3;
break;
case 0x7e:num=4;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
P3=0xfd;
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xed:num=5;
break;
case 0xdd:num=6;
break;
case 0xbd:num=7;
break;
case 0x7d:num=8;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
P3=0xfb;
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xeb:num=9;
break;
case 0xdb:num=10;
break;
case 0xbb:num=11;
break;
case 0x7b:num=12;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
P3=0xf7;
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xe7:num=13;
break;
case 0xd7:num=14;
break;
case 0xb7:num=15;
break;
case 0x77:num=16;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
return num;
}
『叁』 课程设计:用51单片机设计一个简易计算器
‘哦啦啦啊呀呀有个子系统好吗啉了解我在不在’
『肆』 怎么用51单片机做简易计算器
你好!
单片机做计算器的设计,本身就是难点;
你是用仿真还是要做实物呢?
最多计算位数需要几位?
『伍』 单片机计算器课程设计
poteus仿真软件上自带有一个计算器程序,可以仿真的,你可以把那个程序看懂了,再自己写一个。
『陆』 51单片机做简易计算器
这样的一个计算器相信应该在一两天时间都可以做好,这最好自己去做,不是很复杂的系统
『柒』 简单单片机计算器程序
unsigned char code 这个是分配到Rom中的数据,一般是用来查表的。
unsigned char code XIANSHI[]用来做数码管显示的数据表,不带小数点。
unsigned char code XIANSHIXIAOSHUDIAN[]也是用来显示数据的,这个带小数点。
Proteus里有自带的计算器实例。
也比较复杂。
/*******************************************************************************
************ LABCENTER ELECTRONICS ************
************ Proteus VSM Sample Design Code ************
************ Integer Calculator ( 2K Code Limit) ************
*******************************************************************************/
#include <intrins.h>
#include <reg51.h>
#include "calc.h"
//Variables
static data LONG lvalue;
static data LONG rvalue;
static data CHAR currtoken;
static data CHAR lasttoken;
static data CHAR lastpress;
static xdata CHAR outputbuffer[MAX_DISPLAY_CHAR];
VOID main (VOID)
//Initialise our variables and call the
//Assembly routine to initialise the LCD display.
{ lvalue = 0;
rvalue = 0;
currtoken = '=';
lasttoken = '0';
initialise(); // Initialize the LCD
calc_output(OK);
calc_evaluate();
}
你可以打开proteus,再打开实例文件夹,再打开VSM for 8051,再打开C51 Calculator
求采纳为满意回答。
『捌』 基于单片机的多功能计算器
不会吧,这么有趣,我前几天做的课程设计就是这个啊!
刚刚花了内一个星期做完了这个计算容器,硬件,程序,论文都已经完成了。
我里面没用到74LS244或74LS240、与非门等器件,就是用到了51单片机和数码管来实现的
因为51里面的IO口多,没必要用这些东西,如果要用也可以,哈哈。
如果你急要,我发你吧!
『玖』 我要单片机课程设计报告,关于做计算器的
报告已发送到邮箱中,请注意查收,有其他需要再联系
『拾』 求基于单片机的简易计算器设计 以及开题报告
如果有给的 我也希望看看 我做的小数不能处理 只能处理20位以内的正数