標(biāo)題: 電子計(jì)算器led顯示 [打印本頁]

作者: day9520    時(shí)間: 2019-1-15 18:50
標(biāo)題: 電子計(jì)算器led顯示
#include<reg51.h>    //包含單片機(jī)寄存器的頭文件
#define uchar unsigned char
#define uint  unsigned int
#define KEY 0xff
sbit RS=P3^2;    //寄存器選擇位
sbit RW=P3^3;    //讀寫選擇位
sbit E=P3^4;     //使能信號(hào)位
//sbit BF=P1^7;    //忙碌標(biāo)志位

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同時(shí)為低電平,(寫指令)
         RW=0;   
         E=0;                  
       
         delay(3);              
         P0=com;               //將數(shù)據(jù)送入P1口
       
         delay(3);              
         E=1;                  

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

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

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

void LCDinit(void)             //對(duì)LCD進(jìn)行初始化
{
   delay(10);             //首次寫指令給LCD一段反應(yīng)時(shí)間
   Write_com(0x38);       //顯示模式設(shè)置
        delay(3);      

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

        Write_com(0x06);    //顯示模式設(shè)置:光標(biāo)右移,字符不移
        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()                     //對(duì)鍵盤掃描值譯碼并顯示
{
        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()                                            //對(duì)計(jì)算進(jìn)行處理,并顯示計(jì)算結(jié)果
{

        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)                                            //對(duì)算法進(jìn)行處理
                {
                   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;
                }

                /////顯示計(jì)算結(jié)果
                               
                        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)            //主函數(shù)
{
    num1=0;num2=0;
    LCDinit();              //調(diào)用LCD初始化函數(shù)  
    Write_com(0x00);                          
        while(1)
        {
                count();
        }
}



作者: admin    時(shí)間: 2019-1-16 03:58
本帖需要重新編輯補(bǔ)全電路原理圖,源碼,詳細(xì)說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1