找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

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

51單片機(jī)LCD1602計(jì)算器,如何改這個(gè)程序,把P3. 0口設(shè)置為可以十進(jìn)制轉(zhuǎn)二進(jìn)制的按鈕。

[復(fù)制鏈接]
ID:861681 發(fā)表于 2020-12-22 00:32 來(lái)自手機(jī) | 顯示全部樓層 |閱讀模式
10黑幣
#include "reg51.h"
#include "stdio.h"
#include "string.h"
#include "stdlib.h"   

typedef unsigned char uint8;
typedef  int uint16;
#define over_result_h 10000
#define over_result_l -10000
#define key P1
#define key2 P3//...............新按鈕加p3口
sbit beep=P2^3;
sbit rw=P2^1;
sbit rs=P2^0;
sbit e=P2^2;
sbit k1=P3^0;//...............新加P3.0按鈕鍵
uint8 flag;
uint8 flag_denghao=0;
uint8 flag_result=0;
char zifu[30];
int k=0;
long        p=0;
uint8 anjian,num,i;
long jieguo=0;
//........................................//
unsigned char addflag=0,subflag=0,mulflag=0,divflag=0,changeflag=0;
long sum1=0;
//........................................//
void delay(uint16 z)  
{
   while(z--);
}
void delayms(uint16 x)
{
        int i=0,j=0;
for(i=0;i<x;i++)
        for(j=0;j<110;j++);

}
//.................寫命令函數(shù).....................
void lcdwrc(uint8 c)
{
delay(1000);
rs=0;
rw=0;
e=0;
P0=c;
e=1;
delay(1000);
e=0;
}
//...............寫數(shù)據(jù)函數(shù)........................
void lcdwrd(uint8 dat)
{
delay(1000);
rs=1;
rw=0;
e=0;
P0=dat;
e=1;
delay(1000);
e=0;
rs=0;
}
//..............LCD1602初始化函數(shù)...................
void lcdinit()
{
delay(1500);
lcdwrc(0x38);//設(shè)置功能模式
delay(500);
lcdwrc(0x38);
delay(500);
lcdwrc(0x38);
delay(500);
lcdwrc(0x38);
lcdwrc(0x08);//初始地址
lcdwrc(0x01);//清屏
lcdwrc(0x06);//寫一位指針加一
lcdwrc(0x0c);// 開顯示
}


void keyscan()
{
   key=0xfe;//令第一行為0,然后判斷是哪一列按下
   if(key!=0xfe)
   {
   delay(1000);
    if(key!=0xfe)
   {  flag=0;
      anjian=P1&0xf0;
      switch(anjian)
      {
        case 0xe0: num=0;zifu[i]='1';while(key!=0xfe);lcdwrd(zifu[i]);i++;break;
        case 0xd0: num=1;zifu[i]='2';while(key!=0xfe);lcdwrd(zifu[i]);i++;break;
        case 0xb0: num=2;zifu[i]='3';while(key!=0xfe);lcdwrd(zifu[i]);i++;break;
        case 0x70: num=3;zifu[i]='+';while(key!=0xfe);lcdwrd(zifu[i]);i++;break;
      }
   }

   }
   key=0xfd;//令第二行為0,判斷是哪一列按下
   if(key!=0xfd)
   {
    delay(1000);
     if(key!=0xfd)
     {  flag=0;
        anjian=P1&0xf0;
        switch(anjian)
        {
         case 0xe0: num=4;zifu[i]='4';while(key!=0xfd);lcdwrd(zifu[i]);i++;break;
         case 0xd0: num=5;zifu[i]='5';while(key!=0xfd);lcdwrd(zifu[i]);i++;break;
         case 0xb0: num=6;zifu[i]='6';while(key!=0xfd);lcdwrd(zifu[i]);i++;break;
         case 0x70: num=7;zifu[i]='-';while(key!=0xfd);lcdwrd(zifu[i]);i++;break;
        }                           
     }
   }
   key=0xfb;//令第三行為0,判斷哪一列按下
   if(key!=0xfb);
   {delay(1000);
   if(key!=0xfb)
   { flag=0;
     anjian=P1&0xf0;
     switch(anjian)
     {
       case 0xe0: num=8;zifu[i]='7';while(key!=0xfb);lcdwrd(zifu[i]);i++;break;
       case 0xd0: num=9;zifu[i]='8';while(key!=0xfb);lcdwrd(zifu[i]);i++;break;
       case 0xb0: num=10;zifu[i]='9';while(key!=0xfb);lcdwrd(zifu[i]);i++;break;
       case 0x70: num=11;zifu[i]='*';while(key!=0xfb);lcdwrd(zifu[i]);i++;break;
     }
   }
   }
   key=0xf7;//令第四行為0,判斷哪一列按下
   if(key!=0xf7)
   {
     delay(1000);
     if(key!=0x07)
     {  flag=1;
        anjian=P1&0xf0;
        switch(anjian)
        {
            case 0xe0:num=12;zifu[i]='0';while(key!=0xf7);lcdwrd(zifu[i]);i++;break;
            case 0xd0:num=13;while(key!=0xf7);memset(zifu,0,sizeof(zifu));i=0;lcdwrc(0x01);flag_denghao=0;break;
            case 0xb0:num=14;zifu[i]='=';while(key!=0xf7);
//                                        lcdwrd(zifu[i]);
                                        i++;
                                        zifu[i]='\0';break;
                                       
                                       
            case 0x70:num=15;zifu[i]='/';while(key!=0xf7);lcdwrd(zifu[i]);i++;break;
        }
     }
   }
//..............十進(jìn)制轉(zhuǎn)二進(jìn)制..............
         P3=0x01;
         key2=P3; //原始P3.0=0x01
        if(key2=0x00)//是否已按下
   {
   delay(500);// 消抖延時(shí)
    if(key2=0x00)//是否抖動(dòng)
   {  flag=0;
      anjian=key2&0x00;
      switch(anjian)
      {
        case 0x00:num=16;while(key2=0x01);break;//case按鍵值=P3口的電位信息,在此處P3.0口被按下后(沒(méi)按前P3.0=1,P3=0x01),P3.0=0,P3=0x00
                        }
                }
        }
}



