蓝桥杯单片机学习过程记录(四)矩阵按键

蓝桥杯单片机学习过程记录(四)矩阵按键


原理图如下:

在这里插入图片描述

矩阵键盘控制小灯

//矩阵键盘+小灯
#include<STC15F2K60S2.H>
void delayms(int ms);
void key_scan(void);
void main(void){
 P02=0XA0;P00=0X00;P2=0X80;P0=0XFF;
 while(1){
  key_scan();
 }
}
//延时
void delayms(int ms){
 int q,w;
 for(q=0;q<ms;q++)
  for(w=845;w>0;w--);
}
//按键
void key_scan(void){
 //第一列控制1-4灯亮
 P44=0;P42=1;P35=1;P34=1;
 if((P30==0)&&(P44==0)){
  delayms(5);
  if(P30==0){
   P00=0;
  }
  while(!P30);
 }
 else if((P31==0)&&(P44==0)){
  delayms(5);
  if(P31==0){
   P01=0;
  }
  while(!P31);
 }
 else if((P32==0)&&(P44==0)){
  delayms(5);
  if(P32==0){
   P02=0;
  }
  while(!P32);
 }
 else if((P33==0)&&(P44==0)){
  delayms(5);
  if(P33==0){
   P03=0;
  }
  while(!P33);
 }
 //第二列控制1-4灯灭
 P44=1;P42=0;P35=1;P34=1;
 if((P30==0)&&(P42==0)){
  delayms(5);
  if(P30==0){
   P00=1;
  }
  while(!P30);
 }
 else if((P31==0)&&(P42==0)){
  delayms(5);
  if(P31==0){
   P01=1;
  }
  while(!P31);
 }
 else if((P32==0)&&(P42==0)){
  delayms(5);
  if(P32==0){
   P02=1;
  }
  while(!P32);
 }
 else if((P33==0)&&(P42==0)){
  delayms(5);
  if(P33==0){
   P03=1;
  }
  while(!P33);
 }
}

矩阵键盘+小灯+数码管

//矩阵键盘+小灯+数码管
#include<STC15F2K60S2.H>
unsigned char seg[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0xff};
void delayms(int ms);
void key_scan(void);
unsigned int led,g;
void main(void){
 P02=0XA0;P00=0X00;P2=0X80;P0=0XFF;
 P02=0XC0;P00=0X04;P2=0XFF;P0=0XFF;
 while(1){
  key_scan();
 }
}
//延时
void delayms(int ms){
 int q,w;
 for(q=0;q<ms;q++)
  for(w=845;w>0;w--);
}
//矩阵键盘
void key_scan(void){
 unsigned char temp;
 //第一列控制数码管0-3
 P44=0;P42=1;P3=0Xff;
 temp=P3;
 temp=(temp&0X0F);
 if (temp!=0X0F){
  delayms(5);
  temp=P3;
  temp=(P3&0X0F);
  if (temp!=0X0F){
   temp=P3;
   switch(temp){
    case 0XfE:P0=seg[0];break;
    case 0XfD:P0=seg[1];break;
    case 0Xfb:P0=seg[2];break;
    case 0Xf7:P0=seg[3];break;
   }
  while(temp!=0X0F){
   temp=P3;
   temp=(temp&0X0F);
   }
  }
 }
 //第二列控制数码管4-7
 P44=1;P42=0;P3=0XfF;
 temp=P3;
 temp=(temp&0X0F);
 if (temp!=0X0F){
  delayms(5);
  temp=P3;
  temp=(P3&0X0F);
  if (temp!=0X0F){
   temp=P3;
   switch(temp){
    case 0XfE:P0=seg[4];break;
    case 0XfD:P0=seg[5];break;
    case 0Xfb:P0=seg[6];break;
    case 0Xf7:P0=seg[7];break;
   }
  while(temp!=0X0F){
   temp=P3;
   temp=(temp&0X0F);
   }
  }
 }
 //第三列控制数码管8.9.-.灭
 P44=1;P42=1;P3=0XdF;
 temp=P3;
 temp=(temp&0X0F);
 if (temp!=0X0F){
  delayms(5);
  temp=P3;
  temp=(P3&0X0F);
  if (temp!=0X0F){
   temp=P3;
   switch(temp){
    case 0XdE:P0=seg[8];break;
    case 0XdD:P0=seg[9];break;
    case 0Xdb:P0=seg[10];break;
    case 0Xd7:P0=seg[11];break;
   }
  while(temp!=0X0F){
   temp=P3;
   temp=(temp&0X0F);
   }
  }
 }
  //第四列控制流水灯、0-9,灯亮、都灭
 P44=1;P42=1;P3=0XeF;
 temp=P3;
 temp=(temp&0X0F);
 if (temp!=0X0F){
  delayms(5);
  temp=P3;
  temp=(P3&0X0F);
  if (temp!=0X0F){
   temp=P3;
   switch(temp){
    case 0XeE:
     P02=0XC0;P00=0X04;P2=0XFF;P0=0XFF;
     P0=seg[10];
     for(led=0;led<8;led++){
      P02=0XA0;P00=0X00;P2=0X80;P0=0XFF;
      P0=(0X01<<led);
      delayms(200);
     }
     P0=0xff;
     P02=0XC0;P00=0X04;P2=0XFF;P0=0XFF;
    break;
    case 0XeD:P0=seg[9];
     
     for(g=0;g<10;g++){
      P0=seg[g];
      delayms(200);
     }
     break;
    case 0Xeb:
     
     P0=seg[10];
     P02=0XA0;P00=0X00;P2=0X80;P0=0XFF;
     P0=0x00;
    break;
    case 0Xe7:
     P02=0XA0;P00=0X00;P2=0X80;P0=0XFF;
     P0=0xff;
     P02=0XC0;P00=0X04;P2=0XFF;P0=0XFF;
     P0=seg[11];
    break;
   }
  while(temp!=0X0F){
   temp=P3;
   temp=(temp&0X0F);
   }
  }
 }
}
发布了27 篇原创文章 · 获赞 17 · 访问量 4162

猜你喜欢

转载自blog.csdn.net/weixin_44747240/article/details/104129439