单片机课程设计计算器
『壹』 广工单片机课程设计----计算器 明天上午9点前要。求救! Q2625882033
你是3,4班的~~
『贰』 单片机设计计算器
下面是我以前写的一个简单的计算器的程序,你可以参考参考
#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);
}
}
}
}
『叁』 课程设计:用51单片机设计一个简易计算器
‘哦啦啦啊呀呀有个子系统好吗啉了解我在不在’
『肆』 单片机计算器课程设计
poteus仿真软件上自带有一个计算器程序,可以仿真的,你可以把那个程序看懂了,再自己写一个。
『伍』 怎么用51单片机做简易计算器
你好!
单片机做计算器的设计,本身就是难点;
你是用仿真还是要做实物呢?
最多计算位数需要几位?
『陆』 51单片机做简易计算器
这样的一个计算器相信应该在一两天时间都可以做好,这最好自己去做,不是很复杂的系统
『柒』 我要单片机课程设计报告,关于做计算器的
报告已发送到邮箱中,请注意查收,有其他需要再联系
『捌』 怎么用51单片机做液晶显示屏计算器,进行两位简单的计算
^#defineLCD1602_FLAG
#defineLCD1602_PORTP0
#include<reg51.h>
#include<stddef.h>
#defineucharunsignedchar
sbitlcd1602_rs=P2^0;
sbitlcd1602_e=P2^2;
sbitlcd1602_rw=P2^1;
sbitlcd1602_busy=P0^7;
ucharstr[]="SimpleCalculator";
ucharkeyval,keystr[16];
voiddelay(uchara)
{
uchari;
while(a--)for(i=0;i<120;i++);
}
/*
************************************
*函数名称:lcd1602_CheckBusy()
*函数功能:状态查询
************************************
*/
voidlcd1602_CheckBusy()
{
do
{
lcd1602_busy=1;
lcd1602_rs=0;
lcd1602_rw=1;
lcd1602_e=0;
lcd1602_e=1;
}
while(lcd1602_busy);
}
/*
***************************************
*函数名称:lcd1602_WriteCmd()
*函数功能:写命令
*入口参数:命令字
*出口参数:无
***************************************
*/
voidlcd1602_WriteCmd(constucharcmd)
{
lcd1602_CheckBusy();
lcd1602_rs=0;
lcd1602_rw=0;
lcd1602_e=1;
LCD1602_PORT=cmd;
lcd1602_e=0;
}
/*
*******************************************
*函数名称:lcd1602_WriteData()
*函数功能:写数据
*入口参数:c--待写数据
*出口参数:无
*********************************************
*/
voidlcd1602_WriteData(constucharc)
{
lcd1602_CheckBusy();
lcd1602_rs=1;
lcd1602_rw=0;
lcd1602_e=1;
LCD1602_PORT=c;
lcd1602_e=0;
}
/*
***********************************************
*函数名称:lcd1602_Init()
*函数功能:初始化LCD
*入口参数:无
*出口参数:无
***********************************************
*/
voidlcd1602_Init()
{
lcd1602_WriteCmd(0x38); //显示模式为8位2行5*7点阵
lcd1602_WriteCmd(0x0c);//displayenable,flagenable,flashenable,
lcd1602_WriteCmd(0x06);//flagmovetoright,screendon'tmove
lcd1602_WriteCmd(0x01);//clearscreen
}
/*
************************************************
*函数名称:lcd1602_Display()
*函数功能:字符显示
*入口参数:ptr--字符或字符串指针
*出口参数:无
*说明:用户可通过以下方式来调用:
*1)lcd1602_Display("Hello,world!");
*2)INT8U存储类型txt[]="要显示的字符串";
*或者INT8U存储类型txt[]={'t','x','t',..,'