⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 计算器程序.c

📁 51单片机计算器程序
💻 C
字号:
#include<reg51.h>
#include<stdio.h>
#include<stdlib.h>
#include<intrins.h>
#include<absacc.h>
#define uchar unsigned char
#define uint unsigned int
uchar temp1;
void displaylistchar(unsigned char x, unsigned char y, uchar ddata);
uchar dispbuf[]={'0','1','2','3','4','5','6','7','8','9',':'};
uchar second; 
uchar minute;
uchar hour;
uint tcnt,g;
uchar flag;
void dlms(void);
uchar kbscan(void);
void show_time(void);
void delay5ms(void);
  void dlms(void);
   void settime(uchar verify);//verify 在这里为调整的意思
 void delay400ms(void) ;
///#define busy 0x80 file://用/于检测lcd状态字中的busy标识
///#define rsaddr 0x1000
///#define rwaddr 0x2000
///#define csaddr 0x0400
#define wc 0x8fff
#define wd 0xdfff
#define rc 0xbfff
void waitlcd()                     //just wait until 液晶不忙为止
  {
    char temp;
    bit flag=1;
    while(flag==1)
    {
       temp=xbyte[rc];
       if (temp>>7==0) flag=0;
       p1=temp;
    }
      p1=0xff;
  }
                                    //just wait until 液晶不忙为止
void writecommand_lcd(bit ischeck,char c)   
  {
    if (ischeck==1) waitlcd();
     xbyte[wc]=c;
  }
void writedata(char c)
{
    waitlcd();
    xbyte[wd]=c;
}
void lcdinit()
  {
    delay5ms();
  delay5ms();
 delay5ms();
 writecommand_lcd(0,0x38); //三次显示模式设置,不检测忙信号
 delay5ms();
 writecommand_lcd(0,0x38);
 delay5ms();
 writecommand_lcd(0,0x38);
 delay5ms();
 writecommand_lcd(1,0x38); //显示模式设置,开始要求每次检测忙信号,8位2行5*7
 writecommand_lcd(1,0x08); //关闭显示
 writecommand_lcd(1,0x01); //清显示
 writecommand_lcd(1,0x06); // 文字不动,光标右移
 writecommand_lcd(1,0x0c); // 显示开及光标设置
  }

