单片机SC95F8617
一个按键控制两盏灯。要求是按一下按键,1亮2灭;再按一下1灭2亮;再按一下1亮2亮,再按一下1灭2灭,然后又1亮2灭循环。
其实列出来会发现这个亮灯的规律是一次转换一个灯,一次转换两个灯,循环。
如下表所示,第一次的转换灯1灯2变了,第二次的转换灯1变了,第三次的转换灯1灯2变了,第四次回到状态一又只变了灯1
我的想法是通过加一个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;
}
}
}
学习记录,仅供参考。