一、以S7按键每按下一位LED向右移位,加入消抖程序,按键按下执行:
该程序中S7,S6,S5,S4按键执行效果一样
#include<stc15.h>
unsigned char LED=0;
unsigned char S7_Flag=0;S6_Flag=0;S5_Flag=0;S4_Flag=0;
void Delay_MS(unsigned int MS);
void KeyScan(void);
void main(void)
{
P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;
while(1)
{
KeyScan();
if(S7_Flag==1)
{
S7_Flag=0;
P0=~(0X01<<LED);
LED++;
if(LED==8)LED=0;
}
}
}
void Delay_MS(unsigned int MS)
{
unsigned int i,j;
for(i=0;i<MS;i++)
for(j=853;j>0;j--);
}
void KeyScan(void)
{
if(P30==0)
{
Delay_MS(10);
if(P30==0)S7_Flag=1;
while(!P30);
}
if(P31==0)
{
Delay_MS(10);
if(P31==0)S7_Flag=1;
while(!P31);
}
if(P32==0)
{
Delay_MS(10);
if(P32==0)S7_Flag=1;
while(!P32);
}
if(P33==0)
{
Delay_MS(10);
if(P33==0)S7_Flag=1;
while(!P33);
}
}
二、S7,S6,S5,S4按键分别控制L1,L7灯的亮灭:
#include<stc15.h>
unsigned char S7_Flag=0;S6_Flag=0;S5_Flag=0;S4_Flag=0;
void Delay_MS(unsigned int MS);
void KeyScan(void);
void main(void)
{
P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;
while(1)
{
KeyScan();//注意扫描函数在循环里面
if(S7_Flag==1){S7_Flag=0;P00=0;}
if(S6_Flag==1){S6_Flag=0;P00=1;}
if(S5_Flag==1){S5_Flag=0;P06=0;}
if(S4_Flag==1){S4_Flag=0;P06=1;}
}
}
void Delay_MS(unsigned int MS)
{
unsigned int i,j;
for(i=0;i<MS;i++)
for(j=853;j>0;j--);
}
void KeyScan(void)
{
if(P30==0)
Delay_MS(10);
if(P30==0)S7_Flag=1;
while(!P30);
if(P31==0)
Delay_MS(10);
if(P31==0)S6_Flag=1;
while(!P31);
if(P32==0)
Delay_MS(10);
if(P32==0)S5_Flag=1;
while(!P32);
if(P33==0)
Delay_MS(10);
if(P33==0)S4_Flag=1;
while(!P33);
}
三、S7,S6,S5,S4按键分别控制L1,L2,L3,L4的亮灭
#include<stc15.h>
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;
void SlecetHC573(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--);
}
void ScanKeys_Alone()
{
if(S7==0)
{
DelayK(100);
if(S7==0)
{
L1=0;
while(S7==0);
L1=1;
}
}
if(S6==0)
{
DelayK(100);
if(S6==0)
{
L2=0;
while(S6==0);
L2=1;
}
}
if(S5==0)
{
DelayK(100);
if(S5==0)
{
L3=0;
while(S5==0);
L3=1;
}
}
if(S4==0)
{
DelayK(100);
if(S4==0)
{
L4=0;
while(S4==0);
L4=1;
}
}
}
void main()
{
SlecetHC573(4);
while(1)
{
ScanKeys_Alone();
}
}
五、独立按键的扩展应用:按键S7和S6为选择键,确定控制键控制那组LED指示灯。按键S5和S4为控制键,按下该键点亮指定的LED指示灯,松开后熄灭。
按下S7点亮L1指示灯,L1点亮后,S6不响应操作,S5控制L3,S4控制L4,再次按下S7,L1指示灯熄灭,S6可响应操作。
按下S6点亮L2指示灯,L2点亮后,S7不响应操作,S5控制L5,S4控制L6,再次按下S6,L2指示灯熄灭,S7可响应操作。
S7和S6未按下时,即L1或L2未点亮时S5和S4不响应操作也就是未作LED区域选择时,控制键不能操作。
#include<stc15.h>
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;
void SlecetHC573(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 ScanKeys_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);
}
}
if(S5==0)
{
DelayK(100);
if(S5==0)
{
if(stat_k==1)
{
L3=0;
while(S5==0);
L3=1;
}
else if(stat_k==2)
{
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()
{
SlecetHC573(4);
while(1)
{
ScanKeys_Alone();
}
}