简易计算器数码管显示变化范围0~F,上电时显示0,1每按下K1键一次,数值加1,2每按下K2键一次,数值减1,3每按下K3键数值归零。

简易计算器数码管显示变化范围0~F,上电时显示0,1每按下K1键一次,数值加1,2每按下K2键一次,数值减1,3每按下K3键数值归零。

这个问题的难点在于检测按键,用中断可以实现,如果不用中断,PLC上的上升沿方式可以考虑,编程原理:设定一个很短的扫描周期,0.1s或者更短,按键1,0.1s前是0,0.1s后是1,就可以判定按键动作,即上升沿,程序中数据+1,0.1s前是0,0.1s后是0或者0.1s前是1,0.1s后是1,表示按键无动作,0.1s前是1,0.1s后是0,判定按键松开,即下降沿,我以前用STC单片机写的程序可以参考下,跟你的功能差不多:
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
sbit KEY=P1^4; //定义按键输入端口
sbit LED=P1^2; //定义led输出端口
sbit LED1=P1^1;
sbit LED2=P1^0;
#define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换
sbit LATCH1=P2^2;//定义锁存使能端口 段锁存
sbit LATCH2=P2^3;// 位锁存
unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//段码
unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//数码管码
unsigned char TempData[8]; //存储显示值的全局变量
void Delay(unsigned int t); //函数声明
void Display(unsigned char FirstBit,unsigned char Num);
void DelayUs2x(unsigned char t);//函数声明
void DelayMs(unsigned char t);
void main (void)
{ unsigned int num=9999;
unsigned int j;
unsigned int a;
unsigned int m;
bit n1;
bit n2;
bit n3;
KEY=1; //按键输入端口电平置高
n1=1;
n2=KEY;
a=0;
while (1) //主循环
{ j++;
m=!KEY;
if(j==10) //检测当前数值显示了一小段时间后
{j=0;
a++;
n3=KEY;
if(a==100)
{a=0;
n1=!n1;
LED1=n1;
}
if((n3^n2))
{n2=n3;
if(n3==0) //上升沿
LED=!LED;
else //下降沿
LED2=!LED2;
}

完整代码


#include<reg51.h>
 
int digit[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
int box[4]={0};
int i;
int KeyValue;       
int KeySwitch;
void delay(int ms)    
{
 int x,y;
 for(x= ms;x>0;x--)
 for(y=110;y>0;y--);
}
    void display()   
    {   
      
      P2=0x01;
      P3=digit[box[3]];
      delay(10);
      
      P2=0x02;
      P3=digit[box[2]];
      delay(10);
      
      P2=0x04;
      P3=digit[box[1]];
      delay(10);
      
      P2=0x08;
      P3=digit[box[0]];
      delay(10);
      
    }
    void KeyDown(void)
    {  int a;
       a=0;     
       P1=0xf0;
       if(P1!=0xf0)
       {
              delay(20);
           if(P1!=0xf0)
           {  
                P1=0xf0;
             switch(P1)
            {
                case(0Xe0): KeyValue=0;break;
                case(0Xd0): KeyValue=1;break;
                case(0Xb0): KeyValue=2;break;
                case(0X70): KeyValue=3;break;
            }
            P1=0x0f;
            switch(P1)
            {
                case(0X0e): KeyValue=KeyValue;break;
                case(0X0d): KeyValue=KeyValue+4;break;
                case(0X0b): KeyValue=KeyValue+8;break;
                case(0X07): KeyValue=KeyValue+12;break;
            }
            if(KeyValue==0 || KeyValue==1 || KeyValue==2 || KeyValue==3 || KeyValue==4 || KeyValue==5 || KeyValue==6 || KeyValue==7 || KeyValue==8 || KeyValue==9)
               {
                   KeySwitch=1;
               }
             while((a<50)&&(P1!=0x0F)) 
            {
                delay(100);
                a++;
            }
           }
       }
      
    }
    void main()
    { 
      int a,b,c;
      while(1){
           
           display();                   
         KeyDown();
         if(KeySwitch==1)  
         {                                 
            for(i=3;i>0;i--)              
            {box[i]=box[i-1];}             
            box[0]=KeyValue;                            
            KeySwitch=0;                                  
         }
         else if(KeyValue==10)       
         { 
              for(i=0;i<4;i++)
                  box[i]=0;             
    
                  display(); 
        }
        else if(KeyValue==12)   
         {
             a=box[0]+box[1]*10+box[2]*100+box[3]*1000;   
             
                       for(i=0;i<4;i++)
                      box[i]=0;
                      
             while(1)                                  
             {
                     display();
                     KeyDown();
                    
                     if(KeySwitch==1)
                     {  
                        for(i=3;i>0;i--)
                        {box[i]=box[i-1];}
                        box[0]=KeyValue;
                        KeySwitch=0;
                     }
                                         
                    if(KeyValue==11) break; 
              }
                            
              b=box[0]+box[1]*10+box[2]*100+box[3]*1000;  
             
             c=a+b;
             box[0]=c%10;                    
             box[1]=c/10%10;
             box[2]=c/100%10;
             box[3]=c/1000%10;
             
 
             display();
        }
        
        
          else    if(KeyValue==13)      
         {
             a=box[0]+box[1]*10+box[2]*100+box[3]*1000;
             for(i=0;i<4;i++)
             box[i]=0;
             while(1)
             {                                    
                     display();
                     KeyDown();
                     
                     if(KeySwitch==1)
                     {  
                        for(i=3;i>0;i--)
                        {box[i]=box[i-1];}
                        box[0]=KeyValue;
                        KeySwitch=0;
                     }
                      if(KeyValue==11) break;
             }
                                                  
             b=box[0]+box[1]*10+box[2]*100+box[3]*1000;  
            
               c=a-b;
               box[0]=c%10;                 
               box[1]=c/10%10;
               box[2]=c/100%10;
               box[3]=c/1000%10;
             
               display();
           }
 
 
           else   if(KeyValue==14)       
         {
             a=box[0]+box[1]*10+box[2]*100+box[3];
             for(i=0;i<4;i++)
             box[i]=0; 
             while(1)
             {                                     
                     display();
                     KeyDown();
                     
                     if(KeySwitch==1)
                     {  
                        for(i=3;i>0;i--)
                        {box[i]=box[i-1];}
                        box[0]=KeyValue;
                        KeySwitch=0;
                     }
                    if(KeyValue==11) break;
              }
              b=box[0]+box[1]*10+box[2]*100+box[3]*1000;   
             c=a*b;
             box[0]=c%10;                 
             box[1]=c/10%10;
             box[2]=c/100%10;
             box[3]=c/1000%10;
           
             display();
         }
 
 
         else  if(KeyValue==15)       
         {
             a=box[0]+box[1]*10+box[2]*100+box[3]*1000;
             for(i=0;i<4;i++)
             box[i]=0;
             while(1)                                
             {
                     display();
                     KeyDown();
                     if(KeySwitch==1)
                     {  
                        for(i=3;i>0;i--)
                        {box[i]=box[i-1];}
                        box[0]=KeyValue;
                        KeySwitch=0;
                     }
                     if(KeyValue==11) break;
              }
              b=box[0]+box[1]*10+box[2]*100+box[3]*1000;
              if(b==0){
               P2=0x01;
                 P3=0x86;
               delay(200);
      
               P2=0x02;
                 P3=0x88;
                 delay(200);
      
                P2=0x04;
                 P3=0x88;
                 delay(200);
      
                P2=0x08;
               P3=0xC0;
                delay(200);
               break;
              }   
             c=a/b;
             box[0]=c%10;                  
             box[1]=c/10%10;
             box[2]=c/100%10;
             box[3]=c/1000%10;
             
             display();               
         }
 
      }
 
    }