基于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
  • 8
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
### 回答1: 您好!要实现51个单片机的管理和计时功能,您可以考虑使用C语言编写代码。 首先,您需要定义一个结构体来存储每个单片机的信息,包括单片机编号、名称、状态等信息。然后,您可以使用数组来存储所有单片机的信息。 接下来,您可以编写代码来实现计时功能。您可以使用系统时钟来记录时间,并使用定时器来触发计时器中断。当计时器中断发生时,您可以更新相应单片机的计时器值。 另外,您还需要编写代码来处理单片机的状态变化。您可以使用按键、串口通信等方式来与单片机进行交互,然后根据相应的操作来更新单片机的状态。 最后,您可以编写代码来实现单片机信息的显示和管理。您可以使用LCD屏幕或者LED来显示单片机的状态和计时器值,并可以使用按键来选择相应的单片机进行操作。 希望这些信息能对您有所帮助! ### 回答2: 要用C语言51单片机实现数码管的倒计时功能,可以按照以下步骤进行编程。 首先,需要在程序中定义一个变量用于存储倒计时的时间,比如定义一个整型变量time,用于存储剩余的秒数。 接着,在主函数中初始化51单片机的端口,将数码管的管脚接到对应的IO口上。 然后,利用定时器中断来实现倒计时功能。选择一个定时器,如定时器0,并设置其预分频系数,以控制中断的频率。比如设置为1ms产生一次中断。 在中断服务程序中,先将时间time减1,然后将time的值转换为显示在数码管上的数码格式,比如将time的十位数存储在一个变量ten中,个位数存储在一个变量unit中。 接着,编写将ten和unit的值分别显示在数码管的代码。将ten和unit的值作为参数传递给函数,函数根据传入的参数分别在对应的数码管上显示相应的数字。 最后,在主函数中启用定时器中断,并利用循环不断检测time的值是否为0。如果time等于0,则在数码管上显示倒计时结束的提示信息,并停止定时器中断。 通过以上步骤,就可以在51单片机实现数码管的倒计时功能了。编译、烧录并运行程序后,数码管将会不断显示倒计时的时间,并按照设定的频率进行更新,直到倒计时结束。 ### 回答3: 要用C语言写一个51单片机数码管倒计时,首先需要了解51单片机的基本原理和功能。 51单片机是一种常用的8位微处理器,主要用于嵌入式系统和电子产品中。在编程上,可以使用C语言来进行开发。数码管倒计时是一种常见的应用,用于显示倒计时时间。 首先,需要在51单片机上连接数码管,并且了解数码管的显示原理和控制方式。51单片机可以通过IO口控制数码管的每个段显示。可以根据需要选择不同的数码管显示方式,如共阴极或共阳极。 接下来,需要编写C语言程序实现倒计时功能。首先需要定义倒计时的时间长度,并进行初始化设置。然后使用定时器来生成中断信号,每次中断时更新计时器的值。在中断服务程序中,将计时器的值转换为数码管的控制信号,并发送到数码管上进行显示。 在倒计时过程中,程序需要不断更新计时器的值,并将其转换为数码管显示的格式。当倒计时达到0时,可以发出提示音或其他操作来提醒倒计时结束。 最后,需要对程序进行调试和测试,确保倒计时功能的正常运行。可以通过连接调试器、使用仿真器或在实际硬件上进行测试来验证程序的正确性。 总结起来,使用C语言编写51单片机数码管倒计时的过程主要包括硬件连接、了解数码管原理、编写C语言程序、调试和测试等步骤。通过这些步骤,可以实现一个简单而实用的数码管倒计时功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

送外卖的CV工程师

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

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

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

打赏作者

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

抵扣说明:

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

余额充值