赞
踩
工程演示
点击上方的下载即可免费下载,无需VIP
本人也是刚学习单片机不久,都是自己学的单片机然后自己做一些工程,单靠理解不上手容易忘记。如果是刚接触单片机的话,看一些教程自己学习一下,然后可以按照我的这个设计,自己也写一份类似的要求设计,可以的话,我们可以一起交流。
谢谢观看
运用了矩阵键盘赋予相对应的16进制数
1.矩阵键盘S16用来转换模式
代码主要运用了数码管和矩阵键盘的模块,矩阵键盘消抖用的是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);//数码管是否显示模式二 } } }
#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; }
#ifndef __MatriKey_H_
#define __MatriKey_H_
unsigned char MatriKey();
#endif
void Delay(unsigned int xms)//1ms延迟
{
unsigned char i ,j;
while(xms--)
{
i = 2;j = 239;
do
{
while(--j);
} while(--i);
}
}
#ifndef __DELAY_H__
#define __DELAY_H__
void Delay(unsigned int xms);
#endif
#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; //延时消影 }
#ifndef __Nixie_H_
#define __Nixie_H_
void Nixie(unsigned char Location,Number);
#endif
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。