//..............十進(jìn)制轉(zhuǎn)二進(jìn)制..............
void zhuanhuan()
{
   
   changeflag++;
         subflag=mulflag=divflag=addflag=0;

}
//........................................//
long caculate(uint8* zifu)
{
uint8 lable[10]={0};
long int num[10];
uint16 len=strlen(zifu);
uint8 cnt=0;
uint8 index=0;
long int tmp;
long int result;
int t,y,m;
for(y=len-1;y>=0;y--)//錯(cuò)誤使用
{
        if(                                        (  zifu[len-2]>0x39||zifu[len-2]<0x30  )//最后一位為符號(hào)位
                                ||                 (  zifu[0]>0x39||zifu[0]<0x30  )//第一位為符號(hào)位
                                ||    ( (  zifu[y]>0x39||zifu[y]<0x30)&&(  zifu[y-1]>0x39||zifu[y-1]<0x30) )//連續(xù)兩個(gè)符號(hào)
                               
                                ||                (                zifu[y]=='0'&&        zifu[y-1]=='/')
                )
        {
                if  (  (zifu[0]=='+')   ||  (zifu[0]=='-')  )
                flag_result=0;
                else               
                flag_result=1;
                break;
        }
        else
        {
                flag_result=0;
        }
}               
       
       
for(k=0;k<len;k++)
{
  if(zifu[k]>0x39||zifu[k]<0x30)
  {
     lable[cnt]=zifu[k];
     zifu[k]='\0';
     num[cnt]=atol(zifu+index);
     cnt++;
     index=k+1;
  }
}
num[cnt++]=atol(zifu+index);

   for(k=0;k<=len-1;k++)
   {

      if(lable[k]=='*'||lable[k]=='/')//判斷加減乘除優(yōu)先級(jí)
      {
      if(lable[k]=='*')
      tmp=num[k]*num[k+1];
      else if(lable[k]=='/')
      tmp=num[k]/num[k+1];

      lable[k]='%';
      num[k+1]=tmp;
      num[k]=0;
      }
   }
         
         for(k=0;k<=len-1;k++)
   {

      if(lable[k]=='%')//判斷加減乘除優(yōu)先級(jí)
      {
                                m=k;//記錄下第一個(gè)%位置
                                while(lable[k]=='%')
                                {
                                       
                                        lable[k]='+';
                                        k++;
                                        num[m]=num[m]+num[k];
                                }
                               
                                num[k]=0;
      }
   }
   result=num[0];

//         lcdwrc(0x45+0x80);
//        lcdwrc(0x04);
//         m=0;
//         while(lable[m]!=0)
//        {lcdwrd(lable[m]);
//                m++;
//        }

   for(t=0;t<len-1;t++)
   {
     if(lable[t]=='+')
     {
        result+=num[t+1];
     }
                 
     if( lable[t]=='-')
     {
        result-=num[t+1];
     }
       
               

   }
return result;
}

