基于51单片机C语言——学习矩阵键盘和数码管 以及 实现矩阵键盘键值实现8位数码管显示键值和LED灯闪烁

视频演示

工程演示

代码包免费下载

点击上方的下载即可免费下载,无需VIP

总结

本人也是刚学习单片机不久,都是自己学的单片机然后自己做一些工程,单靠理解不上手容易忘记。如果是刚接触单片机的话,看一些教程自己学习一下,然后可以按照我的这个设计,自己也写一份类似的要求设计,可以的话,我们可以一起交流。
谢谢观看

功能介绍

在这里插入图片描述

运用了矩阵键盘赋予相对应的16进制数
1.矩阵键盘S16用来转换模式

  • 模式一:在8位数码管上显示按下的键值
  • 模式二:按下对应的键位,则LED闪烁对应的次数

代码提要

代码主要运用了数码管和矩阵键盘的模块,矩阵键盘消抖用的是Delay延时函数,暂不用定时器消抖

需要引用自定义头文件

引用自定义头文件方法

第一步 创建文件

在这里插入图片描述

第二步

在这里插入图片描述

第三步 自己在里边编写内容

第四步 在.c文件里面用的函数需要将函数声明放入.h中 例如

在这里插入图片描述

最后引用头文件#include "MatriKey.h"

数码管的使用

在这里插入图片描述

P2_2 与 P2_3 与 P2_4组成的三位二进制数的十进制数对应右边的LED几,例如你想控制左边第一个数码管,则需要控制LED8,LED8对应的是Y7,则P2的_2_3_4应该为1 1 1

在这里插入图片描述

数码管的引脚是P0,7段数码管上对应的a b c d e f g,让其以不同的组合亮,显示不同的字符形状
这里则给出0~15的十六进制数数码管
{0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71}
重要的一点:数码管每次只能显示一位,但由于显示的很快,八位数码管每一位都在飞快的显示后又消失,人眼看不出来,所以效果是8位数码管都显示了键值

矩阵键盘的使用

在这里插入图片描述

例如图片,检测到我按下了某一个矩阵键盘按键,则开始逐列扫描矩阵键盘,当扫描到P1_3和P1_6是低电平,则表示S5按下了,消抖后,返回S5的键值:5
这里采取的是逐列扫描P1_0~P1_3,每次扫描后为了不影响后面的扫描,都要将P1赋值为0xFF
扫描每列的时候,如果有按下,则开始扫描行数

主函数代码内容

定义LED需要宏定义一个P2,这样在代码中可提高阅读性,让读者知道这是LED
#define LED P2
代替
P2 = 0x00;

#include <REGX52.H>
#include "Nixie.h"		//数码管模块函数
#include "Delay.h"		//延时模块函数
#include "MatriKey.h"   //矩阵键盘模块函数
#define LED P2
void main()
{
    unsigned char KeyNumber;
	unsigned char i;
	unsigned char LastKeyNumber;//上一次的键值
    bit flag = 1; //1为模式一;0为模式二

    while (1)
    {
        KeyNumber = MatriKey(); //获取按键值
		
        if (KeyNumber == 16) //检查是否按下 S16
        {
            flag = ~flag; //切换模式
			//LastKeyNumber=0;//否
			/****是否保存上一次数码管的数字****/
        }
        if (flag) //模式一
        {          
			if (KeyNumber >= 1 && KeyNumber <= 15)//记录上一次的数值,防止KeyNumber一直被赋上0,进而导致数码管全部显示0
				{
					LastKeyNumber = KeyNumber;
				}
			if(LastKeyNumber!=0)		//防止第一次运行显示0
				for (i = 1; i <= 8; i++)//单独拿出来for循环,就不会受到KeyNumber= 0  if条件无法执行的影响										
										//所以尽管每次循环不按按键,Number为0,也不影响for的循环,所以可以一直显示,直到改变按键键值
				{
					Nixie(i, LastKeyNumber);
				}
			//else Nixie(1,1);//数码管是否显示模式一
        }
        else //模式二
        {
			if(KeyNumber>=1&&KeyNumber<=15)
				for (i = 0; i < KeyNumber; i++)
				{
					LED = 0x00; 
					Delay(300); 
					LED = 0xFF; 
					Delay(300);
				}
			//else Nixie(1,2);//数码管是否显示模式二	
        }
    }
}

