STC8_8X8矩阵键盘

本程序参考了此程序

/***************************************************************************** 
 * 描  述 : 8x8矩阵扫描函数 
 * 入  参 : 无 
 * 返回值 : 哪个按键按下的对应值 
 *****************************************************************************/
 
#include	"88juzhen.h"
#include	"delay.h"  
#include    "UART.h" 

#define ROW1 P27
#define ROW2 P26
#define ROW3 P25
#define ROW4 P24
#define ROW5 P23
#define ROW6 P22
#define ROW7 P21
#define ROW8 P20


#define COL1 P02
#define COL2 P03
#define COL3 P12
#define COL4 P13
#define COL5 P14
#define COL6 P15
#define COL7 P16
#define COL8 P17
/*
 

#define COL1 P27
#define COL2 P26
#define COL3 P25
#define COL4 P24
#define COL5 P23
#define COL6 P22
#define COL7 P21
#define COL8 P20

#define ROW1 P17
#define ROW2 P16
#define ROW3 P15
#define ROW4 P14
#define ROW5 P13
#define ROW6 P12
#define ROW7 P03
#define ROW8 P02
*/
#define DELAY_TIME 30 



u8 KeyScan(void)  
{  
    u16 X_temp,Y_temp,temp;  
    u16 temp_ff00,temp_00ff;  
     X_temp=0xFF00;        //列值赋初值  
     Y_temp=0x00FF;        //行值赋初值  
  
     
     P2M1 &= 0x00;  P2M0 |= 0xFF;     //设置P2.0~P2.7为强推挽输出  
     P0M1 &= 0xF3;  P0M0 |= 0x0C;     //设置P0.2~P0.3为强推挽输出  
  	 P1M1 &= 0x03;  P1M0 |= 0xFC;     //设置P1.2~P1.7为强推挽输出  

      ROW1=1;ROW2=1;ROW3=1;ROW4=1;ROW5=1;ROW6=1;ROW7=1;ROW8=1;  //行置高  
      COL1=0;COL2=0;COL3=0;COL4=0;COL5=0;COL6=0;COL7=0;COL8=0;  //列置低  
      
        //所用到行IO口配置为输入,进行检测  
      delay_ms(15);  
      P2M1 &= 0x00; P2M0 &= 0x00;     //设置P2.0~P2.7为准双向口  
      delay_ms(15);  
      
        if(ROW1 == 0)         //检测行1电平是否为低电平  
        {  
            delay_ms(DELAY_TIME);  
            if(ROW1 == 0)  
            Y_temp &= 0x00FE;   
        }  
        if(ROW2 == 0)         //检测行2电平是否为低电平  
        {  
            delay_ms(DELAY_TIME);  
            if(ROW2 == 0)  
            Y_temp &= 0x00FD;   
        }  
        if(ROW3 == 0)         //检测行3电平是否为低电平  
        {  
            delay_ms(DELAY_TIME);  
            if(ROW3 == 0)  
            Y_temp &= 0x00FB;   
        }  
        if(ROW4 == 0)         //检测行4电平是否为低电平  
        {  
            delay_ms(DELAY_TIME);  
            if(ROW4 == 0)  
            Y_temp &= 0x00F7;   
        }  
        if(ROW5 == 0)         //检测行4电平是否为低电平  
        {  
            delay_ms(DELAY_TIME);  
            if(ROW5 == 0)  
            Y_temp &= 0x00EF;   
        }  
        if(ROW6 == 0)         //检测行4电平是否为低电平  
        {  
            delay_ms(DELAY_TIME);  
            if(ROW6 == 0)  
            Y_temp &= 0x00DF;   
        }  
        if(ROW7 == 0)         //检测行4电平是否为低电平  
        {  
            delay_ms(DELAY_TIME);  
            if(ROW7 == 0)  
            Y_temp &= 0x00BF;   
        }  
        if(ROW8 == 0)         //检测行4电平是否为低电平  
        {  
            delay_ms(DELAY_TIME);  
            if(ROW8 == 0)  
            Y_temp &= 0x007F;   
        }  
        
      P2M1 &= 0x00;  P2M0 |= 0xFF;     //设置P2.0~P2.7为强推挽输出  
      P0M1 &= 0xF3;  P0M0 |= 0x0C;     //设置P0.2~P0.3为强推挽输出  
  	  P1M1 &= 0x03;  P1M0 |= 0xFC;     //设置P1.2~P1.7为强推挽输出 
      
      ROW1=0;ROW2=0;ROW3=0;ROW4=0;ROW5=0;ROW6=0;ROW7=0;ROW8=0;  //行置低  
      COL1=1;COL2=1;COL3=1;COL4=1;COL5=1;COL6=1;COL7=1;COL8=1;  //列置高  
      
        //所用到列IO口配置为输入,进行检测  
      delay_ms(15);  

	  P0M1 &= 0xF3;  P0M0 &= 0xF3;      //设置P0.2~P0.3为准双向口  
  	  P1M1 &= 0x03;  P1M0 &= 0x03;      //设置P1.2~P1.7为准双向口 

      delay_ms(15);  
      
        if(COL1 == 0)         //检测列1电平是否为低电平  
        {  
            delay_ms(DELAY_TIME);  
            if(COL1 == 0)  
            X_temp &= 0xEF00;   
        }  
        if(COL2 == 0)         //检测列2电平是否为低电平  
        {  
            delay_ms(DELAY_TIME);  
            if(COL2 == 0)  
            X_temp &= 0xDF00;   
        }  
        if(COL3 == 0)         //检测列3电平是否为低电平  
        {  
            delay_ms(DELAY_TIME);  
            if(COL3 == 0)  
            X_temp &= 0xBF00;   
        }  
        if(COL4 == 0)         //检测列4电平是否为低电平  
        {  
            delay_ms(DELAY_TIME);  
            if(COL4 == 0)  
            X_temp &= 0x7F00;   
        }  
        if(COL5 == 0)         //检测列3电平是否为低电平  
        {  
            delay_ms(DELAY_TIME);  
            if(COL5 == 0)  
            X_temp &= 0xFE00;   
        }  
        if(COL6 == 0)         //检测列4电平是否为低电平  
        {  
            delay_ms(DELAY_TIME);  
            if(COL6 == 0)  
            X_temp &= 0xFD00;   
        }  
        if(COL7 == 0)         //检测列3电平是否为低电平  
        {  
            delay_ms(DELAY_TIME);  
            if(COL7 == 0)  
            X_temp &= 0xFB00;   
        }  
        if(COL8 == 0)         //检测列4电平是否为低电平  
        {  
            delay_ms(DELAY_TIME);  
            if(COL8 == 0)  
            X_temp &= 0xF700;   
        }  
          
        //将行值和列值合并,得到按键对应的编码值,该值与16个按键一一对应  
        temp = X_temp|Y_temp;  
        temp = ~temp;
		temp_ff00 = temp/4096*16 + temp/256%16;
		//temp_ff00 = temp>>8;
		temp_00ff = temp/16*16 + temp%16;
		//TX1_write2buff(temp_ff00);TX1_write2buff(temp_00ff); delay_ms(250); delay_ms(250); delay_ms(250); delay_ms(250); delay_ms(250); delay_ms(250); 
              
        //将按键检测的原始编码值解析对应按键值信息  
    switch (temp)  
    {     
              case 0x1001:return 1;   //1  
              case 0x2001:return 2;   //2   
              case 0x4001:return 3;   //3  
              case 0x8001:return 4;   //4  
              case 0x0101:return 5;   //5  
              case 0x0201:return 6;   //6  
              case 0x0401:return 7;   //7  
              case 0x0801:return 8;   //8  
              case 0x1002:return 9;   //9  
              case 0x2002:return 10;  //  
              case 0x4002:return 11;  //  
              case 0x8002:return 12;  //  
              case 0x0102:return 13;  //  
              case 0x0202:return 14;  //  
              case 0x0402:return 15;  //  
              case 0x0802:return 16;  //   
			  case 0x1004:return 17;   //  
              case 0x2004:return 18;   //   
              case 0x4004:return 19;   //  
              case 0x8004:return 20;   //  
              case 0x0104:return 21;   //  
              case 0x0204:return 22;   //  
              case 0x0404:return 23;   // 
              case 0x0804:return 24;   // 
			  case 0x1008:return 25;   //  
              case 0x2008:return 26;   //   
              case 0x4008:return 27;   //  
              case 0x8008:return 28;   //  
              case 0x0108:return 29;   //  
              case 0x0208:return 30;   //  
              case 0x0408:return 31;   // 
              case 0x0808:return 32;   // 
			  case 0x1010:return 33;   //  
              case 0x2010:return 34;   //   
              case 0x4010:return 35;   //  
              case 0x8010:return 36;   //  
              case 0x0110:return 37;   //  
              case 0x0210:return 38;   //  
              case 0x0410:return 39;   // 
              case 0x0810:return 40;   //
			  case 0x1020:return 41;   //  
              case 0x2020:return 42;   //   
              case 0x4020:return 43;   //  
              case 0x8020:return 44;   //  
              case 0x0120:return 45;   //  
              case 0x0220:return 46;   //  
              case 0x0420:return 47;   // 
              case 0x0820:return 48;   //
			  case 0x1040:return 49;   //  
              case 0x2040:return 50;   //   
              case 0x4040:return 51;   //  
              case 0x8040:return 52;   //  
              case 0x0140:return 53;   //  
              case 0x0240:return 54;   //  
              case 0x0440:return 55;   // 
              case 0x0840:return 56;   //
			  case 0x1080:return 57;   //  
              case 0x2080:return 58;   //   
              case 0x4080:return 59;   //  
              case 0x8080:return 60;   //  
              case 0x0180:return 61;   //  
              case 0x0280:return 62;   //  
              case 0x0480:return 63;   // 
              case 0x0880:return 64;   //  
              default:  return 0;   
    }                   
}

矩阵8X8键盘

 矩阵键盘和595接口

 

总共64颗带灯按钮,可自定义设置多按键组合触发,板载MOS管可驱动电磁锁

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值