void displaylistchar(unsigned char x, unsigned char y, uchar ddata)
  {
 y &= 0x1;
 x &= 0xf;
 if (x <= 0xf)
   {
    y &= 0x1;
 x &= 0xf;
 if (y) x |= 0x40;
 x |= 0x80;
 writecommand_lcd(0,x);
 writedata(dispbuf[ddata]);
 
   }
 }
 void show_time(unit k)
{
   displaylistchar(0,0,hour/10);
   displaylistchar(1,0,hour%10);
   displaylistchar(2,0,10);
   displaylistchar(3,0,minute/10);
   displaylistchar(4,0,minute%10);
   displaylistchar(5,0,10);
   displaylistchar(6,0,second/10);
   displaylistchar(7,0,second%10);
 switch(k)
{
  case 1: displaylistchar(0,1,1);
  case 2: displaylistchar(0,1,2);
  case 3: displaylistchar(0,1,3);
  case 4: displaylistchar(0,1,4);
  case 5: displaylistchar(0,1,5);
  case 6: displaylistchar(0,1,6);
  case 7: displaylistchar(0,1,7);
  case 8: displaylistchar(0,1,8);
  case 9: displaylistchar(0,1,9);
  case 10:displaylistchar(0,1,10);
  case 11:displaylistchar(0,1,11);
  case 12:displaylistchar(0,1,12);
  case 13:displaylistchar(0,1,13);
  case 14:displaylistchar(0,1,14);
  case 15:displaylistchar(0,1,15);
  case 16:displaylistchar(0,1,16);
 }
 

 void settime(uchar verify)
{
  //键盘设置
//    1 /hour+    (0xee)     2/minute+  0xde   3/second+  0xbe     +
// 4/hour-   0xed   5/ minute-   0xdd     6/second-    0xbd        -
// 7   8   9   *
// 0  clr  =   /
  ////hour+的代码
   if(flag)
   {
    if (verify==0xee)
   {
         dlms();
   if (verify==0xee)
   {
           hour++;
                 if(hour==24)
                {
                  hour=0;
                }
    //while(verify==0xee);           
      verify=0x00;
        }
   //    1 /hour+    (0xee)     2/minute+  0xde   3/second+  0xbe
 }
  ///minute +的代码
   else if (verify==0xde)
   {
         dlms();
   if (verify==0xde)
   {
           minute++;
                 if(minute==60)
                {
                 minute=0;
                }
    //while(verify==0xde);           
      verify=0x00;
        }
   //    1 /hour+    (0xee)     2/minute+  0xde   3/second+  0xbe
  }
//////second++的代码
    else if (verify==0xbe)
   {
         dlms();
   if (verify==0xbe)
   {
           second++;
                 if(second==60)
                {
                 second=0;
                }
   // while(verify==0xbe);           
       verify=0x00;
        }    
   //    1 /hour+    (0xee)     2/minute+  0xde   3/second+  0xbe
  }
//////hour- (0xed) 的代码
  else if (verify==0xed)
   {
        dlms();
   if (verify==0xed)
   {
    if(hour==0)
          {hour=24;
     }
     hour--;
                // if(hour==0)
               // {
               //   hour=23;
                //}
    //while(verify==0xed);           
      verify=0x00;
        }
  
 }
 // 4/hour-   0xed   5/ minute-   0xdd     6/second-    0xbd
///下面为minute -的代码
    else  if (verify==0xdd)
   {
        dlms();
   if (verify==0xdd)
   {     if(minute==0)
          {minute=60;}
           minute--;
                 //if(minute==0)
                //{
                // minute=59;
                //}
    //while(verify==0xdd);           
      verify=0x00;
        }
   
  }
// 4/hour-   0xed   5/ minute-   0xdd     6/second-    0xbd
///下面为second -的代码
  else  if (verify==0xbd)
   {
         dlms();
   if (verify==0xbd)
   { if(second==0)
          {second=60;}
           second--;
                 //if(second==0)
                //{
                // second=59;
                //}
   // while(verify==0xbd);           
       verify=0x00;
        }     
 // 4/hour-   0xed   5/ minute-   0xdd     6/second-    0xbd 
  }
}
   
}

void main(void)
{
  
    tmod=0x02; //置自动重装载模式
    th0=0x06;   //设初值
    tl0=0x06;  //设初值
    tr0=1;     //开始计数
    et0=1;    //开定时器/计数器
    ea=1;     //中断开
    delay400ms();//启动等待,等lcm讲入工作状态
    lcdinit();     //lcm初始化
    while(1)
   { 
       uchar key;
      key=kbscan();
    dlms(); 
    show_time();
   // if ((key==0xee)||(key==0xbe)||(key==0xde)||(key==0xed)||(key==0xdd)||(key==0xbd))
   if (key!=0)
   {
         if (key==0x7e)
           {
              dlms();
   if (key==0x7e)
   {
       ea=0;
    flag=1;
               
                }
    //while(verify==0xee);           
      key=0x00;
        }
     
   if (key==0x7d)
   {
         dlms();
   if (key==0x7d)
   {
       ea=1;
    flag=0;
               
                }
    //while(verify==0xee);           
      key=0x00;
        }
  
         settime( key );
         delay400ms();
   }
    }
}
    
void delay5ms(void)          
  {
   unsigned int tempcya = 277;
 while(--tempcya);
  }      

 
  //延时400ms
void delay400ms(void)          
  {
   unsigned int tempcya = 22160;
 while(--tempcya);
  }                     
  //延时400ms
 

void timer0(void) interrupt 1 using 1
{  
  tcnt++;
  if(tcnt==2000)
    {
      tcnt=0;
      second++;
      if(second==60)
        {
          second=0;
          minute++;
          if(minute==60)
            {
              minute=0;
              hour++;
              if(hour==24)
                {
                  hour=0;    
                }

             }
   
         }
     }
  
      }
//键盘扫描
uchar kbscan(void)
{  
    uchar sccode;
 p1=0xf0;
 if( (p1&0xf0)!=0xf0 )
 {
     dlms();
  if((p1&0xf0)!=0xf0)
  {
     sccode=0xfe;
     while ((sccode&0x10)!=0)
     {
         p1=sccode;
      if ((p1&0xf0)!=0xf0)
       {
        temp1=p1;
     return  temp1;
    }
    else
    {
       sccode=(sccode<<1)|0x01;
                }
         
      }
        }
      }
return (0);
}
            
void dlms(void)
{   
      g=554;
      while(g--);  //延时10ms钟
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -