一 功能介绍
点击S2左侧矩阵灯依次点亮再次点击反序关闭,点击S3右侧矩阵灯依次点亮再次点击反序关闭,S4负责总开总关,若左/右一侧矩阵灯点击则另一侧打开,若全开情况下则全部关闭,反之亦然.
使用工具:清翔电子开发板,电和脑子
二 视频效果
效果如功能介绍所示,分别点击S2,S3,S4,当点击S4时检测右侧矩阵灯未亮所以将其点亮,再次点击发现矩阵灯全亮则将其关闭.
流水灯效果
三 代码展示
#include<reg51.h>
sbit JVZHEN3_OUT =P1^1;
sbit JVZHEN4_OUT =P1^2;
sbit JVZHEN5_OUT =P1^3;
sbit JVZHEN6_OUT =P1^4;
sbit JVZHEN7_OUT =P1^5;
sbit JVZHEN8_OUT =P1^6;
sbit K1=P3^1;
sbit K2=P3^0;
sbit K3=P3^2;
unsigned int K1_state=0;
unsigned int K2_state=0;
unsigned int K3_state=0;
unsigned int pp1,pp2;
void delay(unsigned char i)
{
unsigned char m,n;
for(m=i;m>0;m--)
for(n=125;n>0;n--);
}
void main()
{
TMOD=0x01; //模式设置,00000001,可见采用的是定时器0,工作与模式1(M1=0,M0=1)。
TR0=1; //打开定时器
TH0=0Xff; //定时器设置,每隔100微秒发起一次中断。
TL0=0Xa4;
ET0=1; //开定时器0中断
EA=1; //开总中断
while(1)
{
if(K1==0){
delay(100);
pp1=0;
K1_state=!K1_state;
}
if(K2==0){
delay(100);
pp2=0;
K2_state=!K2_state;
}
if(K3==0){
delay(100);
pp1=0;
pp2=0;
K3_state=!K3_state;
}
}
}
void time0() interrupt 1
{ TH0=0Xff;
TL0=0Xa4;
pp1++;
pp2++;
if(K1_state==1){
JVZHEN3_OUT=0;
if(pp1==3000){
JVZHEN4_OUT=0;
}
if(pp1==6000){
JVZHEN5_OUT=0;
pp1=0;
}
}else{
JVZHEN5_OUT=1;
if(pp1==3000){
JVZHEN4_OUT=1;
}
if(pp1==6000){
JVZHEN3_OUT=1;
pp1=0;
}
}
if(K2_state==1){
JVZHEN8_OUT=0;
if(pp2==3000){
JVZHEN7_OUT=0;
}
if(pp2==6000){
JVZHEN6_OUT=0;
pp2=0;
}
}else{
JVZHEN6_OUT=1;
if(pp2==3000){
JVZHEN7_OUT=1;
}
if(pp2==6000){
JVZHEN8_OUT=1;
pp2=0;
}
}
if(K3_state==1){
if(K1_state==0&&K2_state==0){
K1_state=1;
K2_state=1;
}else if (K1_state==0)
{
K1_state=1;
}else if (K2_state==0)
{
K2_state=1;
}
else if(K1_state==1&&K2_state==1){
K1_state=0;
K2_state=0;
}
K3_state=0;
}
}