51单片机简易计算器 (可算小数)

  • 格式:doc
  • 大小:169.00 KB
  • 文档页数:17

下载文档原格式

  / 26
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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;