51单片机—矩阵按键

一、原理图

矩阵按键工作原理实质是单片机不断的循环扫描,所以使用到定时器和4X4矩阵按键,原理图以蓝桥杯单片机矩阵按键为例。

在这里插入图片描述

行为P30、P31、P32、P33,列为P44、P42、P35、P34。

二、key.c程序

#include "key.h"

sbit hang1=P3^0;
sbit hang2=P3^1;
sbit hang3=P3^2;
sbit hang4=P3^3;
sbit lie1=P4^4;
sbit lie2=P4^2;
sbit lie3=P3^5;
sbit lie4=P3^4;

void delayms(unsigned int nms)     
{
  unsigned int i;
  while(nms--)
    for(i = 0;i <110;i++);
}

unsigned char JZjianpan(void)
{
  unsigned char lsbl=20;
  hang1=hang2=hang3=hang4=1;
  lie1=lie2=lie3=lie4=0;
  if(!(hang1 & hang2 & hang3 & hang4))
  {
    delayms(5);  
    hang1=hang2=hang3=hang4=1;
    lie1=lie2=lie3=lie4=0;
    if(!(hang1 & hang2 & hang3 & hang4))     
    {
       P3=0xff;
       lie1=0; lie2 = 1; lie3 = 1;  lie4 = 1; 
       if(hang1==0)       lsbl=7;
       else if(hang2==0)       lsbl=6;
       else if(hang3==0)       lsbl=5;       
       else if(hang4==0)       lsbl=4;  
        
       lie1 = 1; lie2 = 0; lie3 = 1;  lie4 = 1;   
       if(hang1==0)       lsbl=11;
       else if(hang2==0)       lsbl=10;
       else if(hang3==0)       lsbl=9;       
       else if(hang4==0)       lsbl=8;  
        
       lie1 = 1; lie2 = 1; lie3 = 0;  lie4 = 1;  
       if(hang1==0)       lsbl=15;
       else if(hang2==0)       lsbl=14;
       else if(hang3==0)       lsbl=13;       
       else if(hang4==0)       lsbl=12;  
        
       lie1 = 1; lie2 = 1; lie3 = 1;  lie4 = 0; 
       if(hang1==0)       lsbl=19;
       else if(hang2==0)       lsbl=18;
       else if(hang3==0)       lsbl=17;       
       else if(hang4==0)       lsbl=16;          
    }
  }
  hang1=hang2=hang3=hang4=1;
  lie1=lie2=lie3=lie4=0;
  while(!(hang1 & hang2 & hang3 & hang4));
  return lsbl;
}

三、main.c程序

定时器使用的是Timer1,12MHZ,12T模式,1ms定时,自动重装载。

#include "key.h"

unsigned char jianzhi,jianpan_flag;
unsigned long u1ms;

void Timer1_Init(void)		//1毫秒@12.000MHz
{
	AUXR &= 0xBF;			//定时器时钟12T模式
	TMOD &= 0x0F;			//设置定时器模式
	TL1 = 0x18;				//设置定时初始值
	TH1 = 0xFC;				//设置定时初始值
	TF1 = 0;				//清除TF1标志
	TR1 = 1;				//定时器1开始计时
	EA = 1;
}

void main(void)
{
  Timer1Init();
	
  while(1)
  {
    if(jianpan_flag == 1) 
    {  
      jianpan_flag = 0;
      jianzhi = JZjianpan();
			
	  switch(jianzhi)
	  {
		case 4:
					
		break;
		case 5:
					
		break;
		case 6:
					
		break;
		case 7:
					
		break;
	  }
    }
  }
}

void Time_1(void) interrupt 3
{
  u1ms++;
  if(!(u1ms%10 == 0))  jianpan_flag = 1; // 每隔10ms检测一次
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值