void display(long jieguo)
{
p=jieguo;
if(p==0)
lcdwrd('0');
if(p<0)
jieguo=-jieguo;
while(jieguo!=0)
{lcdwrd(0x30+jieguo%10);
jieguo=jieguo/10;
}
if(p<0)
lcdwrd('-');//如果為負(fù)數(shù),顯示負(fù)號(hào)
//memset(zifu,0,sizeof(zifu));
//i=0;
flag_denghao=1;

//........................................//
if(changeflag)  //十進(jìn)制轉(zhuǎn)換二進(jìn)制
        {
                lcdwrc(0X4f+0x80);//從第二行最末向前顯示
                lcdwrc(0x04);//指針光標(biāo)自動(dòng)減1 整屏不移動(dòng)
                while(sum1!=0)
                {
                   lcdwrd(0x30+sum1%2);
                         sum1/=2;
                }
                  lcdwrd('=');
                  changeflag=0;
        }
//........................................//

}

void main()
{
        beep=0;
        lcdinit();
        while(1)
        {
                while(flag_denghao)
                {keyscan();}
                {
                                keyscan();
                }

                if(anjian==0xb0&&flag==1)
                {
                        jieguo=caculate(zifu);
                        lcdwrc(0x4f+0x80);
                        lcdwrc(0x04);
                       
                        if(flag_result==0)//
                        {
                                if(( jieguo>100000000 )||(jieguo<-100000000))//高溢出  100000000  9個(gè)位      
                                {
                                        lcdwrc(0x45+0x80);
                                        lcdwrd('r');
                                        lcdwrd('e');
                                        lcdwrd('v');
                                        lcdwrd('o');
                                        beep=1;
                                        delayms(1000);
                                        beep=0;
                                       
                                }
                                else
                                {
                                        display(jieguo);
                                }
                               
                        }
                        else
                        {
                                        lcdwrc(0x45+0x80);
                                        lcdwrd('r');
                                        lcdwrd('o');
                                        lcdwrd('r');
                                        lcdwrd('r');
                                        lcdwrd('e');
                                        beep=1;
                                        delayms(1000);
                                        beep=0;
                       
                        }
                        flag=0;
                }
        }
}

回復(fù)

使用道具 舉報(bào)

ID:584814 發(fā)表于 2020-12-23 09:25 | 顯示全部樓層
#define key2 P3//...............新按鈕加p3口
連這行是啥意思看不懂,所以呵呵呵好像幫不了
回復(fù)

使用道具 舉報(bào)

ID:750420 發(fā)表于 2020-12-23 10:08 | 顯示全部樓層
增加一個(gè)或運(yùn)算將輸入連接到P3.0 輸出連接到外部中斷,使能外部中斷,觸發(fā)后在外部中斷函數(shù)中比較你需要的幾個(gè)按鍵并進(jìn)行判斷把相應(yīng)的標(biāo)志位置位進(jìn)行相應(yīng)操作
回復(fù)

使用道具 舉報(bào)

ID:861681 發(fā)表于 2020-12-23 19:41 來(lái)自手機(jī) | 顯示全部樓層
wyqf 發(fā)表于 2020-12-23 10:08
增加一個(gè)或運(yùn)算將輸入連接到P3.0 輸出連接到外部中斷,使能外部中斷,觸發(fā)后在外部中斷函數(shù)中比較你需要的 ...

謝謝你給的思路,但是還是不會(huì)寫外部中斷服務(wù)函數(shù)里面的內(nèi)容
回復(fù)

使用道具 舉報(bào)

ID:161164 發(fā)表于 2024-5-8 10:16 | 顯示全部樓層
什么亂七八糟的代碼
2024-05-08_100540.png

??
2024-05-08_100844.png


num有啥用?
2024-05-08_101317.png


回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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