|
源代碼
- #include<reg51.h>
- #include<intrins.h>
- #include<absacc.h>
- #define COM8255 XBYTE[0x70ff] //定義并設置控制口的地址
- #define PA8255 XBYTE[0x70fc] //定義并設置PA口地址
- #define PB8255 XBYTE[0x70fd] //定義并設置PB口地址
- #define PC8255 XBYTE[0x70fe] //定義并設置PC口地址
- #define uchar unsigned char
- #define uint unsigned int
- uint shi,ge,num;
- int temp=10;
- uint arrow_j,arrow_j_1;
- uint i_inter;
- uint t=4,x=1,y=1,k,m;
- uchar code Tab_1[]={0x7f,0xbf,0xdf,0xe0}; //arrow
- uchar code Tab_2[]={0x18,0x3c,0x7e,0x18}; //arrow
- uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共陽極0-9字形代碼
- sbit led_1=P3^0; //LED顯示(十位)
- sbit led_2=P3^1; // LED顯示(個位)
- sbit led_3=P3^5; //黃燈
- sbit led_5=P3^3;
- sbit led_4=P3^2;
- void delay(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=10;y>0;y--);
- }
- void arrow() //點陣箭頭顯示函數
- {
- for(arrow_j=0;arrow_j<4;arrow_j++)
- {
- PA8255=Tab_1[arrow_j];
- PB8255=Tab_2[arrow_j];
- delay(1);
- }
-
- }
- main()
- {
- P2=0x00;
- COM8255=0x80;
- led_3=0; //黃燈滅
- num=0;
- PC8255=0x00;
- IT1=1; //外部中斷1的中斷請求觸發方式為脈沖觸發
- EX1=1; //開放外部中斷1
- IT0=1; //外部中斷0的中斷請求觸發方式為電平方式
- EX0=1;
- PX1=1; //設置中斷優先級,外部中斷1優先
- PX0=1;
- TMOD=0x01; //定時器方式,模式1,16位
- TH0=15536/256; //設置定時起點
- TL0=15536%256;
- EA=1; //開放所有中斷
- ET0=1; //開放定時器/計數器0中斷
- TR0=1;
- //啟動定時器/計數器0
- while(1) //等待中斷
- {
- x=1;
- y=1;
- shi=temp/10;
- ge=temp%10;
- P1=0xff;
- led_1=1;
- led_2=0;
- P1=table[shi];
- delay(15);
- P1=0xff;
- led_1=0;
- led_2=1;
- P1=table[ge];
- delay(15);
- arrow();
- }
- }
- void T0_time() interrupt 1 //定時中斷
- {
- TH0=15536/256; //重新設置定時起點
- TL0=15536%256;
- num++;
- if(num==10) //十秒結束,重設,可以修改倒計時
- {
- num=0;
- temp--;
- if(temp+1==0)
- {
- if(PC8255<2)
- {
- PC8255=PC8255+1;
- }
- else
- {
- PC8255=0x00;
- }
- temp=10;
- }
- }
- }
- void inter() interrupt 2 //夜間行駛中斷函數(外部1中斷)
- {
- delay(2000);
- while(y==1) //為了第二次按下按鈕跳出中斷
- {
- led_3=1; //黃燈亮
- for(i_inter=0;i_inter<150;i_inter++) //延時顯示倒計時,同時點陣掃描顯示
- {
- P1=0xff;
- led_1=1;
- led_2=0;
- P1=table[shi];
- delay(15);
- if(i_inter==75)
- led_3=0;
- P1=0xff;
- led_1=0;
- led_2=1;
- P1=table[ge];
- delay(15);
- arrow(); //箭頭函數
- }
- PA8255=0xff;
- PB8255=0xff;
- temp--;
- if(temp+1==0)
- {
- if(PC8255<2)
- {
- PC8255=PC8255+1;
- }
- else
- {
- PC8255=0x00;
- }
- temp=10;
- }
- shi=temp/10;
- ge=temp%10;
- if(led_5==0) //等待第二次按下按鈕
- {
- y=0;
- while(led_5==0);
- }
- }
- }
- void inter1() interrupt 0 //緊急情況中斷函數設計
- {
- delay(1000);
- k=PA8255;
- m=PC8255;
- while(x==1)
- {
- PC8255=0xff;
- PA8255=0x00;
- P1=0xff;
- if(led_4==0)
- {
- delay(10000);
- if(led_4==0) //等待第二次按下按鈕
- {
- x=0;
- while(led_4==0);
- }
- }
- }
- PA8255=k;
- PC8255=m;
- }
復制代碼
|
|