这里使用的是普中科技的A2开发板,开发板用了一个38译码器来控制数码管,利用数码管动态显示可以实现一个简易计算器的功能。
- #include <reg52.h>
- #define GPIO_KEY P1
- #define u16 unsigned int
- #define u8 unsigned char
- sbit LSA=P2^2;
- sbit LSB=P2^3;
- sbit LSC=P2^4;
- u8 b[8]={0,0,0,0,0,0,0,0};
- u16 num1,num2,mode;
- int KeyValue;
- u8 DisplayData[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
- u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- void delay(u16 i)
- {
- u8 k;
- while(i--)
- for(k=110;k>0;k--);
- }
- void KeyDown()
- {
- GPIO_KEY=0x0f;
- if(GPIO_KEY!=0x0f)
- {
- delay(10);
- if(GPIO_KEY!=0x0f)
- {
- GPIO_KEY=0X0f;
- switch(GPIO_KEY)
- {
- case(0X07): KeyValue=9;break;
- case(0X0b): KeyValue=8;break;
- case(0X0d): KeyValue=7;break;
- case(0X0e): KeyValue=-1;break;
- }
- GPIO_KEY=0Xf0;
- switch(GPIO_KEY)
- {
- case(0X70): KeyValue=KeyValue;break;
- case(0Xb0): KeyValue=KeyValue-3;break;
- case(0Xd0): KeyValue=KeyValue-6;break;
- case(0Xe0): KeyValue=KeyValue-9;break;
- }
- }
- if(KeyValue>=0)
- {
- mode=1;
- }
- else if(KeyValue==-1)
- {
- mode=2;
- }
- else if(KeyValue==-4)
- {
- mode=3;
- }
- else if(KeyValue==-7)
- {
- mode=4;
- }
- else if(KeyValue==-10)
- {
- mode=5;
- }
- else if(KeyValue==-2)
- {
- mode=6;
- }
- while(GPIO_KEY!=0Xf0)
- {
- delay(1);
- }
- }
- }
- void DigDisplay()
- {
- u8 j;
- for(j=0;j<8;j++)
- {
- switch(j)
- {
- case(7):
- LSA=1;LSB=1;LSC=1;break;
- case(6):
- LSA=0;LSB=1;LSC=1;break;
- case(5):
- LSA=1;LSB=0;LSC=1;break;
- case(4):
- LSA=0;LSB=0;LSC=1;break;
- case(3):
- LSA=1;LSB=1;LSC=0;break;
- case(2):
- LSA=0;LSB=1;LSC=0;break;
- case(1):
- LSA=1;LSB=0;LSC=0;break;
- case(0):
- LSA=0;LSB=0;LSC=0;break;
- }
- P0=DisplayData[j];
- delay(1);
- P0=0x00;
- }
- }
- void Init_timer0()
- {
- TMOD=0x01;
- TH0=0xb8;
- TL0=0x00;
- EA=1;
- ET0=1;
- TR0=1;
- }
- void output_number(u16*p,u16 t);
- void main()
- {
- u16 i,f,g=0,d;
- u16 num[8]={0,0,0,0,0,0,0,0};
- Init_timer0();
- while(1)
- {
- KeyDown();
- if(mode==1)
- {
- for(i=7;i>0;i--)
- {
- b[i]=b[i-1];
- }
- b[0]=KeyValue;
- if(g==0)
- {
- num1=(b[7]*10000000 + b[6]*1000000 + b[5]*100000 + b[4]*10000 + b[3]*1000 + b[2]*100 + b[1]*10 + b[0]);
- }
- else
- {
- num2=(b[7]*10000000 + b[6]*1000000 + b[5]*100000 + b[4]*10000 + b[3]*1000 + b[2]*100 + b[1]*10 + b[0]);
- }
- for(i=0;i<8;i++)
- {
- if(b[i]!=0)
- {
- f=i+1;
- }
- }
- for(i=0;i<f;i++)
- {
- DisplayData[i]=smgduan[b[i]];
- }
- mode=0;
- }
-
- if(mode==2)
- {
- for(i=0;i<8;i++)
- {
- b[i]=0;
- DisplayData[i]=0x00;
- }
- mode=0;
- g++;
- d=1;
- }
- if(mode==3)
- {
- for(i=0;i<8;i++)
- {
- b[i]=0;
- DisplayData[i]=0x00;
- }
- mode=0;
- g++;
- d=2;
- }
- if(mode==4)
- {
- for(i=0;i<8;i++)
- {
- b[i]=0;
- DisplayData[i]=0x00;
- }
- mode=0;
- g++;
- d=3;
- }
- if(mode==5)
- {
- for(i=0;i<8;i++)
- {
- b[i]=0;
- DisplayData[i]=0x00;
- }
- mode=0;
- g++;
- d=4;
- }
- if(mode==6)
- {
- if(d==1)
- {
- output_number(num,num1+num2);
- for(i=0;i<8;i++)
- {
- if(num[i]!=0)
- {
- f=i+1;
- }
- }
- for(i=0;i<f;i++)
- {
- DisplayData[i]=smgduan[num[i]];
- }
- for(i=f;i<8;i++)
- {
- DisplayData[i]=0x00;
- }
- }
- if(d==2)
- {
- output_number(num,num1-num2);
- for(i=0;i<8;i++)
- {
- if(num[i]!=0)
- {
- f=i+1;
- }
- }
- for(i=0;i<f;i++)
- {
- DisplayData[i]=smgduan[num[i]];
- }
- for(i=f;i<8;i++)
- {
- DisplayData[i]=0x00;
- }
-
- }
- if(d==3)
- {
- output_number(num,num1*num2);
- for(i=0;i<8;i++)
- {
- if(num[i]!=0)
- {
- f=i+1;
- }
- }
- for(i=0;i<f;i++)
- {
- DisplayData[i]=smgduan[num[i]];
- }
- for(i=f;i<8;i++)
- {
- DisplayData[i]=0x00;
- }
- }
- if(d==4)
- {
- output_number(num,num1/num2);
- for(i=0;i<8;i++)
- {
- if(num[i]!=0)
- {
- f=i+1;
- }
- }
- for(i=0;i<f;i++)
- {
- DisplayData[i]=smgduan[num[i]];
- }
- for(i=f;i<8;i++)
- {
- DisplayData[i]=0x00;
- }
- }
- }
-
- }
- }
- void output_number(u16 *p,u16 t)
- {
- p[7]=t/10000000;
- p[6]=(t%10000000)/1000000;
- p[5]=((t%10000000)%1000000)/100000;
- p[4]=(((t%10000000)%1000000)%100000)/10000;
- p[3]=(((t%10000000)%1000000)%100000)%10000/1000;
- p[2]=(((t%10000000)%1000000)%100000)%10000%1000/100;
- p[1]=(((t%10000000)%1000000)%100000)%10000%1000%100/10;
- p[0]=(((t%10000000)%1000000)%100000)%10000%1000%100%10;
- }
- void timer0() interrupt 1
- {
- TH0=0xb8;
- TL0=0x00;
- DigDisplay();
- KeyDown();
- }
复制代码
|