找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3105|回复: 6
打印 上一主题 下一主题
收起左侧

1602制作计算器

[复制链接]
跳转到指定楼层
楼主
ID:243612 发表于 2017-10-31 14:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
有谁可以帮忙看下程序吗?就是程序无法做运算?
#include<reg52.h>
#include<stdio.h>
#define        uint unsigned int
#define uchar unsigned char
sbit lcdrs=P2^6;
sbit lcdrw=P2^5;
sbit lcden=P2^7;
void delay(uint z)
{
      uint x,y;
          for(x=z;x>0;x--)
              for(y=110;y>0;y--);
}
void write_com(uchar com)
{
   lcdrs=0;
   lcden=0;
   P0=com;
   delay(5);
   lcden=1;                                  
   delay(5);
   lcden=0;
}
void write_data(uchar date)
{
   lcdrs=1;
   lcden=0;
   P0=date;
   delay(5);
   lcden=1;
   delay(5);
   lcden=0;
}
void init()
{
   lcden=0;
   lcdrw=0;
   write_com(0x38);
   write_com(0x0c);
   write_com(0x06);
   write_com(0x01);
   write_com(0x30);
   write_com(0x80);
}
void write_char(uchar x,uchar y,uchar dat)
{
  if(y==0)
  {
    write_com(0x80+x);
  }
  else
  {
    write_com(0xc0+x);
  }
  write_data( dat);
}
void write_string(uchar x,uchar y,uchar *s)
{
   if(y==0)
  {
    write_com(0x80+x);
  }
  else
  {
    write_com(0xc0+x);
  }
  while(*s)
  {
    write_data(*s);
        s++;
  }
}
uchar keyscan()
{
  unsigned char cord_h,cord_l;
  P1=0x0f;
  cord_h=P1&0x0f;
   if(cord_h!=0x0f)
   {
     delay(50);
         if((P1&0x0f)!=0x0f)
         {
            cord_h=P1&0x0f;
                 P1=cord_h|0xf0;
                 cord_l=P1&0xf0;
                  while((P1&0xf0)!=0xf0);
                   return(cord_h+cord_l);
         }
   }
    return(0xff);
}
unsigned char keypro()
{
   switch(keyscan())
   {
        case 0x77:return '+';break;
            case 0x7b:return '-';break;
                case 0x7d:return 'x';break;
                case 0x7e:return '/';break;
                case 0xbb:return '3';break;
                case 0xbd:return '6';break;
                case 0xbe:return '9';break;
                case 0xb7:return '=';break;
            case 0xdb:return '2';break;
            case 0xdd:return '5';break;
                case 0xde:return '8';break;
            case 0xd7:return '0';break;
                case 0xeb:return '1';break;
                case 0xed:return '4';break;
                case 0xee:return '7';break;
                case 0xe7:return '.';break;
                default:return 0xff;break;
   }
}
  void main()
{
    unsigned char i,num,sign;
        unsigned char temp[16];
        bit firstflag;
        float a=0,b=0;
        unsigned char s;
        init();
        delay(10);
        write_com(0x01);
        while(1)
        {
          num=keypro();
          if(num!=0xff)
          {
            if(i==0)
                write_com(0x01);
                if(('+'==num)||(i==16)||('-'==num)||('*'==num)||('='==num)||('/'==num))
                {
                i=0;
                if(firstflag==0)
                  {
                   sscanf(temp,"%f",&a);
                   firstflag=1;
                   }
                   else
                   sscanf(temp,"%f",&b);
                        for(s=0;s<16;s++)
                        temp[s]=0;
                        write_char(0,1,num);
                        if(num!='=')
                        {
                        write_char(0,0,num);
                        sign=num;
                        }
                   else
                   {
                     firstflag=0;
                         switch(sign)
                         {
                           case '+':a=a+b;break;
                           case '-':a=a-b;break;
                           case '*':a=a*b;break;
                           case '/':a=a/b;break;
                           default:break;
                         }
                        sprintf(temp,"%f",a);
                        write_string(1,1,temp);
                        sign=0;a=b=0;
                        for(s=0;s<16;s++)
                        temp[s]=0;
                   }
                }
                else if(i<16)
                {
                  if((0==i)&&(temp[0]=0))
                  {
                    if(num=='0')
                        {
                          write_com(0x01);
                        }
                        else
                        {
                           temp[0]=num;
                           i++;
                           write_char(0,0,num);
                        }
                  }
                  else
                  {
                    temp[i]=num;
                        write_char(i,0,num);
                        i++;
                  }
                }
          }
        }

}   
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:244827 发表于 2017-11-1 09:32 | 只看该作者
好厉害
回复

使用道具 举报

板凳
ID:244857 发表于 2017-11-1 10:32 来自手机 | 只看该作者
厉害了
回复

使用道具 举报

地板
ID:244874 发表于 2017-11-1 10:48 | 只看该作者
厉害了
回复

使用道具 举报

5#
ID:244874 发表于 2017-11-1 10:49 | 只看该作者
厉害啊,学习
回复

使用道具 举报

6#
ID:241249 发表于 2017-11-2 21:04 | 只看该作者
运行不起来么
回复

使用道具 举报

