找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3244|回復(fù): 6
收起左側(cè)

如何使用AT89c52單片機(jī)做出一個(gè)簡易計(jì)算器(加減乘除就好,無需要練算)

[復(fù)制鏈接]
ID:844638 發(fā)表于 2020-12-23 16:36 | 顯示全部樓層 |閱讀模式
1黑幣
新手學(xué)生,看了一個(gè)星期了,也看了其他大神的程序等等,但是因?yàn)橛玫钠骷煌,好多地方都搞不動,希望有大神能具體指導(dǎo),教教原理和代碼,使用的是藍(lán)橋杯的ct107d板子,有仿真圖

51hei圖片20201223163614.png
回復(fù)

使用道具 舉報(bào)

ID:844638 發(fā)表于 2020-12-23 17:49 | 顯示全部樓層
下面是我的代碼,但是每次仿真都有問題,希望有大神能幫幫我
仿真圖在附件#include<reg51.h>  //頭文件
#define uint unsigned int
#define uchar unsigned char
sbit lcden=P2^3; //定義引腳
sbit rs=P2^4;
sbit rw=P2^0;
sbit busy=P0^7;
char i,j,temp,num,num_1;
long a,b,c;    //a,第一個(gè)數(shù) b,第二個(gè)數(shù) c,得數(shù)
float a_c,b_c;
uchar flag,fuhao;//flag是否有鍵按下,fuhao按下的是哪個(gè)鍵
uchar code table[]={
7,8,9,0,
4,5,6,0,
1,2,3,0,
0,0,0,0};
uchar code table1[]={
7,8,9,0x2f-0x30,
4,5,6,0x2a-0x30,
1,2,3,0x2d-0x30,
0x01-0x30,0,0x3d-0x30,0x2b-0x30};
void delay(uchar z) //延遲函數(shù)
{
uchar y;
for(z;z>0;z--)
   for(y=0;y<110;y++);
}
void check() //判斷忙或閑
{
do{
    P0=0xFF;
    rs=0;    //指令   
    rw=1;    //讀
    lcden=0;    //禁止讀寫
    delay(1); //等待,液晶顯示器處理數(shù)據(jù)   
    lcden=1;    //允許讀寫
    }while(busy==1); //判斷忙或閑,1忙,0閑
}
void write_com(uchar com) //寫指令函數(shù)
{
P0=com;   //com指令給p0
rs=0;
rw=0;
lcden=0;
check();
lcden=1;
}
void write_date(uchar date) //寫數(shù)據(jù)函數(shù)
{
    P0=date;
rs=1;
rw=0;
lcden=0;
check();
lcden=1;
}
void init() //初始化
{
        num=-1;
lcden=1; //使信號能成高電平
write_com(0x38); //8位?2行
write_com(0x0c); //顯示開,光標(biāo)關(guān),不閃爍*/
write_com(0x06); //增量方式不位移
write_com(0x80); //監(jiān)測忙信號
write_com(0x01); //顯示開,光標(biāo)關(guān),不閃爍
num_1=0;
i=0;
j=0;
a=0;    //第一個(gè)參和運(yùn)算的數(shù)
b=0;    //第二個(gè)參和運(yùn)算的數(shù)
c=0;
flag=0; //flag是否按下  
fuhao=0; // fuhao按下哪個(gè)鍵
}
void keyscan() //鍵盤掃描
{
P3=0xfe;
if(P3!=0xfe)
{
                delay(20);//延時(shí)20ms   
if(P3!=0xfe)   
{
    temp=P3&0xf0;   
switch(temp)   
{
     case 0xe0:num=0;      
break;
     case 0xd0:num=1;      
break;
     case 0xb0:num=2;      
break;
     case 0x70:num=3;      
break;    }
   }
   while(P3!=0xfe);
   if(num==0||num==1||num==2)//如果按下的是7.8.9
{
       if(j!=0)      
{
          write_com(0x01);      
   j=0;      
   }
       if(flag==0)//沒按過符號
{
     a=a*10+table[num];   
}
    else//按過符號  
  {
     b=b*10+table[num];   
  }   
}
   else//如果按下的是除
         {

    flag=1;
    fuhao=4;//4表示按過除號
  }
   i=table1[num];   
write_date(0x30+i);
}
P3=0xfd;
if(P3!=0xfd)
{
   delay(5);  
if(P3!=0xfd)   
{
    temp=P3&0xf0;   
switch(temp)   
{
     case 0xe0:num=4;         
break;
     case 0xd0:num=5;      
  break;
     case 0xb0:num=6;      
   break;
     case 0x70:num=7;      
  break;    }
   }
   while(P3!=0xfd);
   if(num==4||num==5||num==6&&num!=7)//如果按下的是4.5.6
  {
    if(j!=0)        
{
          write_com(0x01);      
    j=0;         }
       if(flag==0)//沒有按過符號鍵
  {
     a=a*10+table[num];   
}
    else//按過符號鍵   
{
     b=b*10+table[num];   
}  
}
   else//按下的是除   
         {
    flag=1;
    fuhao=3;//3表示按下乘號
                }
   i=table1[num];   
write_date(0x30+i);
}
P3=0xfb;
if(P3!=0xfb)
{
   delay(5);  
if(P3!=0xfb)  
{
    temp=P3&0xf0;   
switch(temp)   
{
     case 0xe0:num=8;   
      break;
     case 0xd0:num=9;   
      break;
     case 0xb0:num=10;
        break;
     case 0x70:num=11;   
      break;   
}
   }
   while(P3!=0xfb);
   if(num==8||num==9||num==10)//如果按下的是1.2.3
{
    if(j!=0)   
    {
          write_com(0x01);      
    j=0;     
    }
      if(flag==0)//沒有按過符號鍵  
  {
     a=a*10+table[num];   
  }
    else//如果按過
   {
     b=b*10+table[num];
    }
  }
   else if(num==11)//如果按下的是減號  
{
    flag=1;
    fuhao=2;//2表示按過減號
  }
   i=table1[num];  
write_date(0x30+i);
}
P3=0xf7;
if(P3!=0xf7)
{
   delay(5);   
if(P3!=0xf7)  
{
    temp=P3&0xf0;   
switch(temp)  
  {
     case 0xe0:num=12;      
   break;
     case 0xd0:num=13;   
     break;
     case 0xb0:num=14;   
     break;
     case 0x70:num=15;   
     break;    }
   }
   while(P3!=0xf7);  
switch(num)  
{
    case 12:{write_com(0x01);a=0;b=0;flag=0;fuhao=0;}//如果按下的是清零  
  break;
    case 13:{               //按下的是0     
if(flag==0)//沒按過符號鍵     
   {
        a=a*10;
        write_date(0x30);   
    P1=0;     
  }
       else if(flag==1)//按過符號建  
     {
        b=b*10;
        write_date(0x30);      
  }  
    }   
  break;
    case 14:{j=1;
           if(fuhao==1){write_com(0x80+0xf);//按下等號,光標(biāo)前進(jìn)至第二行最后一個(gè)顯示處
           write_com(0x04);    //設(shè)置從后往前寫數(shù)據(jù),每寫完一個(gè)數(shù)據(jù),光標(biāo)后退一格         
c=a+b;
          while(c!=0)           {
             write_date(0x30+c%10);   
          c=c/10;           }
           write_date(0x3d);    //再寫"="         
a=0;b=0;flag=0;fuhao=0;         
  }
      else if(fuhao==2){write_com(0x80+0xf);//光標(biāo)前進(jìn)至第二行最后一個(gè)顯示處
            write_com(0x04);    //設(shè)置從后往前寫數(shù)據(jù),每寫完一個(gè)數(shù)據(jù),光標(biāo)后退一格      
if(a-b>0)
            c=a-b;
          else
             c=b-a;  
         while(c!=0)
          {
             write_date(0x30+c%10);         
   c=c/10;
           }
           if(a-b<0)
             write_date(0x2d);
           write_date(0x3d);    //再寫"="                    
  a=0;b=0;flag=0;fuhao=0;          }
      else if(fuhao==3){write_com(0x80+0xf);  
          write_com(0x04);         
   c=a*b;            
while(c!=0)         
   {
             write_date(0x30+c%10);     
        c=c/10;         
    }
             write_date(0x3d);     
          a=0;b=0;flag=0;fuhao=0;      
       }
      else if(fuhao==4){write_com(0x80+0xf);  
          write_com(0x04);      
      i=0;
            c=(long)(((float)a/b)*1000);      
     while(c!=0)      
      {
               write_date(0x30+c%10);     
          c=c/10;  
         i++;      
     if(i==3)
               write_date(0x2e);             }
            if(a/b<=0)
              write_date(0x30);
            write_date(0x3d);
                                         a=0;b=0;flag=0;fuhao=0;  
                  }   
  }   
  break;
     case 15:{write_date(0x30+table1[num]);flag=1;fuhao=1;}
   break;
  }
}
}
main()
{
init();
while(1){
   keyscan();
}
}
代碼及仿真圖.zip (44.64 KB, 下載次數(shù): 12)





