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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STC89c52單片機多功能計算器程序與電路制作

[復制鏈接]
跳轉到指定樓層
樓主
之前在學校基本沒學過單片機之類的,后來去了一家公司實習,在一個搞單片機的大佬下開始學習,就做了個計算器,主要算法:加減乘除乘方開方三角函數排列組合等等,矩陣鍵盤用的5*7的,有些鍵沒用上,屏幕LCD1602,原理圖是自己畫的,程序是找的別人的,把鍵盤部分和一些算法改了改,目前功能基本實現,除了不能進行負數的運算也不知道怎么改(不過感覺影響不大),希望有想做這個的我這些東西有所幫助

微信圖片_20190506102821.jpg (132.17 KB, 下載次數: 58)

微信圖片_20190506102821.jpg

微信圖片_20190506102742.jpg (5 MB, 下載次數: 39)

微信圖片_20190506102742.jpg

微信圖片_20190506102710.png (293.58 KB, 下載次數: 36)

微信圖片_20190506102710.png

微信圖片_20190506102627.png (277.94 KB, 下載次數: 35)

微信圖片_20190506102627.png

微信圖片_20190506102533.png (255.99 KB, 下載次數: 43)

微信圖片_20190506102533.png

計算器程序.rar

67.6 KB, 下載次數: 36, 下載積分: 黑幣 -5

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:468648 發表于 2019-5-6 10:34 | 只看該作者
#define uchar unsigned char
#define uint unsigned int                  

uchar temp/*接收的字符*/,i/*通用數*/,gao/*兩位數的十位*/,di/*個位*/;
bit fun_two;//第二功能標志
float val1/*運算數1*/,val2/*運算數2*/,ans/*最終結果*/;
char tab[32]/*輸入接收數組*/,weishu/*浮點數位數*/;
char tab2[9]/*輸出緩沖數組*/;
uchar fuhao/*運算符號標志*/;

//鍵盤鍵碼數組,部分為ASCII碼
//鍵盤上的ABCDF,鍵并沒有用上(E作為浮點數的格式符了),
//這是由于單片機ROM只有8K,不能再擴展功能了(十六進制),但是保留按鍵。
uchar code keyval[5][7]={
0Xb2,0X31,0X34,0X37,0X2E,0X41,0Xa9,
0X20,0X32,0X35,0X38,0X30,0XA1,0Xaa,
0Xb3,0X33,0X36,0X39,0XA6,0XA5,0Xb1,
0X20,0X2b,0Xb0,0X2a,0X2f,0Xa0,0X20,
0Xb4,0Xa2,0Xa3,0XA4,0XA7,0XA8,0X3d,
};

//數據處理函數
void come_in()
{
        val1=atof(tab);         //ASCII碼轉浮點數
        for(i=0;i<32;i++)  //數組復位0
        {
                tab[i]=0;
        }
        i=0;
}

//鍵盤掃描程序
//5*7鍵盤,列在P3口的高5位上,行在P1口低7位上
//返回值為keyval[]中的對應鍵碼
uchar keyscan()
{
        uchar temp;
        uchar hang,lie;
        P3=0xf8|P3;       
        P3_7=0;
        if(P1!=0xff)
        {
                lie=0;
                temp=P1;
        }
        else
        {
                P3=0xf8|P3;
                P3_6=0;
                if(P1!=0xff)
                {
                        lie=1;
                        temp=P1;
                }
                else
                {
                        P3=0xf8|P3;
                        P3_5=0;
                        if(P1!=0xff)
                        {
                        lie=2;
                        temp=P1;
                        }
                        else
                        {
                                P3=0xf8|P3;
                                P3_4=0;
                                if(P1!=0xff)
                                {
                                        lie=3;
                                        temp=P1;
                                }
                                else
                                {
                                        P3=0xf8|P3;
                                        P3_3=0;
                                        if(P1!=0xff)
                                        {
                                                lie=4;
                                                temp=P1;
                                        }
                                   }
                        }
                }
        }
        switch(temp)
        {
                case 0xbf:hang=0;break;
                case 0xdf:hang=1;break;
                case 0xef:hang=2;break;
                case 0xf7:hang=3;break;
                case 0xfb:hang=4;break;
                case 0xfd:hang=5;break;
                case 0xfe:hang=6;break;
        }
        while(P1!=0xff);        //松手檢測
        return (keyval[lie][hang]);
}

