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

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

用51單片機制作的簡單計算器程序

作者:劉杰   來源:會員發布   點擊數:  更新時間:2014年06月25日   【字體:

一、硬件仿真圖

 

 

件部分比較簡單,當鍵盤按鍵按下時它的那一行、那一列的端口為低電平。因此,只要掃描行、列端口是否都為低電平就可以確定是哪個鍵被按下。

 二、主程序流程圖



程序的主要思想是:將按鍵抽象為字符,然后就是對字符的處理。將操作數分別轉化為字符串存儲,操作符存儲為字符形式。然后調用compute()函數進行計算并返回結果。具體程序及看注釋還有流程圖。


三、程序源代碼

#include <</font>reg51.h>#include <</font>intrins.h>

#include <</font>ctype.h>            

#include <</font>stdlib.h>            

 

#define uchar unsigned char

#define uint unsigned int

 

uchar operand1[9], operand2[9];  

uchar operator;                     

 

void delay(uint);

uchar keyscan();

void disp(void);

void buf(uint value);

uint compute(uint va1,uint va2,uchar optor);

 

uchar code table[] = {0xc0,0xf9,0xa4,0xb0,0x99,

                0x92,0x82,0xf8,0x80,0x90,0xff};     

 

uchar dbuf[8] = {10,10,10,10,10,10,10,10};            

 

        

void delay(uint z)

{

uint x,y;

for(x=z;x>0;x--)

    for(y=110;y>0;y--);

}

 

 

uchar keyscan()

{

    uchar skey;                     

    

 

    P1 = 0xfe;

    while((P1 & 0xf0) != 0xf0)        

    {

        delay(3);                    

 

        while((P1 & 0xf0) != 0xf0)    

        {

            switch(P1)                

            {

                case 0xee: skey = '7'; break;

                case 0xde: skey = '8'; break;

                case 0xbe: skey = '9'; break;

                case 0x7e: skey = '/'; break;

                    

                default:   skey = '#';

            }

 

            while((P1 & 0xf0) != 0xf0) 

                ;

        }

    }

 

 

    P1 = 0xfd;    

    while((P1 & 0xf0) != 0xf0)

    {

        delay(3);

 

        while((P1 & 0xf0) != 0xf0)

        {

            switch(P1)

            {

                case 0xed: skey = '4'; break;

                case 0xdd: skey = '5'; break;

                case 0xbd: skey = '6'; break;

                case 0x7d: skey = '*'; break;

                    

                default:   skey = '#';

            }

 

            while((P1 & 0xf0) != 0xf0)

                ;

        }

    }

 

 

 

    P1 = 0xfb;

    while((P1 & 0xf0) != 0xf0)

    {

        delay(3);

        

        while((P1 & 0xf0) != 0xf0)

        {

            switch(P1)

            {

                case 0xeb: skey = '1'; break;

                case 0xdb: skey = '2'; break;

                case 0xbb: skey = '3'; break;

                case 0x7b: skey = '-'; break;

                    

                default: skey = '#';

            }

 

            while((P1 & 0xf0) != 0xf0)

                ;

        }

    }

 

 

 

    P1 = 0xf7;

    while((P1 & 0xf0) != 0xf0)

    {

        delay(3);

 

        while((P1 & 0xf0) != 0xf0)

        {

            switch(P1)

            {

                case 0xe7: skey = '$'; break;

                case 0xd7: skey = '0'; break;

                case 0xb7: skey = '='; break;

                case 0x77: skey = '+'; break;

                    

                default:   skey = '#';

            }

 

            while((P1 & 0xf0) != 0xf0)

                ;

        }

    }

 

    return skey;

}

 

void main()

{    

    uint value1, value2, value;           

    uchar ckey, cut1 = 0, cut2 = 0;    

    uchar operator;                       

    uchar i, bool = 0;

 

init:                                   

 

    buf(0);                            

    disp();

    value = 0;

    cut1 = cut2 = 0;

    bool = 0;

    for(i = 0;i <</font> 9;i++)

    {

        operand1[i] = '\0';

        operand2[i] = '\0';

    }                                  

 

    while(1)

    {

        ckey = keyscan();             

        if(ckey != '#')

        { 

            if(isdigit(ckey))         

            {

                switch(bool)    

                {

                    case 0:

                            operand1[cut1] = ckey;

                            operand1[cut1+1] = '\0';

                            value1 = atoi(operand1);  

                            cut1++;

                            buf(value1);

                            disp();

                            break;

                    case 1:

                            operand2[cut2] = ckey;

                            operand2[cut2+1] = '\0';

                            value2 = atoi(operand2);

                            cut2++;

                            buf(value2);

                            disp();

                            break;

                            

                    default: break;

                }

            }

            else if(ckey=='+'||ckey=='-'||ckey=='*'||ckey=='/')

            {

                bool = 1;    

                operator = ckey;

                buf(0);

                dbuf[7] = 10;

                disp();

            }

            else if(ckey == '=')

            {

                value = compute(value1,value2,operator);

                buf(value);

                disp();

                while(1)                     

                {

                    ckey = keyscan();

                    if(ckey == '$')          

                        goto init;

                    else

                        {

                            buf(value);

                            disp();

                        }

                }

            }

            else if(ckey == '$') 

            {    goto init;}

        }

        disp();

    }

 

}

 

 

uint compute(uint va1,uint va2,uchar optor)

{

    uint value;

 

    switch(optor)

    {

        case '+' : value = va1+va2;    break;

        case '-' : value = va1-va2;    break;

        case '*' : value = va1*va2;    break;

        case '/' : value = va1/va2;    break;

        

        default :  break;

    }

    return value;

}

 

 

void buf(uint val)

{

    uchar i;

    if(val == 0)

    {

        dbuf[7] = 0;

        i = 6;

    }

    

    else

        for(i = 7; val > 0; i--)

        {

            dbuf[i] = val % 10;

            val /= 10;

        }

    

    for( ; i > 0; i--)

        dbuf[i] = 10;

}

 

 

void disp(void)

{

    uchar bsel, n;

    

    bsel=0x01;

    for(n=0;n<</font>8;n++)

    { 

        P2=bsel;

        P0=table[dbuf[n]];

        bsel=_crol_(bsel,1);

        delay(3);

        P0=0xff;

    }

}

關閉窗口

相關文章

主站蜘蛛池模板: 黄色片中文字幕 | 国产黄色精品 | 日韩视频一区二区三区 | 久草免费在线视频 | 国产香蕉视频在线观看 | 欧美成人a | 伊人久久在线 | 在线a视频 | 超碰在线网站 | 亚洲精品视频在线 | 欧美成年人视频 | 日日夜夜艹 | 欧美黑粗大| 成人欧美在线 | 国产理论视频 | 香蕉伊人网 | 好色影院 | 欧美午夜精品一区二区三区 | 理论片中文字幕 | 日韩欧美黄色 | 天天操天天看 | 欧美不卡在线 | 欧美黄色免费网站 | 天天干夜夜艹 | 天天做天天操 | 中文字幕国产在线 | 久久不雅视频 | 久久av网站 | 国产精品伦子伦免费视频 | 欧美精品三区 | 免费一级全黄少妇性色生活片 | 精品福利在线 | 亚洲成人动漫在线观看 | 色片在线 | 久久精品久久久久久久 | 久久手机视频 | 色激情网 | 成人黄色免费 | 中文字幕中文字幕 | 在线中文字幕视频 | 国产又粗又大又长 |