回復(fù)

使用道具 舉報(bào)

ID:88256 發(fā)表于 2020-12-23 19:34 | 顯示全部樓層
我沒法打開仿真,你的是什么問題?總要描述清楚問題所在啊
回復(fù)

使用道具 舉報(bào)

ID:844638 發(fā)表于 2020-12-23 21:29 | 顯示全部樓層
hhdsdy 發(fā)表于 2020-12-23 19:34
我沒法打開仿真,你的是什么問題?總要描述清楚問題所在啊

就是我寫出來的和給定給我的仿真圖好像不匹配,圖不讓自己畫(就必須用這個(gè)原理圖),所以我想請大家看看該怎么修改
回復(fù)

使用道具 舉報(bào)

ID:88256 發(fā)表于 2020-12-23 22:57 | 顯示全部樓層
君顏兮夢 發(fā)表于 2020-12-23 21:29
就是我寫出來的和給定給我的仿真圖好像不匹配,圖不讓自己畫(就必須用這個(gè)原理圖),所以我想請大家看看 ...

就是說這個(gè)程序不是你自己寫的,而是直接抄的了?否則也不會1602的引腳定義不一樣,只是我想不明白,改一下引腳有那么難嗎?等1602正常顯示了再進(jìn)行下一步的工作
回復(fù)

使用道具 舉報(bào)

ID:748788 發(fā)表于 2020-12-24 10:32 | 顯示全部樓層
作為單片機(jī)的新手還是應(yīng)該從基礎(chǔ)學(xué)起,編程先學(xué)點(diǎn)亮led、流水燈等。這個(gè)對你起點(diǎn)太高,難為自己,也難為別人
回復(fù)

使用道具 舉報(bào)

ID:844638 發(fā)表于 2020-12-24 12:40 | 顯示全部樓層
hhdsdy 發(fā)表于 2020-12-23 22:57
就是說這個(gè)程序不是你自己寫的,而是直接抄的了?否則也不會1602的引腳定義不一樣,只是我想不明白,改一 ...

好的我去看看,我們是小組合作,我們?nèi)パ芯垦芯?/td>
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表