7#
ID:245732 发表于 2017-11-3 16:02 | 只看该作者
#include <reg51.h>
    sbit K1=P2^0;
    sbit K2=P2^1;
    sbit K3=P2^2;
    sbit K4=P2^3;
    sbit K5=P2^4;
        sbit K6=P2^5;
        sbit K7=P2^6;
        sbit K8=P2^7;
        sbit K9=P1^5;
        sbit K10=P1^6;
        sbit bell=P1^7;
        sbit RS = P1^0;
    sbit RW = P1^1;
    sbit E  = P1^2;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               
        void init();
        void wcom(unsigned char i);       
    void wdata(unsigned char i);
    void ifnotbusy(void);
        unsigned char code music_H[]={0xfc,0xfc,0xfd,0xfd,0xfd,0xfd,0xfe,0xfe, 0xfa,0xfb,0xfb,0xfb,0xfa,    0xf9,0xfa,0xfb,   0xfb,0xfa,0xfb,0xfb,0xfa,0xf9,0xf9,0xfa,0xf9,0xfb,0xfa,0xfa,0xf9,0xf9,0xfb,0xf9,0xf9,0xfb,0xf9,    0xf9,0xf9,0xfa,    0xf9,0xf9,0xfa,    0xfb,0xfb,0xfb,0xfb,0xfb,0xf9,0xfa};
         unsigned char code music_L[]={0x8f,0xef,0x45,0x6c,0xb4,0xf4,0x2e,0x3d, 0x8c,0x68,0xe9,0x68,0xbc,    0xe1,0x8c,0x68,   0x68,0x8c,0x68,0x68,0x8c,0xe1,0x21,0x8c,0xe1,0x68,0xd8,0x8c,0x21,0xe1,0x68,0x21,0xe1,0x68,0x21,    0x21,0x21,0x8c,    0x21,0x21,0x8c,    0xe9,0xe9,0xe9,0xe9,0x68,0x21,0x8c};
         unsigned char code Time[]={500,500,500,500,500,500,500,500,500,500,500,500,500,250,250,500,500,800,500,500,500,500,250,250,500,500,800,500,500,1000,500,500,1000,500,500,500,500,500,500,500,500,500,500,500,500,500};
         int i;
         void fy();
         void delay( int k);
        main()
        {
    TMOD=0x01; //选择方式1
    TH0=music_H[i]; //        高八位
    TL0=music_L[i]; //低八位
    //TR0=1;   //启动计时
         while(1){
           if(K1==0)
           {delay(10);
              if(K1==0)
                  {         
                      i=0;
                      fy();
                          init();
                           wcom(0x80);
                           wdata(0x31);

                  }
                }
                 
           if(K2==0)
           {delay(10);
              if(K2==0)
                  {
                     i=1;
                         fy();
                         init();
                         wcom(0x80);
                           wdata(0x32);

                  }
                  }
                  if(K3==0)
           {delay(10);
              if(K3==0)
                  {
                             i=2;
                         fy();
                         init();
                         wcom(0x80);
                           wdata(0x33);
                  }
                  }
                 if(K4==0)
           {delay(10);
              if(K4==0)
                  {             i=3;
                         fy();
                         init();
                         wcom(0x80);
                           wdata(0x34);
                  }
                  }                
                  if(K5==0)
           {delay(10);

              if(K5==0)
                  {             i=4;
                         fy();
                         init();
                         wcom(0x80);
                           wdata(0x35);
                  }
                  }          
                  if(K6==0)
           {delay(10);
              if(K6==0)
                  {             i=5;
                         fy();
                         init();
                                  wcom(0x80);
                           wdata(0x36);
                  }
                  }          
                            if(K7==0)
           {delay(10);
              if(K7==0)
                  {               i=6;

                         fy();
                         init();
                         wcom(0x80);
                           wdata(0x37);
                  }
                  }
                   if(K8==0)
           {delay(10);
              if(K8==0)
                  {               i=7;

                         fy();
                         init();
                         wcom(0x80);
                           wdata(0x38);
                  }
                  }
                  if(K9==0)
           {delay(10);
              if(K9==0)       
                  
                  {           i=8;
                           wcom(0x80);
                           wdata('l');
                           wcom(0x81);
                           wdata('z');
                           wcom(0x82);
                           wdata('l');
                           wcom(0x83);
                           wdata('h');

                  while(1)
                  {
                     fy();
                          i++;
                           if(i>=25)
                          break;
                          
                           }
                        }
               
                   }
                             if(K10==0)
           {delay(10);
              if(K10==0)       
                  
                  {           i=40;
                           wcom(0x80);
                           wdata('h');
                           wcom(0x81);
                           wdata('l');
                           wcom(0x82);
                           wdata('w');

                  while(1)
                  {
                     fy();
                          i++;
                           if(i>=53)
                          break;
                          
                           }
                        }
               
                   }
                  }
                  }       
               

       
  void fy()
  {        int j=0;
    TR0=1;
    while(j<Time[i])         //Time[i]music_Time[i]
   { if(TF0==1)         //定时/计数器溢出标志位 TF0=1 表示溢出
           { TF0=0;
             TH0=music_H[i];
                 TL0=music_L[i];
                 bell=!bell;
                 j++;
                }
    }
           TR0=0;
  }       
  void delay(int k)
  {
    int b,d;
         for (d=0;d<k;d++)
         {
    for(b=0;b<250;b++);
  }                                          
  }
  void init()
  {         
    wcom(0x01);
    wcom(0x38);
    wcom(0x06);
    wcom(0x0c);

  }
  void ifnotbusy()
{ P0=0xff;
RS=0;
RW=1;
E=0;
E=1;
while(P0&0x80)
{
E=0;E=1;
}
}
void wcom(unsigned char j)
{ifnotbusy();
E=0;
RS=0;
RW=0;
P0=j;
E=1;
E=0;
}                  
void wdata(unsigned char j)
{ifnotbusy();
E=0;
RS=1;
RW=0;
P0=j;
E=1;
E=0;
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表