void keypad()
{
        P3=0x07&P3;                  //
        P1=0xff;                  //
        if(P1!=0xff);          // 判斷有無按鍵
        delay(10);                  //延時去抖
        if(P1!=0xff)          //再次判斷
        {
                temp=keyscan();         //掃描鍵盤,取得鍵碼
                if(((temp>=0x30)&&(temp<=0x39))||(temp==0x2e)||(temp==0x2d)||(temp==0x45))//判斷鍵碼是否為浮點數關鍵字
                {
                               
                                write_1602dat(temp);  //顯示鍵碼
                                tab[i]=temp;                  //數據給tab[]
                                i++;
                }
                else                    //若不為浮點數數關鍵字,則復雜了!!!!
                {       
                        switch(temp)          //判斷鍵碼
                        {
                                case 0x2b:                 //加號
                                                        {
                                                                come_in();                            //數據處理
                                                                write_1602dat(0x2b); //寫加號
                                                                fuhao=temp;                         //取得運算符
                                                                val2=val1;                         //數據轉移
                                                                val1=0;                                 //val1復位,等待下一個數
                                                        }
                                                        break;
                                case 0xb0:                //減號                                          
                                                        {
                                                                come_in();                          //同加號
                                                                write_1602dat(0x2d);  //寫減號
                                                                val2=val1;                          //同加號
                                                                fuhao=temp;                          //同加號
                                                                val1=0;                                  //同加號
                                                        }
                                                        break;

                                case 0x2a:                //乘號
                                                        {
                                                                come_in();                         //同加號
                                                                write_1602dat(0x2a); //寫乘號
                                                                val2=val1;                         //同加號
                                                                fuhao=temp;                         //同加號
                                                                val1=0;                                 //同加號
                                                        }
                                                        break;
                                case 0x2f:                //除號
                                                        {                                                 //同加號
                                                                come_in();                         //同加號
                                                                write_1602dat(0x2f); //寫除號
                                                                val2=val1;                         //同加號
                                                                fuhao=temp;                         //同加號
                                                                val1=0;                                 //同加號
                                                        }
                                                        break;
                                case 0xa0:                //N次方
                                                        {
                                                                come_in();                          //同加號
                                                                write_1602dat(0x5e);  //寫‘^’
                                                                val2=val1;                          //同加號
                                                                fuhao=temp;                          //同加號
                                                                val1=0;                                  //同加號
                                                        }
                                                        break;
                                case 0xa1:                //N次方根
                                                        {
                                                                 come_in();                          //同加號
                                                                write_1602dat(0xa2);  //寫根號
                                                                val2=val1;                          //同加號
                                                                fuhao=temp;                          //同加號
                                                                val1=0;                                  //同加號
                                                        }
                                                        break;
                                case 0xa2:                //sin
                                                        {
                                                                if(fun_two==0)                 //判斷第二功能標準,如果0,寫“sin:”
                                                                {
                                                                        write_1602dat('s');
                                                                        write_1602dat('i');
                                                                        write_1602dat('n');
                                                                        write_1602dat(':');
                                                                }
                                                                else                                 //如果0,寫“asin:”
                                                                {
                                                                        write_1602dat('a');
                                                                        write_1602dat('s');
                                                                        write_1602dat('i');
                                                                        write_1602dat('n');
                                                                        write_1602dat(':');
                                                                }
                                                                fuhao=temp;
                                                                val1=0;
                                                        }
                                                        break;
                                case 0xa3:                //cos
                                                        {
                                                                if(fun_two==0)                   //判斷第二功能標準,如果0,寫“cos:”
                                                                {
                                                                        write_1602dat('c');
                                                                        write_1602dat('o');
                                                                        write_1602dat('s');
                                                                        write_1602dat(':');
                                                                }
                                                                else                                  //判斷第二功能標準,如果0,寫“acos:”
                                                                {
                                                                        write_1602dat('a');
                                                                        write_1602dat('c');
                                                                        write_1602dat('o');
                                                                        write_1602dat('s');
                                                                        write_1602dat(':');
                                                                };
                                                                fuhao=temp;
                                                                val1=0;
                                                        }
                                                        break;
                                case 0xa4:                //tan
                                                        {
                                                                if(fun_two==0)                  //判斷第二功能標準,如果0,寫“tan:”
                                                                {
                                                                        write_1602dat('t');
                                                                        write_1602dat('a');
                                                                        write_1602dat('n');
                                                                        write_1602dat(':');
                                                                }
                                                                else                                  //判斷第二功能標準,如果0,寫“atan:”
                                                                {
                                                                        write_1602dat('a');
                                                                        write_1602dat('t');
                                                                        write_1602dat('a');
                                                                        write_1602dat('n');
                                                                        write_1602dat(':');
                                                                };
                                                                fuhao=temp;
                                                                val1=0;
                                                        }
                                                        break;
                                case 0xa5:                //log
                                                        {
                                                                come_in();
                                                                write_1602dat(0x7e);        //寫對數符號
                                                                write_1602dat('l');
                                                                write_1602dat('o');
                                                                write_1602dat('g');
                                                                write_1602dat(0x7f);
                                                                val2=val1;
                                                                fuhao=temp;
                                                                val1=0;
                                                        }
                                                        break;
                                case 0xa6:                //階乘
                                                        {
                                                                come_in();
                                                                write_1602dat('!');           //寫階乘符號
                                                                fuhao=temp;
                                                                val2=val1;
                                                                val1=0;
                                                        }
                                                        break;
                                case 0xa7:                //排列組合
                                                        {
                                                                come_in();
                                                                write_1602dat(0x7e);                       
                                                                if(fun_two==0)write_1602dat('C');//判斷第二功能標準,如果0,則為排列,如果1為組合”
                                                                else write_1602dat('A');
                                                                write_1602dat(0x7f);
                                                                val2=val1;
                                                                fuhao=temp;
                                                                val1=0;
                                                        }
                                                        break;
                                case 0xa8:                //累加
                                                        {
                                                                come_in();
                                                                write_1602dat(0x7e); //寫累加符號
                                                                val2=val1;
                                                                fuhao=temp;
                                                                val1=0;
                                                        }
                                                        break;
                                case 0xaa:                //left
                                                        {
                                                                weizhi=weizhi+1;           //左移
                                                                write_1602com(weizhi);
                                                                i=i+1;
                                                        }
                                                        break;
                                case 0xa9:                //right
                                                        {
                                                                weizhi=weizhi-1;           //右移
                                                                write_1602com(weizhi);
                                                                i=i-1;
                                                        }
                                                        break;
                                case 0xb1:                //刪除
                                                        {       
                                                                weizhi=weizhi-1;
                                                                write_1602com(weizhi);
                                                                write_1602dat(0x20);
                                                               
                                                                weizhi=weizhi-1;
                                                                write_1602com(weizhi);
                                                                i=i-1;
                                                                tab[i]=' ';
                                                        }
                                                        break;
                                case 0xb2:                //第二功能
                                                        {
                                                                 P2_7=!P2_7;
                                                                 fun_two=!fun_two;
                                                        }
                                                        break;
                                case 0xb3:                //led
                                                        {
                                                                P3_2=!P3_2;
                                                        }
                                                        break;
                                case 0x3d:                //OK鍵
                                                        {
                                                                come_in();
                                                                switch(fuhao)
                                                                {
                                                                        case 0x2b:ans=val1+val2;break;// 加
                                                                        case 0xb0:ans=val2-val1;break;// 減
                                                                        case 0x2a:ans=val2*val1;break;// 乘
                                                                        case 0x2f:ans=val2/val1;break;// 除
                                                                        case 0xa0:ans=pow(val2,val1);break;//N次方
                                                                        case 0xa1:ans=exp(log(val1)/val2);break;//開N次方
                                                                        case 0xa2:{if(fun_two==0)ans=sin(val1);else ans=asin(val1);fun_two=0;}break;// sin
                                                                        case 0xa3:{if(fun_two==0)ans=cos(val1);else ans=acos(val1);fun_two=0;}break;//cos
                                                                        case 0xa4:{if(fun_two==0)ans=tan(val1);else ans=atan(val1);fun_two=0;}break;//tan
                                                                        case 0xa5:ans=log(val1)/log(val2);break;//log
                                                                        case 0xa6:ans=jiecheng(val2);break;//階乘
                                                                        case 0xa7:{if(fun_two==0)ans=zuhe(val2,val1);else ans=pailie(val2,val1);}break;//組合
                                                                        case 0xa8:ans=leijia(val2,val1);break;//累加
                                                                        default:ans=val1;
                                                                }
                                                                sprintf(tab2,"%f",ans);          //浮點數轉字符串
                                                                weishu=lang(ans);                  //取得浮點數位數
                                                                if(weishu>7)                          //位數大于7科學計數顯示
                                                                {
                                                                        for(i=8;i>1;i--)
                                                                        {
                                                                                tab2[i]=tab2[i-1];       
                                                                        }
                                                                        tab2[1]='.';
                                                                        write_1602com(er+9);
                                                                        weizhi=er+8;
                                                                        write_1602dat('x');
                                                                        write_1602dat('1');
                                                                        write_1602dat('0');
                                                                        write_1602dat('^');
                                                                        if(weishu>9)                 //大于9,取得位數十位,個位,分別顯示
                                                                        {
                                                                                 gao=weishu/10;
                                                                                di=weishu%10;
                                                                                write_1602dat(gao+'0');
                                                                                write_1602dat(di+'0');
                                                                        }
                                                                        else
                                                                        write_1602dat(weishu+'0');
                                                                }
                                                                else if(weishu<(-7))           //位數為負數
                                                                {
                                                                        weishu=0-weishu;           //變正數
                                                                        ans=ans*pow(10,weishu);          //ans變假分數
                                                                        sprintf(tab2,"%f",ans);          //后面基本同上
                                                                        write_1602com(er+9);
                                                                        weizhi=er+9;
                                                                        write_1602dat('x');
                                                                        write_1602dat('1');
                                                                        write_1602dat('0');
                                                                        write_1602dat('^');
                                                                        write_1602dat('-');
                                                                        if(weishu>9)
                                                                        {
                                                                                 gao=weishu/10;
                                                                                di=weishu%10;
                                                                                write_1602dat(gao+'0');
                                                                                write_1602dat(di+'0');
                                                                        }
                                                                        else
                                                                        write_1602dat(weishu+'0');
                                                                }
                                                                write_1602com(er);
                                                                weizhi=er;
                                                                for(i=0;i<8;i++)
                                                                {
                                                                        write_1602dat(tab2[i]);
                                                                        delay(1);
                                                                }
                                                                write_1602com(er+15);
                                                                weizhi=er+15;       
                                                        }
                                                        break;
                                case 0xb4:                 //復位鍵
                                                        {
                                                                write_1602com(0x01); //清顯示
                                                                write_1602com(0x80); //指針復位
                                                                weizhi=0x80;
                                                                for(i=0;i<32;i++)
                                                                {
                                                                        tab[i]=0;          //tab[]清0
                                                                }
                                                                for(i=0;i<9;i++)
                                                                {
                                                                        tab2[i]=0;         //tab2[]清0
                                                                }
                                                                val2=0;                         //該清0的都清0
                                                                val1=0;
                                                                fun_two=0;
                                                                ans=0;
                                                                i=0;
                                                                gao=0;di=0;
                                                                temp=0;
                                                                fuhao=0;
                                                                P2_7=0;
                                                        }
                                                        break;
                        }
                }
        }
}
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品美女久久久 | 97伦理| 日韩在线一区二区 | 国产黄色在线观看 | 久久精品免费观看 | 久久久成人免费一区二区 | 91在线观看 | 国产精品久久欧美久久一区 | 欧美精品一区二区三区蜜臀 | 自拍视频一区二区三区 | 色www精品视频在线观看 | 一区视频在线免费观看 | 亚洲精品在线91 | 久久精品亚洲国产奇米99 | 久久精品成人一区 | 日韩欧美在线一区二区 | 国产视频观看 | 91福利网址| 亚洲 中文 欧美 日韩 在线观看 | av网站免费观看 | 成人av播放 | 亚洲国产精品久久久久久 | 久久亚洲国产精品日日av夜夜 | 日韩高清中文字幕 | 你懂的免费在线 | 午夜天堂精品久久久久 | av一区二区三区 | 亚洲一区二区三区欧美 | 伊人狠狠干 | 日本在线视频中文字幕 | 成人欧美一区二区三区在线播放 | 日韩一区二区在线观看 | 日本爱爱视频 | 99色在线| 精品人伦一区二区三区蜜桃网站 | 亚洲1区| a级免费观看视频 | 7777在线视频 | 午夜精品一区二区三区在线视频 | 亚洲风情在线观看 | 午夜手机在线视频 |