当前位置:   article > 正文

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

矩阵键盘c语言程序

视频演示

工程演示

代码包免费下载

点击上方的下载即可免费下载,无需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);//数码管是否显示模式二	
        }
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51

矩阵键盘代码.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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

矩阵键盘.h文件

#ifndef __MatriKey_H_
#define __MatriKey_H_

unsigned char MatriKey();

#endif

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

延时函数.c文件

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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

延时函数.h文件

#ifndef __DELAY_H__
#define __DELAY_H__ 

void Delay(unsigned int xms);

#endif

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

数码管.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;	//延时消影			
}


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

数码管.h

#ifndef __Nixie_H_
#define __Nixie_H_

void Nixie(unsigned char Location,Number); 

#endif
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/408857
推荐阅读
相关标签
  

闽ICP备14008679号