视频演示
工程演示
代码包免费下载
点击上方的下载即可免费下载,无需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