欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

基于HD7279和51單片機(jī)的計(jì)算器

作者:丁弘偎   來(lái)源:51hei   點(diǎn)擊數(shù):  更新時(shí)間:2010年08月18日   【字體:

   HD7279是一款用于擴(kuò)展單片機(jī)I/O口的芯片,至少我是這么認(rèn)為的,雖然它占用了單片機(jī)4個(gè)I/O但是真正作為傳輸?shù)膬H僅是一根總線,它可以同時(shí)驅(qū)動(dòng)8位共陰數(shù)碼管(或者8×8點(diǎn)陣),及8×8的矩陣鍵盤(pán),而同時(shí)接在單片機(jī)上的話,至少需要3~4組I/O,當(dāng)然單總線控制的芯片基本需要自己的指令和時(shí)序。

  接到這個(gè)課程設(shè)計(jì)之前我自己懶懶散散地看了一段時(shí)間的C51(用C語(yǔ)言編寫(xiě)單片機(jī)代碼),之前老師教的是A51(用匯編編寫(xiě)單片機(jī)代碼),我玩了很久,但是發(fā)現(xiàn)A51真的很局限,匯編這種語(yǔ)言是寫(xiě)給機(jī)器看的,真正地寫(xiě)0和寫(xiě)1,真正是一個(gè)寄存器一個(gè)寄存器的調(diào)用,對(duì)于8位的51單片機(jī)來(lái)說(shuō),要實(shí)現(xiàn)1000×1000或者小數(shù)是比較困難的。老師推薦用C,之前只是看書(shū)實(shí)現(xiàn)過(guò)一些小東西這回要做比較大的項(xiàng)目了,雖然還有其他課題比如溫度計(jì)和數(shù)字鐘,不過(guò)都做過(guò),只是環(huán)境不一樣,修改一下代碼太沒(méi)有挑戰(zhàn)性了。

  確實(shí)開(kāi)始輕敵了,真正做的時(shí)候發(fā)現(xiàn)不是那么簡(jiǎn)單,

   高中的時(shí)候?qū)W過(guò)一點(diǎn)VB做過(guò)計(jì)算器,如果讓我現(xiàn)在做,也許給我?guī)滋煳铱梢宰龀鰜?lái),用C我也沒(méi)什么問(wèn)題,但是C51就有難度了,要考慮太多硬件的東西,特別是顯示這個(gè)模塊好不容易瘦下去的頭又兩個(gè)大了。等我真正意識(shí)到的時(shí)候,已經(jīng)過(guò)去幾個(gè)禮拜了,呵呵,要和朋友說(shuō)抱歉了,雖然我答應(yīng)“等我做完計(jì)算器之后再幫你改下程序”但是沒(méi)一個(gè)實(shí)現(xiàn)。

    當(dāng)然,此程序因?yàn)榛救亲约簩?xiě)的,被方晉甬老師稱之為“程序設(shè)計(jì)不成熟、比較亂”的,額,本來(lái)準(zhǔn)備用switch語(yǔ)句,但是呂昂老師說(shuō)switch語(yǔ)句會(huì)產(chǎn)生過(guò)多閑置寄存器(可是他沒(méi)有考慮到我僅僅是實(shí)現(xiàn)很少的功能),這段程序只實(shí)現(xiàn)+-×÷,符號(hào)閃爍,過(guò)八位報(bào)錯(cuò)等功能但是沒(méi)有小數(shù),只能計(jì)算一步(加少數(shù)程序即可計(jì)算多部)。其實(shí)程序挺早就寫(xiě)出來(lái)了,只是一直出不來(lái)效果,后來(lái)在仿真和VC++編譯環(huán)境下修改了很多,理論上是可以實(shí)現(xiàn)了,可是還是沒(méi)有顯示,于是抓狂了“看來(lái)我已處在瓶頸...”,晃了最后一個(gè)禮拜,周日周一看了兩天晚上,依然沒(méi)有看出什么來(lái),禮拜二去方晉甬老師辦公室請(qǐng)教,查了近3個(gè)鐘頭【基本看過(guò)了我所有奇形怪狀的子程序—。—||||】,在仿真多遍之后發(fā)現(xiàn)就少了一句“while(!key)【檢測(cè)釋放按鍵】”【程序中紅字部分即主程序最后一句】囧啊~~~~以至于周四答辯的時(shí)候我演示之后,剛點(diǎn)看ppt他就說(shuō)直接給A,不用答了。。。。
