新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 單片機設計的帶余數(shù)的簡易計算器

單片機設計的帶余數(shù)的簡易計算器

作者: 時間:2016-09-29 來源:網(wǎng)絡 收藏

  原理圖:

本文引用地址:http://butianyuan.cn/article/201609/310574.htm

  

 

  

 

  

 

  程序設計:

  #include

  #include

  #include

  #define uchar unsigned char

  #define uint unsigned int

  sbit BEEP = P3^6; //蜂鳴器驅(qū)動線

  unsigned char code disp_code[]={

  0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,

  0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf};//數(shù)碼管顯示

  uchar key; //鍵盤值

  uchar num; //掃描位數(shù)

  int temp1=0; //結(jié)果整數(shù)部分

  uint temp2=0; //結(jié)果余數(shù)部分

  int m=0; //

  uchar ss[8]; //

  uchar flag; //運算標志位

  bit c_flag=0; //輔助標志位

  unsigned char code key_code[]={

  0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,

  0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77 }; //鍵盤編碼

  unsigned char code num_code[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; //顯示位數(shù)

  /**********************************************************

  延時子函數(shù)

  **********************************************************/

  void delayms(uint ms)

  {

  uchar t;

  while(ms--)

  {

  for(t = 0; t < 120; t++);

  }

  }

  /**********************************************************

  x*0.14MS 延時子函數(shù)

  **********************************************************/

  void delay0(uchar x)

  {

  uchar i;

  while(x--)

  {

  for (i = 0; i<13; i++);

  }

  }

  /**********************************************************

  蜂鳴器驅(qū)動子函數(shù)

  **********************************************************/

  void beep()

  {

  uchar i;

  for (i=0;i<180;i++)

  {

  delay0(5);

  BEEP=!BEEP; //BEEP取反

  }

  BEEP=1; //關閉蜂鳴器

  delayms(250); //延時

  }

  /**********************************************************

  鍵盤掃描子函數(shù)

  **********************************************************/

  uchar keyscan()

  {

  uchar scan1,scan2,keycode,j;

  P1=0xf0;

  scan1=P1;

  if((scan1&0xf0)!=0xf0) //判鍵是否按下

  {

  delayms(10); //延時30ms

  scan1=P1;

  if((scan1&0xf0)!=0xf0) //二次判鍵是否按下

  {

  P1=0x0f;

  scan2=P1;

  keycode=scan1|scan2; //組合成鍵編碼

  for(j=0;j<=15;j++)

  {

  if(keycode== key_code[j]) //查表得鍵值

  {

  key=j;

  return(key);

  }

  }

  }

  }

  else P1=0xff;

  return (16);

  }

  /*****************************************************

  顯示數(shù)據(jù)子程序

  ********************************************************/

  void display(int xx,uint yy)

  { uchar tt=0;

  uint x1;

  uint y1=yy;

  while(yy!=0) //顯示余數(shù)

  {ss[tt]=yy%10;

  yy=yy/10;

  tt++ ;

  num=tt;

  }

  if(y1!=0) //顯示——

  {ss[tt]=16;

  tt++;

  ss[tt]=16;

  tt++;

  }

  x1=abs(xx); //顯示整數(shù)

  while(x1!=0)

  {ss[tt]=x1%10;

  x1=x1/10;

  tt++ ;

  num=tt;

  }

  if(xx<0) //顯示符號

  { ss[tt]=16;

  tt++;

  num=tt;}

  for(tt=0;tt

  {

  P0=disp_code[ss[tt]];

  delayms(5);

  if(P2==num_code[num-1])

  P2= 0x7f;

  else P2=_cror_(P2,1);

  }

  }

  /**********************************************************

  判鍵是否按下子函數(shù)

  **********************************************************/

  void keydown()

  {

  uchar tt=0;

  P1=0xf0;

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

  {

  keyscan();

  beep();

  if(key>9&&c_flag==0)

  {switch(key)

  {case 10:flag=1;temp1=m;c_flag=1;m=0;break;

  case 11:flag=2;temp1=m;c_flag=1;m=0;break;

  case 12:flag=3;temp1=m;c_flag=1;m=0;break;

  case 13:flag=4;temp1=m;c_flag=1;m=0;break;

  case 14:m=-m;break;

  case 15:break;

  }

  }

  if(key==14&&c_flag==1)

  m=-m;

  if(key<=9)

  {if(m>=0) m=m*10+key;

  if(m<0) m=m*10-key; }

  if(key<=9&&flag==5)

  {

  flag=0;

  c_flag=0;

  temp1=temp2=0;

  }

  }

  if(key==15)

  {switch(flag)

  {case 1:temp1=temp1+m;break;

  case 2:temp1=temp1-m;break;

  case 3:temp1=temp1*m;break;

  case 4:temp2=abs(temp1)%m;temp1=temp1/m;break;

  default:;

  }

  flag=5;

  m=0;

  }

  }

  void main()

  {

  P0 = 0xc0;

  P2 = 0x7f; //數(shù)碼管顯示"0"

  P1 = 0xff;

  while(1)

  {

  keydown();

  if(flag==5)

  display(temp1,temp2);

  else display(m,0);

  }

  }

  實物照片:

  



關鍵詞: 單片機 計算器

評論


相關推薦

技術專區(qū)

關閉