矩阵键盘代码.c文件

#include <REGX52.H>
#include "Delay.h"
unsigned char MatriKey()
{
	unsigned char KeyNumber = 0;
	P1 = 0xFF;
	P1_3 = 0;
	if(P1_7 == 0) {Delay(20);while(P1_7 == 0);Delay(20);KeyNumber = 1;}
	if(P1_6 == 0) {Delay(20);while(P1_6 == 0);Delay(20);KeyNumber = 5;}
	if(P1_5 == 0) {Delay(20);while(P1_5 == 0);Delay(20);KeyNumber = 9;}
	if(P1_4 == 0) {Delay(20);while(P1_4 == 0);Delay(20);KeyNumber = 13;}
	
	P1 = 0xFF;
	P1_2 = 0;
	if(P1_7 == 0) {Delay(20);while(P1_7 == 0);Delay(20);KeyNumber = 2;}
	if(P1_6 == 0) {Delay(20);while(P1_6 == 0);Delay(20);KeyNumber = 6;}
	if(P1_5 == 0) {Delay(20);while(P1_5 == 0);Delay(20);KeyNumber = 10;}
	if(P1_4 == 0) {Delay(20);while(P1_4 == 0);Delay(20);KeyNumber = 14;}
	
	P1 = 0xFF;
	P1_1 = 0;
	if(P1_7 == 0) {Delay(20);while(P1_7 == 0);Delay(20);KeyNumber = 3;}
	if(P1_6 == 0) {Delay(20);while(P1_6 == 0);Delay(20);KeyNumber = 7;}
	if(P1_5 == 0) {Delay(20);while(P1_5 == 0);Delay(20);KeyNumber = 11;}
	if(P1_4 == 0) {Delay(20);while(P1_4 == 0);Delay(20);KeyNumber = 15;}
	
	P1 = 0xFF;
	P1_0 = 0;
	if(P1_7 == 0) {Delay(20);while(P1_7 == 0);Delay(20);KeyNumber = 4;}
	if(P1_6 == 0) {Delay(20);while(P1_6 == 0);Delay(20);KeyNumber = 8;}
	if(P1_5 == 0) {Delay(20);while(P1_5 == 0);Delay(20);KeyNumber = 12;}
	if(P1_4 == 0) {Delay(20);while(P1_4 == 0);Delay(20);KeyNumber = 16;}
	
	return KeyNumber;
}

矩阵键盘.h文件

#ifndef __MatriKey_H_
#define __MatriKey_H_

unsigned char MatriKey();

#endif

延时函数.c文件

void Delay(unsigned int xms)//1ms延迟
{
 	unsigned char i ,j;
	while(xms--)
	{
		i = 2;j = 239;
		do
		{
			while(--j);
		}	while(--i);
	}
}

延时函数.h文件

#ifndef __DELAY_H__
#define __DELAY_H__ 

void Delay(unsigned int xms);

#endif

数码管.c

#include <REGX52.H>
#include "Delay.h"

unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};

void Nixie(unsigned char Location,unsigned char Number)
{
	switch(Location)	
	{
		case 1:P2_4=1;P2_3=1;P2_2=1;break;
		case 2:P2_4=1;P2_3=1;P2_2=0;break;
		case 3:P2_4=1;P2_3=0;P2_2=1;break;
		case 4:P2_4=1;P2_3=0;P2_2=0;break;
		case 5:P2_4=0;P2_3=1;P2_2=1;break;
		case 6:P2_4=0;P2_3=1;P2_2=0;break;
		case 7:P2_4=0;P2_3=0;P2_2=1;break;
		case 8:P2_4=0;P2_3=0;P2_2=0;break;
	}
	P0=NixieTable[Number];	
	Delay(1);				
	P0=0x00;	//延时消影			
}


数码管.h

#ifndef __Nixie_H_
#define __Nixie_H_

void Nixie(unsigned char Location,Number); 

#endif
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

送外卖的CV工程师

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

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

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

打赏作者

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

抵扣说明:

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

余额充值