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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

電子計算器led顯示

[復制鏈接]
跳轉到指定樓層
樓主
ID:442132 發表于 2019-1-15 18:50 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#include<reg51.h>    //包含單片機寄存器的頭文件
#define uchar unsigned char
#define uint  unsigned int
#define KEY 0xff
sbit RS=P3^2;    //寄存器選擇位
sbit RW=P3^3;    //讀寫選擇位
sbit E=P3^4;     //使能信號位
//sbit BF=P1^7;    //忙碌標志位

uchar code KEY_TABLE[]={0xb7,0xee,0xde,0xbe,0xed,0xdd,0xbd,0xeb,0xdb,0xbb};
uchar code num[]={'0','1','2','3','4','5','6','7','8','9'};
long num1,num2,res;

void delay(uint z)
{
    uint i,j;       
         for(i=z;i>0;i--)
          for(j=110;j>0;j--);                 
}                          
                                          
void Write_com (uchar com) //將指令或顯示地址寫入液晶顯示器 入口 com
{      
         RS=0;                  //RS和RW同時為低電平,(寫指令)
         RW=0;   
         E=0;                  
       
         delay(3);              
         P0=com;               //將數據送入P1口
       
         delay(3);              
         E=1;                  

         delay(3);            
         E=0;                  //E先置0 E=1 -> E=0 液晶顯示器開始執行命令
}

void Write_data(uchar date)         //將數據寫入液晶顯示器  入口 data
{
          RS=1;              //RS為高電平,RW為低電平,(寫數據)
          RW=0;
          E=0;            
          P0=date;           //數據送入P1口,將數據寫入液晶顯示器
          
         delay(3);      
          E=1;         

         delay(3);     
         E=0;                     //E先置0 E=1 -> E=0 液晶顯示器開始執行命令
}                 

void LCDinit(void)             //對LCD進行初始化
{
   delay(10);             //首次寫指令給LCD一段反應時間
   Write_com(0x38);       //顯示模式設置
        delay(3);      

        Write_com(0x0e);     //顯示模式設置:顯示開,有光標,光標不閃爍         P157
        delay(3);

        Write_com(0x06);    //顯示模式設置:光標右移,字符不移
        delay(3);

        Write_com(0x01);    //清屏幕指令
        delay(3);
       
        Write_com(0x80+0x00);
        delay(3);
}

uchar keyscan()        //鍵盤掃描,返回掃描值
{       
        uchar temp1,temp2,key;
        P2=0xf0;                                     //置行為0,列為1
        if(P2!=0xf0)                            //有無按鍵被按下
        {
                delay(10);
                if(P2!=0xf0)                                  //語句仍為真 則有按鍵被按下
                {
                        temp1=P2;                                 //讀入列值
                       
                        P2=0x0f;                                 //列 0, 行 1
                        delay(3);
                       
                        temp2=P2;                                 //讀入行值
                        key=temp1|temp2;
                       
                        while(P2!=0x0f);
                        return key;
                }
        }
        return KEY;       
}

uchar key_IN()                     //對鍵盤掃描值譯碼并顯示
{
        uchar i,key;
        key=keyscan();
        if(key!=KEY)                                  //確定讀入的按鍵值
        {
        switch(key)
        {
        case 0x7e:Write_data('+');return '+';
        case 0x7d:Write_data('-');return '-';
        case 0x7b:Write_data('*');return '*';
        case 0x77:Write_data('/');return '/';
        case 0xd7:Write_com(0x80+0x40); Write_data('=');return '=';
        case 0xe7:Write_com(0x01); num1=0;num2=0;break;       //清零
        default:
        break;
        }
        for(i=0;i<10;i++)
        {
                if(key==KEY_TABLE[i])                                         //確定讀入的按鍵值
                        {
                        Write_data(num[i]);
                        return i;
                        }
        }
        }
        return KEY;
}
void count()                                            //對計算進行處理,并顯示計算結果
{

        uchar key,i=0,a[9];
        long num0;
        key=key_IN();

        if((key=='+')||(key=='-')||(key=='*')||(key=='/'))
        {
                num2=num1;                                                                                                // num1=50 num2=50  num1=0                  輸入了50
                num1=0;
                res=key;
        }

        if(key<10)                                                                                                         
        {
                num1=num1*10+key;                                                                          //num1=2  num1=2*10+0= 20
        }                                  

        if(key=='=')
        {
                Write_com(0x80+0x41);
                switch(res)                                            //對算法進行處理
                {
                   case '+':num0=num1+num2; break;
                   case '-':
                         if(num2>num1)
                                num0=(num2-num1);
                         if(num2<num1)
                        {
                                Write_data('-');
                                num0=num1-num2;
                        }
                   break;
                   case '*':num0=(num1*num2);break;
                   case '/':
                        if(num1>0)
                                num0=(num2/num1);
                        else
                                Write_data('0');
                                break;       
                   default:num0=0;
                   break;
                }

                /////顯示計算結果
                               
                        if(0==num0)
                        {
                                if(0!=res)
                                        Write_data('0');
                        }
                       
                        while(num0>0)
                         {         
                                i++;
                                a[i]=num0%10;                                         
                                num0=num0/10;
                               
                         }
                        for(;i>0;i--)
                        {
                                Write_data(num[a[i]]);
                        }                                                         
                     num1=0;num2=0;res=0;
        }
}

void main(void)            //主函數
{
    num1=0;num2=0;
    LCDinit();              //調用LCD初始化函數  
    Write_com(0x00);                          
        while(1)
        {
                count();
        }
}


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

使用道具 舉報

沙發
ID:1 發表于 2019-1-16 03:58 | 只看該作者
本帖需要重新編輯補全電路原理圖,源碼,詳細說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久国产精品-国产精品 | 国产免费拔擦拔擦8x高清 | 日韩欧美一区二区三区 | 日本三级线观看 视频 | 一区二区在线免费播放 | 中国av在线免费观看 | 婷婷色国产偷v国产偷v小说 | 爱草在线 | 亚洲色综合| 亚洲视频在线观看 | 欧美一区在线视频 | 亚洲成人免费视频在线观看 | 国产98色在线 | 日韩 | 欧美国产一区二区 | 91精品国产91久久久久青草 | 欧美韩一区二区三区 | 中国大陆高清aⅴ毛片 | 国产成人91视频 | 青青草一区二区 | 亚洲v日韩v综合v精品v | av一区二区三区在线观看 | 欧美99| 天堂中文字幕av | 亚洲精品1区 | 在线观看黄色电影 | 玖玖综合网 | 国产一区二区三区免费观看在线 | 久久久精彩视频 | 国产成人亚洲精品 | 超碰在线97国产 | 一区视频在线 | 国产剧情一区 | 国产精品福利在线 | 精品久久久久一区二区国产 | 免费在线一区二区 | 日韩精品免费一区二区在线观看 | 精品日韩一区 | 麻豆一区 | 日本精品视频 | 亚洲三级国产 | 国产精品成人在线播放 |