這是我的程序,如果是想要在定時器定義一個變量用來延時 ,也可以的嗎 大概要怎么弄啊
- #include<reg52.h>
- #include <intrins.h>
- sbit key1=P1^0;
- sbit key2=P1^1 ;
- sbit key3=P1^2;
- sbit key4=P1^3;
- sbit key5=P1^4; //第五個鍵盤調節分
- sbit key6=P1^5;
- typedef unsigned char u8;
- typedef unsigned int u16;
- u8 smgduan[16]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07,
- 0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71,};// 段選
- u8 smgduan1[16]={0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,};
- u8 smgwei[8]={0x00,0x04,0x08,0x0c,0x10,0x14,0x18,0x1c}; //位選
- u8 a[4];//保存時鐘的數據
- u8 sec,min;
- void delay(u16 i)
- {
- while(i--);
- }
- void time0init() //定時器0初始化
- {
- TMOD=0X01;
- TH0=0Xfc;
- TL0=0X18; //1ms
- TR0=1;
- EA=1;
- ET0=1;
- }
- void display()
- {
- u8 i;
- a[0]=smgduan[sec%10];
- a[1]=smgduan[sec/10];
- a[2]=smgduan1[min%10];
- a[3]=smgduan[min/10];
- for(i=0;i<4;i++)
- {
- P0=a[i];
- P2=smgwei[4-i];
- delay(300); //不同的延時時間對數碼管顯示亮度會產生很大的影響,時間越短影響越大
- }
- }
- //--聲明全局函數--//
- void Delay10ms(unsigned int c); //延時10ms
- /*******************************************************************************
- * 函 數 名 : abc
- * 函數功能 : 主函數
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- abc()
- {
- if(min==40)
- {
- unsigned char LED;
- LED = 0x01; //0xfe = 1111 1110
- while (1)
- {
- P0 = LED;
- Delay10ms(50);
- LED = LED << 1; //循環右移1位,點亮下一個LED "<<"為左移位
- if (P0 == 0x00) //當它全滅的時候,重新賦值
- {
- LED = 0x01; // 0xfe = 1111 1110
- }
-
- }
- }
- }
- /*******************************************************************************
- * 函 數 名 : Delay10ms
- * 函數功能 : 延時函數,延時10ms
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- void Delay10ms(unsigned int c) //誤差 0us
- {
- unsigned char a, b;
- //--c已經在傳遞過來的時候已經賦值了,所以在for語句第一句就不用賦值了--//
- for (;c>0;c--)
- {
- for (b=38;b>0;b--)
- {
- for (a=130;a>0;a--);
- }
-
- }
- }
- void keyscan()
- {
- if(key2==0)
- {
- delay(200);
- if(key2==0)
- {
- delay(200);
- min=0;
- sec=0;
- while (!key2);}
- }
- if(key1==0)
- {
- delay(200);
- if(key1==0)
- {
- delay(200);
- while (!key1);
- TR0=~TR0;
- }
- }
- if(key3==0)
- {
- delay(200);
- if(key3==0)
- {
- delay(200);
- sec +=10;
- while(!key3);
- }
- }
- if(key5==0)
- {
- delay(200);
- if(key5==0)
- {
- delay(200);
- min+=10;
- while(!key5);}
- if(min>=60)
- {delay(200);
- min=0;
- sec=0;
- while(!key5);}}
- if(key6==0)
- {
- delay(200);
- if(key6==0)
- {
- delay(200);
- if(min>=10)
- min-=10;
- while(!key6);}
- else
- {delay(200);
- min=0
- sec=0;
- while(!key6);}
- }
- if(key4==0)
- {
- delay(200);
- if(key4==0)
- {
- delay(200);
- if(sec>=10)
- {delay(200);
- sec-=10;
- while(!key4);
- }
- else if(min>=1&&sec<=10)
- {delay(200);
- min-=1;
- sec+=50;
- while(!key4);
- }
- else if(min==0&&sec<=10)
- {delay(200);
- min=0;
- sec=0;
- while(!key4);
- }
- }
-
- }
- }
-
- void main()
- {
- time0init();
- while(1)
- { abc();
- keyscan();
- display();
- }
- }
- void time0() interrupt 1
- {
- static u16 j;
- TH0=0Xfc;
- TL0=0X18; //1ms
- j++;
- if(j==1000) //1s
- {
- j=0;
- sec++;
- if(sec>=60)
- {
- sec=0;
- min++;
- if(min>=60)
- {
- min=0;
- }
- }
- }
- }
復制代碼 |