|
发表于 2015-11-13 08:25:12
|
显示全部楼层
按键和输出功能分开,会很清晰,
按键中利用标志传递你当前的状态,
输出功能中通过标志判断输出。
- #include <reg51.h>
- #define uint unsigned int
- #define uchar unsigned char
- uchar num;
- sbit key_sec05=P3^2;
- sbit key_stop=P3^7;
- sbit out=P1^0;
- unsigned char Led_Flag;
- void allport_Init() //端口初始化
- {
- P0=P1=P2=P3=0xff;
- }
- void delayms(uint xms) //延时
- {
- uint b,c;
- for(b=xms;b>0;b--)
- for(c=100;c>0;c--);
- }
- void keyscan() //按键扫描
- {
- if(key_sec05==0)
- {
- delayms(10);
- if(key_sec05==0)
- {
- Led_Flag=0;//闪烁标志
- }
- if(key_stop==0)
- {
- Led_Flag=1;//熄灭标志
- }
- /* {
- while(1)
- {
- out=0;
- if(num==10)
- {
- num=0;
- out=~out; //使发光管状态取反
- }
- if(key_stop==0)
- {
- delayms(10);
- if(key_stop==0)
- {
- out=1;
- break;
- }
- }
- }
- }
- */
- }
- }
-
- void T0_time() interrupt 1
- {
- TH0=(65535-50000)/256;
- TL0=(65535-50000)%256;
- num++;
- }
- void Led_Out(void)
- {
- if (Led_Flag==0)
- {
- if(num==10) // 0.5秒时间到
- {
- num=0;
- out=~out; //使发光管状态取反
- }
- }
- else if (Led_Flag==1)
- {
- out=0;//熄灭
- }
- }
- void main()
- {
- allport_Init();
- TMOD=0x01;//定时器0工作于方式1
- TH0=(65535-45872)/256;
- TL0=(65535-45872)%256;
- EA=1;//开总中断
- ET0=1;//开定时器0的中断
- TR0=1;//启动定时器
- while(1)
- {
- keyscan();
- Led_Out();
- }
- }
复制代码 |
|