兄弟們,為什么仿真的時候倒計時時間不動啊?
要求功能如下:
- /*樓道觸摸延時開關:設計一樓道觸摸延時,其功能是當人用手觸摸開關時,照明燈點亮,并持續一段時間后自動熄滅。開關的延時時間可設置并能倒計時,有顯示(0-99s)*/
- #include<STC15F2K60S2.H>
- #include<intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- sbit up=P2^0;
- sbit down=P2^1;
- sbit LED=P2^5;
- uchar count=0,shi=6,ge=6,djs,LS,LG,ud_flag,LED_flag;
- uchar code SEG_tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //0~9共陰碼
- uchar code wei_tab[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F}; //共陰片選代碼
- /*1ms延遲函數*/
- void delay1ms(int t)
- {
- int i,j;
- for(i=0;j<t;i++)
- for(j=0;j<120;j++);
- }
- /*定時器1初始化函數*/
- void Timer1_Init()
- {
- TMOD=0x00; //T1工作模式0,高4位應為0000;定時器0未用,低4位可隨意置數
- TH1=0x3C; //設置定時器初值=65536-50000=15536=3CB0H。定時時間為50ms,累計20次,為1s
- TL1=0xB0;
- ET1=1; //打開定時器中斷1
- }
- /*倒計時修改函數*/
- void modify_time()
- {
- if(ud_flag==0) //ud_falg為0時修改個位
- {
- if(up==0)
- {
- delay1ms(10);
- if(up==0)
- {
- if(ge==9)
- {
- ge--; //個位為9時再加不變
- }
- ge++;
- while(up==0);
- }
- }
- if(down==0)
- {
- delay1ms(10);
- if(down==0)
- {
- if(ge==0)
- {
- ge++; //個位為0時再減不變
- }
- ge--;
- while(down==0);
- }
- }
- }
- else //ud_flag為1時修改十位
- {
- if(up==0)
- {
- delay1ms(10);
- if(up==0)
- {
- if(shi==9)
- {
- shi--; //十位為9時再加不變
- }
- shi++;
- while(up==0);
- }
- }
- if(down==0)
- {
- delay1ms(10);
- if(down==0)
- {
- if(shi==0)
- {
- shi++; //十位為0時再減不變
- }
- shi--;
- while(down==0);
- }
- }
- }
- }
- /*倒計時顯示函數*/
- void display()
- {
- djs=10*shi+ge;
- LS=djs/10;
- LG=djs%10;
- P1=SEG_tab[LS];
- P0=wei_tab[1];
- delay1ms(1);
- P0=0xFF; //消影
- P1=SEG_tab[LG];
- P0=wei_tab[0];
- delay1ms(1);
- P0=0xFF;
- }
- /*主函數*/
- void main()
- {
- P0M0=0; //定義I/O口工作模式
- P0M1=0;
- P1M0=0;
- P1M1=0;
- P2M0=0;
- P2M1=0;
- P3M0=0;
- P3M1=0;
- IT0=1; //設置外部中斷0的觸發方式
- EX0=1; //打開外部中斷0中斷
- IT1=1; //設置外部中斷1的觸發方式
- EX1=1; //打開外部中斷1中斷
- Timer1_Init(); //定時器1初始化
- EA=1; //總中斷允許
- ud_flag=1;
- LED_flag=1;
- while(1)
- {
- if(LED_flag==0)
- {
- LED=0;
- display();
- }
- else
- {
- LED=1;
- modify_time();
- display();
- }
- }
- }
- /*T1中斷服務子函數*/
- void Timer1_ISR() interrupt 3
- {
- count++;
- if(count==20)
- {
- count=0;
- if(djs==0)
- {
- LED_flag=1; //倒計時結束,標志位置1,定時器1停止定時
- TR1=0;
- }
- else
- {
- djs--; //倒計時未結束,繼續倒計時
- }
- }
- }
- /*外部中斷0中斷函數*/
- void INT0_ISR() interrupt 0
- {
- ud_flag=!ud_flag; //ud_flag改變按鍵是修改倒計時的十位或者個位。
- }
- /*外部中斷1中斷函數*/
- void INT1_ISR() interrupt 2
- {
- LED_flag=0;
- TR1=1; //定時器1啟動
- }
復制代碼
|