久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3876|回復: 4
打印 上一主題 下一主題
收起左側

51單片機LCD1602計算器,如何改這個程序,把P3. 0口設置為可以十進制轉二進制的按鈕。

[復制鏈接]
跳轉到指定樓層
樓主
ID:861681 發表于 2020-12-22 00:32 來自手機 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
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++);

}
//.................寫命令函數.....................
void lcdwrc(uint8 c)
{
delay(1000);
rs=0;
rw=0;
e=0;
P0=c;
e=1;
delay(1000);
e=0;
}
//...............寫數據函數........................
void lcdwrd(uint8 dat)
{
delay(1000);
rs=1;
rw=0;
e=0;
P0=dat;
e=1;
delay(1000);
e=0;
rs=0;
}
//..............LCD1602初始化函數...................
void lcdinit()
{
delay(1500);
lcdwrc(0x38);//設置功能模式
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;
        }
     }
   }
//..............十進制轉二進制..............
         P3=0x01;
         key2=P3; //原始P3.0=0x01
        if(key2=0x00)//是否已按下
   {
   delay(500);// 消抖延時
    if(key2=0x00)//是否抖動
   {  flag=0;
      anjian=key2&0x00;
      switch(anjian)
      {
        case 0x00:num=16;while(key2=0x01);break;//case按鍵值=P3口的電位信息,在此處P3.0口被按下后(沒按前P3.0=1,P3=0x01),P3.0=0,P3=0x00
                        }
                }
        }
}



//..............十進制轉二進制..............
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--)//錯誤使用
{
        if(                                        (  zifu[len-2]>0x39||zifu[len-2]<0x30  )//最后一位為符號位
                                ||                 (  zifu[0]>0x39||zifu[0]<0x30  )//第一位為符號位
                                ||    ( (  zifu[y]>0x39||zifu[y]<0x30)&&(  zifu[y-1]>0x39||zifu[y-1]<0x30) )//連續兩個符號
                               
                                ||                (                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]=='/')//判斷加減乘除優先級
      {
      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]=='%')//判斷加減乘除優先級
      {
                                m=k;//記錄下第一個%位置
                                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('-');//如果為負數,顯示負號
//memset(zifu,0,sizeof(zifu));
//i=0;
flag_denghao=1;

//........................................//
if(changeflag)  //十進制轉換二進制
        {
                lcdwrc(0X4f+0x80);//從第二行最末向前顯示
                lcdwrc(0x04);//指針光標自動減1 整屏不移動
                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個位      
                                {
                                        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;
                }
        }
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:584814 發表于 2020-12-23 09:25 | 只看該作者
#define key2 P3//...............新按鈕加p3口
連這行是啥意思看不懂,所以呵呵呵好像幫不了
回復

使用道具 舉報

板凳
ID:750420 發表于 2020-12-23 10:08 | 只看該作者
增加一個或運算將輸入連接到P3.0 輸出連接到外部中斷,使能外部中斷,觸發后在外部中斷函數中比較你需要的幾個按鍵并進行判斷把相應的標志位置位進行相應操作
回復

使用道具 舉報

地板
ID:861681 發表于 2020-12-23 19:41 來自手機 | 只看該作者
wyqf 發表于 2020-12-23 10:08
增加一個或運算將輸入連接到P3.0 輸出連接到外部中斷,使能外部中斷,觸發后在外部中斷函數中比較你需要的 ...

謝謝你給的思路,但是還是不會寫外部中斷服務函數里面的內容
回復

使用道具 舉報

5#
ID:161164 發表于 2024-5-8 10:16 | 只看該作者
什么亂七八糟的代碼


??



num有啥用?



回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: av片毛片| 一级毛片视频 | caoporn国产精品免费公开 | 一级中国毛片 | 日韩成人在线播放 | 亚洲精品久久久久中文字幕欢迎你 | 亚洲精品www. | 一区二区三区视频在线观看 | 一区视频 | 欧美一区二区三区四区视频 | 久久久久久九九九九 | 国产乱码精品1区2区3区 | 午夜噜噜噜 | 日韩成人免费 | 一级在线观看 | 久久亚洲精品久久国产一区二区 | 97精品超碰一区二区三区 | 亚洲精品综合一区二区 | 欧美午夜影院 | 中文字幕日本一区二区 | 综合色播| 91看片视频| 国产黄色大片 | 丝袜久久 | 中文字幕一区在线 | 天堂久久天堂综合色 | 高清av一区 | 在线观看视频一区二区三区 | 妹子干综合 | 亚洲国产精品suv | 91影院在线观看 | 日日摸日日添日日躁av | 免费在线看黄视频 | 四虎永久免费黄色影片 | 国产精品无码专区在线观看 | 欧美精品区 | 在线观看一区 | 成人免费观看视频 | 综合九九| 做a视频在线观看 | 欧美视频免费在线观看 |