|
是用51hei單片機開發板 電路圖詳見:http://www.zg4o1577.cn/f/51hei-5.pdf 的數碼管部分, 用2個74hc573 鎖存,p0口作為數據口 ,p3.6和p3.7分別是段和位的鎖存端口.
- #include<reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit dula=P3^6;//573段選使能
- sbit wela=P3^7;//573位選使能
- sbit beep=P3^4;//蜂鳴器
- uchar temp,key;//按鍵變量
- uchar fun;//加,減,乘,除,標志位
- long int num1,num2,res;//num1與num2是2個要運算的變量,res是結果
- uchar aa,dis;//aa 2個運算數標志位 dis 2個運算數與結果標志
- uchar code table[]={0x00,0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//數碼管段碼
- uchar code weixuan[]={0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//數碼管位碼
- void delay(unsigned char i)//延時
- {
- uchar j,k;
- for(j=i;j>0;j--)
- for(k=125;k>0;k--);
- }
- void bee()//蜂鳴器
- {
- beep=0;
- delay(255);
- delay(255);
- beep=1;
- }
- key_scan()//按鍵檢測
- {
- P1=0xfe;
- temp=P1;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- delay(10);
- if(temp!=0xf0)
- {
- temp=P1;
- switch(temp)
- {
- case 0xee:
- key=0;
- break;
- case 0xde:
- key=1;
- break;
- case 0xbe:
- key=2;
- break;
- case 0x7e:
- key=3;
- break;
- }
- while(temp!=0xf0)
- {
- temp=P1;
- temp=temp&0xf0;
- }
- }
- }
- P1=0xfd;
- temp=P1;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- delay(10);
- if(temp!=0xf0)
- {
- temp=P1;
- switch(temp)
- {
- case 0xed:
- key=4;
- break;
- case 0xdd:
- key=5;
- break;
- case 0xbd:
- key=6;
- break;
- case 0x7d:
- key=7;
- break;
- }
- while(temp!=0xf0)
- {
- temp=P1;
- temp=temp&0xf0;
- }
- }
- }
- P1=0xfb;
- temp=P1;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- delay(10);
- if(temp!=0xf0)
- {
- temp=P1;
- switch(temp)
- {
- case 0xeb:
- key=8;
- break;
- case 0xdb:
- key=9;
- break;
- case 0xbb:
- key=10;
- break;
- case 0x7b:
- key=11;
- break;
- }
- while(temp!=0xf0)
- {
- temp=P1;
- temp=temp&0xf0;
- }
- }
- }
- P1=0xf7;
- temp=P1;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- delay(10);
- if(temp!=0xf0)
- {
- temp=P1;
- switch(temp)
- {
- case 0xe7:
- key=12;
- break;
- case 0xd7:
- key=13;
- break;
- case 0xb7:
- key=14;
- break;
- case 0x77:
- key=15;
- break;
- }
- while(temp!=0xf0)
- {
- temp=P1;
- temp=temp&0xf0;
- }
- }
- }
- }
- void Init()//初始化
- {
- num1=0;
- num2=0;
- wela=1;
- P0=0xdf;
- wela=0;
- dula=1;
- P0=table[1];
- dula=0;
- key=16;
- aa=0;
- dis=0;
- res=0;
- }
- void dis_play(long int nm)//顯示函數
- {
- uchar a1,a6;//a1位段選變量,a6為位選變量
- long int shu;
- shu=nm;
- if(shu==0)
- {
- wela=1;
- P0=0xdf;
- wela=0;
- dula=1;
- P0=table[1];
- dula=0;
- }
- else
- {
- for(a6=0;a6<6;a6++)
- {
- a1=shu%10;//shu%10 shu比10小a1=shu本身
- if(shu!=0)
- {
- a1=a1+1;
- }
- shu=shu/10;//shu/10 shu比10小 shu為0
- P0=table[a1];
- dula=1;
- dula=0;
- P0=weixuan[a6];
- wela=1;
- wela=0;
- delay(5);
- }
- }
- }
- void display()//顯示選擇函數,dis 0或1顯示運算數,dis為2顯示結果
- {
- switch (dis)
- {
- case 0:{
-
- dis_play(num1);
- }
- break;
- case 1:{
-
- dis_play(num2);
- }
- break;
- case 2:{
-
- dis_play(res);
- }
- break;
- }
- }
- void shanshuo()//數碼管閃爍
- {
- wela=1;
- P0=0xff;
- wela=0;
- delay(255);
- }
- void check()//運算函數
- {
- if(key!=16)
- {
- bee();
- if(key>=10)
- {
- switch (key)
- {
- case 10:Init();break; // CE
- case 11:{
- switch (fun)//加,減,乘,除選擇標志位
- {
- case 0:res=num1+num2,dis=2;break;//加法
- case 1:res=num1-num2,dis=2;break;//減法
- case 2:res=num1*num2,dis=2;break;//乘法
- case 3:res=num1/num2,dis=2;break;//除法
- }
- };break; // =
- case 12:fun=0,aa=1,shanshuo();break; // +
- case 13:fun=1,aa=1,shanshuo();break; // -
- case 14:fun=2,aa=1,shanshuo();break; // *
- case 15:fun=3,aa=1,shanshuo();break; // /
- }
- }
- else
- {
- switch (aa)//運算變量賦值標志位
- {
- case 0:{
- num1=num1*10+key;//把按鍵檢測到的值賦給num1運算變量1
- };break;
- case 1:{
- dis=1;
- num2=num2*10+key;//把按鍵檢測到的值賦給num2運算變量2
- };break;
- }
- }
- }
- key=16;
- }
- void main()
- {
- Init();
- while(1)
- {
- key_scan();
- check();
- display();
- }
- }
復制代碼
|
|