#include<stc15f2k60s2.h>
这是包含头文件的指令,引入了 STC15F2K60S2
单片机的相关定义和声明。
sbit buzzer = P0^6;
这里定义了 buzzer
,它是 P0
口的第 6 位引脚,用于连接蜂鸣器。
sbit S7 = P3^0;
sbit S6 = P3^1;
sbit S5 = P3^2;
sbit S4 = P3^3;
这里定义了四个开关引脚 S7
、S6
、S5
、S4
,它们分别连接到 P3
口的第 0、1、2、3 位。
sbit L1 = P0^0;
sbit L2 = P0^1;
sbit L3 = P0^2;
sbit L4 = P0^3;
sbit L5 = P0^4;
sbit L6 = P0^5;
sbit L7 = P0^6;
这里定义了七个LED引脚 L1
到 L7
,它们分别连接到 P0
口的第 0 到 6 位。
void SelectHC573(unsigned char channel)
{
switch(channel)
{
case 4:
P2 = (P2 & 0x1f) | 0x80;
break;
case 5:
P2 = (P2 & 0x1f) | 0xa0;
break;
case 6:
P2 = (P2 & 0x1f) | 0xc0;
break;
case 7:
P2 = (P2 & 0x1f) | 0xe0;
break;
}
}
这是一个函数,根据传入的 channel
参数,选择不同的 P2
口的配置。在你的代码中,这个函数用于选择 HC573 锁存器的输出通道。
void DelayK(unsigned char t)
{
while(t--);
}
这是一个简单的延时函数,通过循环等待的方式实现延时。延时时间是由参数 t
决定的。
unsigned char stat_k = 0; // 模式
这里定义了一个用于保存按键模式的变量 stat_k
。
void ScanKey_Alone()
{
if(S7 == 0)
{
DelayK(100);
if(S7 == 0)
{
if(stat_k == 0)
{
L1 = 0;
stat_k = 1;
}
else if(stat_k == 1)
{
L1 = 1;
stat_k = 0;
}
}
}
// 同样的逻辑重复了下面的 S6、S5、S4。
}
这是一个扫描按键的函数。它检测四个按键 S7
、S6
、S5
、S4
是否被按下,如果被按下则执行相应的操作。具体操作包括点亮或熄灭对应的LED,并改变模式 stat_k
。
void main()
{
P2 = 0xA0;//这两行代码是为了关闭蜂鸣器
buzzer = 0;
SelectHC573(4);
while(1)
{
L7 = 1;//这个代码是为了关闭L7,因为我在运行时,发现L7莫名其妙的亮,你可以把这行代码删除
ScanKey_Alone();
}
}
这是 main
函数,主要设置 P2
和 buzzer
,然后进入一个无限循环,其中 L7
保持点亮,然后不断扫描按键状态。
请注意:在 ScanKey_Alone
函数中,同样的逻辑被重复了四次。你可能希望使用循环和数组等方式来避免这种重复性。
以下是主函数:
#include<stc15f2k60s2.h>
sbit buzzer=P0^6;
sbit S7=P3^0;
sbit S6=P3^1;
sbit S5=P3^2;
sbit S4=P3^3;
sbit L1=P0^0;
sbit L2=P0^1;
sbit L3=P0^2;
sbit L4=P0^3;
sbit L5=P0^4;
sbit L6=P0^5;
sbit L7=P0^6;
void SelectHC573(unsigned char channel)
{
switch(channel)
{
case 4:
P2=(P2&0x1f)|0x80;
break;
case 5:
P2=(P2&0x1f)|0xa0;
break;
case 6:
P2=(P2&0x1f)|0xc0;
break;
case 7:
P2=(P2&0x1f)|0xe0;
break;
}
}
void DelayK(unsigned char t)
{
while(t--);
}
unsigned char stat_k=0;//模式
void ScanKey_Alone()
{
if(S7==0)
{
DelayK(100);
if(S7==0)
{
if(stat_k==0)
{
L1=0;
stat_k=1;
}
else if(stat_k==1)
{
L1=1;
stat_k=0;
}
while(S7==0);
}
}
if(S6==0)
{
DelayK(100);
if(S6==0)
{
if(stat_k==0)
{
L2=0;//点亮
stat_k=2;
}
else if(stat_k==2)
{
L2=1;//熄灭
stat_k=0;
}
while(S6==0);//因为S6和S7按键,关闭和打开有时要按多次,这样会导致看起来不太灵敏
}
}
if(S5==0)//按下S5
{
DelayK(100);
if(S5==0)
{
if(stat_k==1)//此时为S7按下的模式
{
L3=0;
while(S5==0);//意味着如果一直按S5,那么L3一直为0,一直亮
L3=1;
}
else if(stat_k==2)//此时为S6按下的模式
{
L5=0;
while(S5==0);
L5=1;
}
}
}
if(S4==0)
{
DelayK(100);
if(S4==0)
{
if(stat_k==1)
{
L4=0;
while(S4==0);
L4=1;
}
else if(stat_k==2)
{
L6=0;
while(S4==0);
L6=1;
}
}
}
}
void main()
{
P2=0xA0;
buzzer=0;
SelectHC573(4);
while(1)
{
L7=1;
ScanKey_Alone();
}
}