51单片机简易计算器 (可算小数)
- 格式:doc
- 大小:169.00 KB
- 文档页数:17
51单片机简易计算器
#include
#include
#define uchar unsigned char #define uint unsigned int sbit beep=P2^3;
sbit dula=P2^6;
sbit wela=P2^7;
sbit rw=P1^1;
sbit rs=P1^0;
sbit lcden=P2^5;
void yunsuan();
void keyinput(char s);
void write_data(char ddata);
void write_com(char command);
void display(long a);
void init();
void dealerror();
void dataoverflow();
void welcome();
char code table1[]={0xee,0xde,0xbe,0x7e,
0xed,0xdd,0xbd,0x7d,
0xeb,0xdb,0xbb,0x7b,
0xe7,0xd7,0xb7,0x77};
char code table2[]="789/456*123-.0=+";
char j,k,temp,temp1,temp2,key,mchar,m,flag2=0,flag3=0; long x,y,num;
int operators,input,iny;
char error[5]="error";
char overflow[8]="overflow";
char welcome_[16]="welcome to use !";
void delay(uint x)//延时
{
uint a,b;
for(a=x;a>0;a--)
for(b=10;b>0;b--);
}
void delay_ms(uint x)//延时
{
uint a,b;
for(a=x;a>0;a--)
for(b=110;b>0;b--);
}
void write_com(uchar com)//写命令{
P0=com;
rs=0;
lcden=0;
delay(10);
lcden=1;
delay(10);
lcden=0;
}
void write_data(uchar date)//写数据{
P0=date;
rs=1;
lcden=0;
delay(10);
lcden=1;
delay(10);
lcden=0;
}
long ming(int x)
{
long m;
switch(x)
{
case 9:m=1000000000;return m;break; case 8:m=100000000;return m;break; case 7:m=10000000;return m;break; case 6:m=1000000;return m;break; case 5:m=100000;return m;break; case 4:m=10000;return m;break; case 3:m=1000;return m;break;
case 2:m=100;return m;break;
case 1:m=10;return m;break; case 0:m=1;return m;break; }
}
void display(long a)
{
long d;
int i,flag1=0,temp,c=-1;
init();
if(a<0)
{
a=a*c;
write_data('-');
}
for(i=9;i>=0;i--)
{
d=ming(i);
temp=a/d;
a=a%d;
if((temp==0)&&(flag1==0)) ;
else
{
write_data(0x30+temp);
flag1=1;
}
if(i==2)
{
write_data('.');
flag1=1;
}
}
}
void init()//LCD初始化
{
rw=0;
dula=0;
wela=0;
write_com(0x38); //显示模式设置:16×2显示,5×7点阵,8位数据接口
delay(20);
write_com(0x0e); //显示模式设置
delay(20);
write_com(0x06); //显示模式设置:光标右移,字符不移
delay(20);
write_com(0x01); //清屏幕指令,将以前的显示内容清除delay(20);
}
void yunsuan() // 运算
{
if (iny)
{
switch(operators)
{
case 1:
x=x+y;
num=x;
if(num<10000000000&&num>-10000000000)
{
display(num);
}
else
dataoverflow();
break;
case 2:
x=x-y;