程序的完整版下載地址:http://www.raoushi.com/ziliao/file/jsjq.rar 

/////////////////////////////****************程序*****************///////////////////////
 

#include<reg51.h>
#include<math.h>
sbit  cs=P2^6;
sbit clk=P1^0;
sbit dat=P1^1; 
sbit key=P3^3; 
bit  add,sub,mul,div,equ,clr;
unsigned char times,st,l,data_jp,flag,d;


unsigned int  tmr;
unsigned long    num[8],sn[8],disp[8],sh,result,hp=100000000;

void send(unsigned char);
unsigned char receive(void);
unsigned long real(unsigned long ,unsigned char);
unsigned long calcu(unsigned   long, unsigned long);
void display(unsigned long);
unsigned long write_key(unsigned   char);

void char_flk(void);
void test(void);
void error(void);
void long_delay(void);
void short_delay(void);
void delay10ms(unsigned char);  

/////////**************主函數(shù)****************//////////

void main ()
{
   times=0;
   l=times;
   st=0;
   flag=0;
   test();

   while(1)
   {
     unsigned char i;
     if(!key)
     {   
       send(0x15);
       data_jp=receive();
       cs=1;
       d=write_key(data_jp);
       if (data_jp<=9)
       {
         flag=0;
         num[times]=d;
       }
       else
       {
         flag=1;
         //times-=1;
       }
       if(flag!=1)
       { 

       
           if(num[0]==0)
           {
             times=0;
             continue;
           }
           if(7>times>=1)
           {
             send(0xa1);
         }

            send(0x80);
            send(num[times]);
            while(!key); 
             delay10ms(1);
            times=times+1;
            cs=1;

          if(times>7)
          {
            send(0xa4);
            error() ;
           times=0;
           send(0xa4); 
          }
       }
       else
       {
           send(0xa4);
           char_flk();
           
           
           times-=1;
           l=times;
           for(i=0;i<=times;i++)    
           {
           
             num[i]=real(num[i],l);
             sh=sh+num[i];
               l--;           
           }
          
           sn[st]=sh;
         
           if(st>=1)
           {
             result=calcu(sn[st],sn[st-1]);
             sn[st-1]=result;
             st--;           
           }
           st++;
           times=0;
           flag=0;
           sh=0;

          
         if(equ==1)
         {  
           st=0;           
           send(0xa4);
           display(result);
           equ=0;
         }
         if(clr==1)
         {
           st=0;
           times=0;
           flag=0;
           sh=0;
           add=0;
           sub=0;
           mul=0;
           div=0;
           equ=0;
           clr=0;
           send(0xa4);
         }
         while(!key);
        
         }
       }

     
    }
}
/////////*********************測(cè)試子函數(shù)****************////////
void test(void)
{   
    
    char i;
       delay10ms(2);
  
    send(0xbf);
    cs=1; 
    for (i=0;i<=3;i++)    
      {
      delay10ms(100);
    }
    send(0xa4);
    cs=1;
      delay10ms(20);

}
///////***********************讀鍵盤(pán)程序**************///////
unsigned long write_key(unsigned char data_jp)
{
  unsigned char shuzi;

  if(data_jp<10)
  {
 
      shuzi=data_jp;
  }
  else
  {
     if(data_jp==10)
     {

        add=1;
     }
     else  if(data_jp==11)
     {
      sub=1;
     }
     else if(data_jp==12)
     {

      mul=1;
     }
     else if(data_jp==13)
     {

      div=1;
     }
     else if(data_jp==14)
     {

      equ=1;
     }
     else if(data_jp==15)
     {
      clr=1;
     }
     shuzi=0xff;
  }
    return(shuzi) ;
}

