代碼如下
實現功能:
上電自檢,數碼管 LED 全亮, 3 秒鐘后黑屏,然后蜂鳴器響 200mS;
(25 分)
2 按鍵 S4,顯示學號后四位;(15 分)
3 按下 S5, 測溫,即顯示當前溫度;
再次按下 S5,將溫度顯示為華氏溫度。(25 分)
4 按下 S6,存儲當前溫度;(15 分)
5 按下 S7,顯示存儲溫度;再次按下 S7,將溫度顯示為華氏溫度。
卡在寫按鍵很久了,不知道哪有邏輯問題,大神幫忙看看
單片機源程序如下:
- #include<STC15F2K60S2.H>
- #include<onewire.h>
- #define uchar unsigned char
- #define uint unsigned int
- // 0 1 2 3 4 5 6 7 8 9 . a b c d e f 熄滅
- uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x7f,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xFF};
- uchar yi,er,san,si,wu ,liu,qi,ba,temp,b;
- int num=600;int nun=640;
- int ducunwendu[];
- void delayms(int ms);
- void allinit();
- int keycan();
- void Timer0Init(void);
- void display1(uchar yi,uchar er);
- void display2(uchar san,uchar si);
- void display3(uchar wu,uchar liu);
- void display4(uchar qi,uchar ba);
- void main()
- {float wendu;float huashi;int x;
-
- allinit();
-
- P0=0X00;
- P2=0X80;
- P0=0X00;
-
- Timer0Init();
-
- while(1)
- {
- keycan();
- x=keycan();
- if(x==1)
- {
-
-
- }
- else if(x==2)
- {
-
-
- }
- else if(x==3)
- {
- b++;
- if(b==1)
- {yi=17;er=17;san=17;si=17;wu=17;
- wendu=rd_temperature_f();
-
- wu=(int)(wendu/10)%10;
- liu=(int)wendu%10;
- P2=0XFF;
-
-
- qi=(int)(wendu*10)%10;
-
- ba= 13;
-
- display1(yi,er);
- display2(san,si);
- display3(wu,liu);
- display3(wu,10);
- display4(qi,ba);}
-
- if(b==2)
- {
- yi=17;er=17;san=17;si=17;wu=17;
- wendu=rd_temperature_f();
- huashi=wendu*1.8+32;
- wu=(int)(huashi/10)%10;
- liu=(int)huashi%10;
- P2=0XFF;
-
-
- qi=(int)(huashi*10)%10;
-
- ba= 13;
-
- display1(yi,er);
- display2(san,si);
- display3(wu,liu);
- display3(wu,10);
- display4(qi,ba);
- b=0;
- }
-
-
-
-
-
-
- }
- else if(x==4)
- {yi=17;er=17;san=17;si=17;
- wu=8;liu=0;qi=3;ba=4;
- display1(yi,er);
- display2(san,si);
- display3(wu,liu);
- display4(qi,ba);
- }
-
- }
- }
- void delayms(int ms)
- {
- int i,j;
- for(i=ms;i>0;i--)
- for(j=845;j>0;j--);
- }
- void allinit()
- {
- P2=0XA0;
- P0=0X00;//關閉蜂鳴器,繼電器
-
- P2=0X80;
- P0=0XFF;//關閉LED燈
-
- P2=0XC0;
- P0=0XFF;//選擇所有數碼管
- P2=0XFF;
- P0=0XFF;//關閉所有數碼管
- }
- void display1(uchar yi,uchar er)
- {
- P2=0XC0;//打開位選573 U8
- P0=0X01;//選擇第一個數碼管
- P2=0XFF;//打開段選573 U7
- P0=tab[yi];
- delayms(1);
-
- P2=0XC0;//打開位選573 U8
- P0=0X02;//選擇第二個數碼管
- P2=0XFF;//打開段選573 U7
- P0=tab[er];
- delayms(1);
- }
- void display2(uchar san,uchar si)
- {
- P2=0XC0;//打開位選573 U8
- P0=0X04;//選擇第三個數碼管
- P2=0XFF;//打開段選573 U7
- P0=tab[san];
- delayms(1);
-
- P2=0XC0;//打開位選573 U8
- P0=0X08;//選擇第四個數碼管
- P2=0XFF;//打開段選573 U7
- P0=tab[si];
- delayms(1);
- }
- void display3(uchar wu,uchar liu)
- {
- P2=0XC0;//打開位選573 U8
- P0=0X10;//選擇第一個數碼管
- P2=0XFF;//打開段選573 U7
- P0=tab[wu];
- delayms(1);
-
- P2=0XC0;//打開位選573 U8
- P0=0X20;//選擇第一個數碼管
- P2=0XFF;//打開段選573 U7
- P0=tab[liu];
- delayms(1);
- }
- void display4(uchar qi,uchar ba)
- {
- P2=0XC0;//打開位選573 U8
- P0=0X40;//選擇第一個數碼管
- P2=0XFF;//打開段選573 U7
- P0=tab[qi];
- delayms(1);
-
- P2=0XC0;//打開位選573 U8
- P0=0X80;//選擇第一個數碼管
- P2=0XFF;//打開段選573 U7
- P0=tab[ba];
- delayms(1);
- }
- void Timer0Init(void) //5毫秒@11.0592MHz
- {
- AUXR |= 0x80; //定時器時鐘1T模式
- TMOD &= 0xF0; //設置定時器模式
- TL0 = 0x00; //設置定時初值
- TH0 = 0x28; //設置定時初值
- TF0 = 0; //清除TF0標志
- TR0 = 1;
- EA=1;
- ET0=1; //定時器0開始計時
- }
- void Timer0() interrupt 1
- {
- num--;
- nun--;
- if(num==0)
- {
-
- P0=0XFF;
- P2=0XFF;
- P0=0XFF;
- P2=0XA0;
- P0=0X40;
- }
- if(nun==0)
- {P0=0X00;}
- }
- int keycan()
- {int s1=0;
- P3=0x7f;P4=0xef;
- temp=P3;
- if(P3!=0x7f)
- {
- delayms(5);
- temp=P3;
- if(P3!=0x7f)
- {
- switch(temp)
- {
- case 0x7e : s1=1; break;
- case 0x7d : s1=2; break;
- case 0x7b : s1=3; break;
- case 0x77 : s1=4; break;
- }
- while(temp!=0x7f)
- {
- temp=P3;
- delayms(5);
- }
- }
- }
- return s1;
- }
復制代碼
|