兄弟们,为什么仿真的时候倒计时时间不动啊?
要求功能如下:
- /*楼道触摸延时开关:设计一楼道触摸延时,其功能是当人用手触摸开关时,照明灯点亮,并持续一段时间后自动熄灭。开关的延时时间可设置并能倒计时,有显示(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启动
- }
复制代码
|