学习记录3:一个按键控制两盏灯,亮灯循环

单片机SC95F8617
一个按键控制两盏灯。要求是按一下按键,1亮2灭;再按一下1灭2亮;再按一下1亮2亮,再按一下1灭2灭,然后又1亮2灭循环。
其实列出来会发现这个亮灯的规律是一次转换一个灯,一次转换两个灯,循环。
如下表所示,第一次的转换灯1灯2变了,第二次的转换灯1变了,第三次的转换灯1灯2变了,第四次回到状态一又只变了灯1

灯1灯2
10
01
11
00

我的想法是通过加一个i来标志,每运行一次i加一,在main函数里加一个判断i是奇是偶来达到每跑一次变一次的目的。不过我在想这样的话如果不重新下载的话,i会一直加,不知道会不会有什么影响,如果有更好的方法下次更新。

//LED  :P06 P52 P54  
//KEY: P03 P05
#include  "SC95F861x_C.H"

sbit LED1=P0^6;
sbit LED2=P5^2;

unsigned char key=0xff,oldkey=0xff;
unsigned long keycounter=0;
unsigned long i=1;

void delay(unsigned long time)
{
  	while(time>0){
		time--;
	}
}
void Ioinit()
{
  	P0CON=0x40;//MOV P0CON,#40H    
	P0PH=0xFF;//MOV P0PH,#3FH
	P5CON=0xff;//MOV P5CON,#0FFH    
	P5PH=0xff;//MOV P5PH,#0FFH        
}
unsigned char ReadKey() //判断P03键是否按下
{
	unsigned char tempkey=0;
	if(P03==0&&oldkey==0)
	{
		keycounter++;
		if(P03==0&&keycounter>10000){
			tempkey=1;
			oldkey=tempkey;//记住按键值
			i++;
		}
	}
	if(P03==1){
		oldkey=0;//按键已经抬起
	  	keycounter=0;
	}													 
	return tempkey;
}
void main()
{
	Ioinit();
	while(1)
	{
		key=ReadKey();
		if(key==0x01&&i%2==0)
		{
			P06=!P06;
			delay(10000);
		}
		if(key==0x01&&i%2==1)
		{
			delay(10000);
			P06=!P06;
			P52=!P52;
		}			
	}
}

学习记录,仅供参考。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值