|
單片機源程序如下:
- #include<reg51.h>
- #define uchar unsigned char
- uchar a0=16,b0=16,c0=16,d0=16,e0=16,f0=16,wei,temp,key,i,j,k;
- uchar jia,jian,cheng,chu,dengyu,jia0,jian0,cheng0,chu0,qingling;
- uchar s0,s1,s2,s3,s4,s5; //參加運算的各個位
- unsigned long qian,hou; //定義參于運算的第一個數(shù)和第二個數(shù)(前和后)。
- sbit beep=P2^3; //定義蜂鳴器管腳
- sbit cp1 = P2^6; //定義管腳
- sbit cp2 = P2^7;
- uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
- 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; //陰極編碼
- uchar table1[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
- uchar wei0=0,wei1=1,wei2=2,wei3=3,wei4=4,wei5=5,wei6=6,wei7=7;
- void delay(uchar i)
- {
- for(j=i;j>0;j--)
- for(k=125;k>0;k--);
- }
- void display(uchar a,uchar b,uchar c,uchar d,uchar e,uchar f)
- {
- P0=table[a], cp1=1; delay(1), cp1=0;
- P0=~0x01, cp2=1, delay(1), cp2=0;
- P0=0xff, cp2=1, delay(1), cp2=0;
- P0=table[b], cp1=1; delay(1), cp1=0;
- P0=~0x02, cp2=1, delay(1), cp2=0;
- P0=0xff, cp2=1, delay(1), cp2=0;
- P0=table[c], cp1=1; delay(1), cp1=0;
- P0=~0x04, cp2=1, delay(1), cp2=0;
- P0=0xff, cp2=1, delay(1), cp2=0;
- P0=table[d], cp1=1; delay(1), cp1=0;
- P0=~0x08, cp2=1, delay(1), cp2=0;
- P0=0xff, cp2=1, delay(1), cp2=0;
-
- P0=table[e], cp1=1; delay(1), cp1=0;
- P0=~0x10, cp2=1, delay(1), cp2=0;
- P0=0xff, cp2=1, delay(1), cp2=0;
- P0=table[f], cp1=1; delay(1), cp1=0;
- P0=~0x20, cp2=1, delay(1), cp2=0;
- P0= 0xff, cp2=1, delay(1), cp2=0;
- }
- void keyscan()
- {
- P3=0xfe; //掃描第一行
- temp=P3;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- delay(10);
- if(temp!=0xf0)
- {
- temp=P3;
- switch(temp)
- {
- case 0xee:
- key=0;
- wei++;
- break;
- case 0xde:
- key=1;
- wei++;
- break;
- case 0xbe:
- key=2;
- wei++;
- break;
- case 0x7e:
- key=3;
- wei++;
- break;
- }
- while(temp!=0xf0)
- {
- temp=P3;
- temp=temp&0xf0;
- beep=0;
- }
- beep=1;
- }
- }
-
- P3=0xfd; //掃描第二行
- temp=P3;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- delay(10);
- if(temp!=0xf0)
- {
- temp=P3;
- switch(temp)
- {
- case 0xed:
- key=4;
- wei++;
- break;
- case 0xdd:
- key=5;
- wei++;
- break;
- case 0xbd:
- key=6;
- wei++;
- break;
- case 0x7d:
- key=7;
- wei++;
- break;
- }
- while(temp!=0xf0)
- {
- temp=P3;
- temp=temp&0xf0;
- beep=0;
- }
- beep=1;
- }
- }
-
- P3=0xfb; //掃描第三行
- temp=P3;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- delay(10);
- if(temp!=0xf0)
- {
- temp=P3;
- switch(temp)
- {
- case 0xeb:
- key=8;
- wei++;
- break;
- case 0xdb:
- key=9;
- wei++;
- break;
-
- case 0xbb:
- qingling=1;
- break;
- case 0x7b:
- dengyu=1;
- break;
- }
- while(temp!=0xf0)
- {
- temp=P3;
- temp=temp&0xf0;
- beep=0;
- }
- beep=1;
- }
- }
-
- P3=0xf7; //掃描第四行
- temp=P3;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- delay(10);
- if(temp!=0xf0)
- {
- temp=P3;
- switch(temp)
- {
- case 0xe7:jia=1; break;
-
- case 0xd7:jian=1;break;
- case 0xb7:cheng=1;break;
- case 0x77:chu=1;break;
- }
- while(temp!=0xf0)
- {
- temp=P3;
- temp=temp&0xf0;
- beep=0;
- }
- beep=1;
- }
- }
- }
- void display0()
- {
- if(key!=20)
- {
- if(wei>3)wei=3; //超出位數(shù)限制
- switch(wei)
- {
- case 1:
- a0=key;
- b0=16;
- c0=16;
- d0=16;
- e0=16;
- f0=16;
- break;
- case 2:
- b0=key;
- c0=16;
- d0=16;
- e0=16;
- f0=16;
- break;
- case 3:
- c0=key;
- d0=16;
- e0=16;
- f0=16;
- break;
- case 4:
- d0=key;
- e0=16;
- f0=16;
- break;
- case 5:
- e0=key;
- f0=16;
- break;
- case 6:
- f0=key;
- break;
- }
- key=20;
- }
- if(a0!=16) s5=a0; //保存第1次按下的數(shù)
- if(b0!=16) s4=b0;
- if(c0!=16) s3=c0;
- if(d0!=16) s2=d0;
- if(e0!=16) s1=e0;
- if(f0!=16) s0=f0; //保存第6次按下的數(shù)
- display(a0,b0,c0,d0,e0,f0); //顯示按下的數(shù)
- }
- void main()
- {
- uchar gongneng;
- while(1)
- {
- keyscan();
- gongneng=jia|jian|cheng|chu|dengyu|qingling;
-
- if(gongneng==0) //等待數(shù)字鍵
- {
- display0();
- }
- else
- {
- if(jia|jian|cheng|chu) //按下功能鍵
- {
- a0=16;
- b0=16;
- c0=16;
- d0=16;
- e0=16;
- f0=16;
-
- if(jia)
- {
- jia=0;jia0=1;jian0=0;cheng0=0;chu0=0;
- }
- if(jian)
- {
- jian=0;jia0=0;jian0=1;cheng0=0;chu0=0;
- }
- if(cheng)
- {
- cheng=0;jia0=0;jian0=0;cheng0=1;chu0=0;
- }
- if(chu)
- {
- chu=0; jia0=0;jian0=0;cheng0=0;chu0=1;
- }
- switch(wei)
- {
- case 1:qian=s5;break;
- case 2:qian=s5*10+s4;break;
- case 3:qian=s5*100+s4*10+s3;break;
- case 4:qian=s5*1000+s4*100+s3*10+s2;break;
- case 5:qian=s5*10000+s4*1000+s3*100+s2*10+s1;break;
- case 6:qian=s5*100000+s4*10000+s3*1000+s2*100+s1*10+s0;break;
- }
- wei=0;
- s0=0;s1=0;s2=0;s3=0;s4=0;s5=0;
- display(a0,b0,c0,d0,e0,f0);
- }
- if(dengyu)
- {
- dengyu=0;
- switch(wei)
- {
- case 6:
- hou=s5*100000+s4*10000+s3*1000+s2*100+s1*10+s0;break;
- case 5:
- hou=s5*10000+s4*1000+s3*100+s2*10+s1;break;
- case 4:
- hou=s5*1000+s4*100+s3*10+s2;break;
- case 3:
- hou=s5*100+s4*10+s3;break;
- case 2:
- hou=s5*10+s4;break;
- case 1:
- hou=s5;break;
- }
- wei=0;
- s0=0;s1=0;s2=0;s3=0;s4=0;s5=0;
- if(jia0)
- {
- jia0=0; hou=qian+hou;
- }
- if(jian0)
- {
- jian0=0; hou=qian-hou;
- }
- if(cheng0)
- {
- cheng0=0; hou=qian*hou;
- }
- if(chu0)
- {
- chu0=0; hou=qian/hou;
- }
-
- if(hou>9801) //超出范圍后報警
- {
- beep=0;
- a0=16;b0=16;c0=16;d0=16;e0=16;f0=16;
- s0=0;s1=0;s2=0;s3=0;s4=0;s5=0;
- jia=0;jian=0;cheng=0;chu=0;
- jia0=0;jian0=0;cheng0=0;chu0=0;
- qingling=0;dengyu=0;
- qian=0;hou=0;
- display(a0,b0,c0,d0,e0,f0);
- }
- else if(hou<10)
- {
- a0=hou;b0=16;c0=16;d0=16;e0=16;f0=16;
- }
- else
- {
- if(hou<100)a0=hou/10,b0=hou%10,c0=16,d0=16,e0=16,f0=16;
- else
- {
- if(hou<1000)a0=hou/100,b0=hou%100/10,c0=hou%10,d0=16,e0=16,f0=16;
- else
- {
- if(hou<10000)a0=hou/1000,b0=hou%1000/100,c0=hou%100/10,d0=hou%10,e0=16,f0=16;
- else
- {
- if(hou<100000)a0=hou/10000,b0=hou%10000/1000,c0=hou%1000/100,d0=hou%100/10,e0=hou%10,f0=16;
- else
- {
- if(hou<1000000)a0=hou/100000,b0=hou%100000/10000,c0=hou%10000/1000,d0=hou%1000/100,e0=hou%100/10,f0=hou%10;
-
- }
- }
- }
- }
- }
- display(a0,b0,c0,d0,e0,f0);
- }
- if(qingling)
- {
- beep=1;
- a0=16;b0=16;c0=16;d0=16;e0=16;f0=16;
- s0=0;s1=0;s2=0;s3=0;s4=0;s5=0;
- jia=0;jian=0;cheng=0;chu=0;
- jia0=0;jian0=0;cheng0=0;chu0=0;
- qingling=0;dengyu=0;
- qian=0;hou=0;
- display(a0,b0,c0,d0,e0,f0);
- }
- }
- }
- }
復(fù)制代碼
|
|