仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- /*******************************************************************************************/
- // 单片机原理与应用课程设计
- // 要点:1、能实现加、减、乘、除功能
- // 2、数码0-9及运算符号通过按键盘输入,并在液晶显示器上显示算式及运算结果
- // 4、用PROTEUS仿真
- // 5、焊接电路板并调试运行
- // 出品:潍坊学院信息与控制工程学院
- // 日期:2014年12月
- // 注意:该程序仅供参考
- /*******************************************************************************************/
- #include <reg51.h>
- #define uint unsigned int
- #define uchar unsigned char
- #define LCDIO P0 //1602数据口
- uchar code temp[]="0123456789";
- uchar temp1[8],mm[4],temp2[8];
- float q;
- uchar num,num1,k,r=0,n,h,d,w;
- float sum;
- long uu;
- sbit rw=P2^1;
- sbit rs=P2^0;
- sbit ep=P2^2;
- sbit p10=P1^0;
- sbit p11=P1^1;
- sbit p12=P1^2;
- sbit p13=P1^3;
- sbit p14=P1^4;
- sbit p15=P1^5;
- sbit p16=P1^6;
- sbit p17=P1^7;
- void delayms(uint m)
- {
- uint i,j;
- for (i=0;i<m;i++)
- for (j=0;j<120;j++);
- }
-
- void write_com(uchar com)
- {
- rw=0;
- rs=0;
- ep=0;
- LCDIO =com;
- delayms(5);
- ep=1;
- delayms(5);
- ep=0;
- }
- void write_date(uchar date)
- {
- rw=0;
- rs=1;
- ep=0;
- LCDIO =date;
- delayms(5);
- ep=1;
- delayms(5);
- ep=0;
- }
- void init()
- {
-
- rs=0;
- rw=0;
- ep=0;
- write_com(0x38);
- write_com(0x0c);
- write_com(0x06);
- }
- void shaomiao()
- {
- uchar i,s;
- for (i=0,s=0xfe;i<4;i++)
- {
- P1=s;
- if(p14==0|p15==0|p16==0|p17==0)
- {
- delayms(10);
- if(p14==0|p15==0|p16==0|p17==0)
- {
- if(p14==0)
- {
- if(p10==0)
- num=7;
- if(p11==0)
- num=4;
- if(p12==0)
- num=1;
- if(p13==0)
- num=10;
- }
- if(p15==0)
- {
- if(p10==0)
- num=8;
- if(p11==0)
- num=5;
- if(p12==0)
- num=2;
- if(p13==0)
- num=0;
- }
- if(p16==0)
- {
- if(p10==0)
- num=9;
- if(p11==0)
- num=6;
- if(p12==0)
- num=3;
- if(p13==0)
- num=11;
- }
- if(p17==0)
- {
- if(p10==0)
- num=15;
- if(p11==0)
- num=14;
- if(p12==0)
- num=13;
- if(p13==0)
- num=12;
- }
- while(p14==0|p15==0|p16==0|p17==0);
- }
- if(num<10)
- {
- k++;
- w=0;
- }
- if(d==1)
- {
- d=0;
- sum=-sum;
-
- }
-
- }
-
- s=s<<1|0x01;
- s=s|0xf0;
- }
- }
- void display1()
- {
-
- uchar i;
- uu=(long)(sum);
- temp1[7]=uu/10000000;
- temp1[6]=uu%10000000/1000000;
- temp1[5]=uu%10000000%1000000/100000;
- temp1[4]=uu%10000000%1000000%100000/10000;
- temp1[3]=uu%10000000%1000000%100000%10000/1000;
- temp1[2]=uu%10000000%1000000%100000%10000%1000/100;
- temp1[1]=uu%10000000%1000000%100000%10000%1000%100/10;
- temp1[0]=uu%10;
-
- if(h==1)
- {
- h=2;
- write_com(0x80+15-k);
- write_date(0x2d);
- }
- if(r==0)
- write_com(0x80+15);
- if(r==1)
- write_com(0xc0+15);
- write_com(0x04);
- for (i=0;i<k;i++)
- {
- write_date(temp[temp1[i]]);
- delayms(5);
- }
-
- }
- void display2()
- {
- uchar i;
- temp2[7]=uu%10000000/1000000;
- temp2[6]=uu%10000000%1000000/100000;
- temp2[5]=uu%10000000%1000000%100000/10000;
- temp2[4]=uu%10000000%1000000%100000%10000/1000;
- temp2[2]=uu%10000000%1000000%100000%10000%1000/100;
- temp2[1]=uu%10000000%1000000%100000%10000%1000%100/10;
- temp2[0]=uu%10;
-
-
- if(h==1)
- {
- h=2;
- write_com(0x80+15-k-4);
- write_date(0x2d);
- }
- if(r==0)
- write_com(0x80+15);
- if(r==1)
- write_com(0xc0+15);
- write_com(0x04);
- for (i=0;i<k+4;i++)
- {
-
- if(i==3)
- {
- write_date(0x2e);
- i++;
- }
- write_date(temp[temp2[i]]);
- delayms(5);
- }
- }
- void panduan()
- {
-
- if(n==1&num==0)
- {
- write_com(0x01);
- write_com(0x80+15);
- write_date(temp[0]);
- k=0;
- n=0;
-
- }
- if(num==10)
- {
- write_com(0x01);
- k=0;
- n=0;
- r=0;
- }
- if(n==1&num>=1&num<10)
- {
- write_com(0x01);
- k=1;
- n=0;
- r=0;
- }
- if(num<10&k==1)
- {
- sum=num;
- mm[0]=num;
- if(num==0)
- k=0;
- }
- if(num<10&k==2)
- {
- sum=mm[0]*10+num;
- mm[1]=num;
- }
- if(num<10&k==3)
- {
- sum=mm[0]*100+mm[1]*10+num;
- mm[2]=num;
- }
- if(num<10&k==4)
- {
- sum=mm[0]*1000+mm[1]*100+mm[2]*10+num;
- mm[3]=num;
- }
- if(num<10&k==5)
- {
-
- num=10;
- }
-
- if (num>=12&num<16)
- {
-
- r=1;
- k=0;
- q=sum;
-
- if(num==12)
- {
- write_com(0xc0);
- write_date(0x2b);
- }
- if(num==13)
- {
- write_com(0xc0);
- write_date(0x2d);
- }
- if(num==14)
- {
- write_com(0xc0);
- write_date(0x2a);
- }
- if(num==15)
- {
- write_com(0xc0);
- write_date(0xfd);
- }
- num1=num;
- n=0;
- }
- if(num==11&w==0)
- {
- w=1;
- n=1;
- r=0;
- num=16;
- write_com(0x01);
- if(num1==12)
- sum=q+sum;
- if(num1==13)
- sum=q-sum;
- if(num1==14)
- sum=q*sum;
- if(num1==15)
- sum=q/sum;
-
- if(sum>=0)
- h=0;
- else
- {
- h=1;
- sum=-sum;
- d=1;
- }
- if(sum<100000000)
- k=8;
- if(sum<10000000)
- k=7;
- if(sum<1000000)
- k=6;
- if(sum<100000)
- k=5;
- if(sum<10000)
- k=4;
- if(sum<1000)
- k=3;
- if(sum<100)
- k=2;
- if(sum<10)
- k=1;
-
- if(sum!=(long)(sum))
- {
- uu=sum*1000;
-
- display2();
-
- }
- }
- if(sum==(long)(sum))
- display1();
-
- }
-
- void main()
- {
- init();
- while(1)
- {
- shaomiao();
- panduan();
- }
-
- }
复制代码
所有资料51hei提供下载:
http://www.51hei.com/bbs/dpj-142615-1.html
|