基于51单片机的矩阵按键控制

在代码开始之前,首先搞清楚矩阵每个led

uchar code TAB[]={0x3f,0x06,0x5b,0x4f,
	                0x66,0x6d,0x7d,0x07,
                  0x7f,0x6f,0x77,0x7c,
                  0x39,0x5e,0x79,0x71};//段码码值
uchar code Seg[]={0x00,0x04,0x08,0x0c, 0x10,0x14,0x18,0x1c};//位码码值

对应的代码段和位置

然后就是延时函数

/*********************延时函数*************************/									
void Delay(uint ctn)
{
  uint i;
	for(i=0;i<ctn;i++);
}

在按键控制过程中,我们会用到一个很重要的方法

/*********************线反转法*************************/
uchar Keyscan(void)
{
  uchar cord_h,cord_l;
	P1=0x0f;
	cord_h=P1&0x0f;
	if(cord_h!=0x0f)  //判断有无按键按下
	{
    Delay(100);     //短暂的延时去抖
    if(cord_h!=0x0f) //再次确定有无按键按下,作用是继续去抖
		{
		  cord_h=P1&0x0f;//读回行线键值
			P1=0x0f;       //线反转
			cord_l=P1&0x0f;//读回列线键值
			return(cord_h+cord_l);
		}			
	}return(0xff);
}	

接下来就是主函数

下面是整个函数

include"reg52.h"
#define uint unsigned int
#define uchar unsigned char
uchar code TAB[]={0x3f,0x06,0x5b,0x4f,
	                0x66,0x6d,0x7d,0x07,
                  0x7f,0x6f,0x77,0x7c,
                  0x39,0x5e,0x79,0x71};//段码码值
uchar code Seg[]={0x00,0x04,0x08,0x0c, 0x10,0x14,0x18,0x1c};//位码码值
uchar Key;//键值变量
uint Temp;
/*********************延时函数*************************/									
void Delay(uint ctn)
{
  uint i;
	for(i=0;i<ctn;i++);
}
/*********************线反转法*************************/
uchar Keyscan(void)
{
  uchar cord_h,cord_l;
	P1=0x0f;
	cord_h=P1&0x0f;
	if(cord_h!=0x0f)  //判断有无按键按下
	{
    Delay(100);     //短暂的延时去抖
    if(cord_h!=0x0f) //再次确定有无按键按下,作用是继续去抖
		{
		  cord_h=P1&0x0f;//读回行线键值
			P1=0x0f;       //线反转
			cord_l=P1&0x0f;//读回列线键值
			return(cord_h+cord_l);
		}			
	}return(0xff);
}	
/********************键值转换成段值*********************/
void Key_Duan()
{
  Key=Keyscan();
	switch(key)
	{
	  case 0x77:Temp=TAB[0];break;//0
		case 0x7b:Temp=TAB[1];break;//1
		case 0x7d:Temp=TAB[2];break;//2
		case 0x7e:Temp=TAB[3];break;//3
		case 0xb7:Temp=TAB[4];break;//4
		case 0xbb:Temp=TAB[5];break;//5
		case 0xbd:Temp=TAB[6];break;//6
		case 0xbe:Temp=TAB[7];break;//7
		case 0xd7:Temp=TAB[8];break;//8
		case 0xdb:Temp=TAB[9];break;//9
		case 0xdd:Temp=TAB[10];break;//a
		case 0xde:Temp=TAB[11];break;//b
		case 0xe7:Temp=TAB[12];break;//c
		case 0xeb:Temp=TAB[13];break;//d
		case 0xed:Temp=TAB[14];break;//e
		case 0xee:Temp=TAB[15];break;//f
	}
}
/**********************显示函数******************/	
void Dispaly()
{
  P2=Seg[0];
	P0=Temp;
}	
/**********************主函数********************/
void main()
{
  while(1)
	{
	  Key_Duan();
		Display;
	}
}

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赛博马嘉祺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值