///////***********************發(fā)送子函數(shù)*************//////
void send(unsigned char data_out) 
{
   unsigned char i;
   cs=0;
   long_delay();
   for(i=0;i<=7;i++)
   {

    if(data_out&0x80)
    {
        dat=1;
    }
    else
    {
      dat=0;
    }
    clk=1;
    short_delay();
    clk=0;
    short_delay();
    data_out=data_out<<1;

   }
   
    dat=0;
}

/////************************接收鍵盤(pán)子函數(shù)************//////
unsigned char receive(void)
{
   unsigned char i,data_in;
   dat=1;
   long_delay();
   for(i=0;i<=7;i++)
   {
     clk=1;
   short_delay();
   data_in=data_in<<1;
   if(dat)
   {
    data_in=data_in|0x01;
   }
   else
   {
      data_in=data_in|0x00;
   }
   clk=0;
   short_delay();

   }
   dat=0;
   return(data_in);
}
/////////***************************顯示數(shù)字處理子函數(shù)***********/////////
unsigned long real(unsigned long so, unsigned char s)
{
  unsigned char z;
     if(s!=0)
  {
    for(z=0;z<=(s-1);z++)
    {
         if(s!=0)
     {
       so=so*10;
     }
     else
     {
       so=so;
     }
     
    }
   }
   else
   {
      so=so;
   }
  return(so);
}

//////////*************************計(jì)算子函數(shù)*******************///////////
unsigned long calcu(unsigned   long    sn0,unsigned   long   sn1  ) 
{
  if(add==1)
  {
    sn0=sn0+sn1;
    add=0;
  }
  if(sub==1)
  {
    sn0=sn1-sn0;
    sub=0;
  }
  if(mul==1)
  {
     sn0=sn0*sn1;
    mul=0;
  }
  if(div==1)
  {
    if(sn0>0)
      sn0=sn1/sn0;
    else 
      error();
    div=0;
  }
  return(sn0);

}


////////****************************報(bào)錯(cuò)錯(cuò)誤子函數(shù)***************/////////
void error(void)
{
 while(key)
 {
      send(0x96);
     send(0x4f);
     delay10ms(2);
     send(0x95);
     send(0x05);
     delay10ms(2);
     send(0x94);
     send(0x05);
     delay10ms(2);
     send(0x93);
     send(0x1d);
     delay10ms(2);
     send(0x92);
     send(0x05);
     delay10ms(2);    
 }
}
///////////********************顯示子函數(shù)*********////////////
void display(unsigned long display)
{
 unsigned char i,asus=8;
 if(display>99999999)
  error();  
 else
 {  
   for(i=0;i<=7;i++)
   {
      if((display/hp)>=1)
         break;
      else
      {
         hp=hp/10;
         asus-=1;
      }
   }
   for(i=0;i<=asus;i++)
   {
         
         disp[i]=display/hp;
         if(hp>1)
         {
            display=display%hp;
            hp=hp/10;
           }
    }
    for(i=0;i<=asus;i++)
    {
       if(i>0)
      { send(0xa1); }
      send(0x80);
      send(disp[i]);
      
    }
 }
}

///////////********************符號(hào)判斷閃爍顯示*********////////////
void char_flk(void)
{
        if(add==1)
       {
         send(0x97);
         send(0x77);
       }
       else if(sub==1)
       {
         send(0x97);
         send(0x01);
       }
       else if(mul==1)
       {
         send(0x97);
         send(0x37);
       }
       else if(div==1)
       {
         send(0x97);
         send(0x49);
       }
       else if(clr)
       {
           ;
       }
       send(0x88);
       send(0x7f);
}
//////************************延時(shí)子函數(shù)*************///////

void long_delay(void)
{
 char i;
 for(i=0;i<=25;i++) ;
}

void short_delay(void)
{
 char j;
 for(j=0;j<=4;j++);

}


void delay10ms(unsigned char time)
{
 unsigned char i;
 unsigned int j;
 for (i=0;i<=time;i++)
 {
  for(j=0;j<=0x390;j++);

 }
}

///////////////////////////************效果圖*************////////////////////

以上演示的為9876543÷234,其本來(lái)的結(jié)果是42207.4487179……無(wú)法顯示小數(shù)位,所以結(jié)果為42207 。

關(guān)閉窗口

相關(guān)文章