一简介
1.矩阵键盘
矩阵键盘(4x4) 键盘为列扫描方式 使用引脚P1
列扫描介绍;51单片机矩阵键盘扫描及使用方法_矩阵按键扫描_小指南的博客-CSDN博客
2.数码管
数码管是8位8段共阴数码管 74HC245() 使用引脚P0,P2^2;P2^3;P2^4;
数码管的驱动芯片为74HC138译码器(位选) 74HC245(段选)
数码管的动态显示:数码管的动态显示又叫做数码管的动态扫描。动态显示的特点是:将所有位数码管段选线并联在一起,,由位选控制是哪一位数码管有效。所谓动态扫描显示即轮流向各位数码管送出字型码和相应的位选,利用发光管的余晖和人眼视觉暂留作用,使人感觉好像各位数码管同时都在显示,而实际上多位数码管是一位一位轮流显示的,只是轮流的速度比较快,人眼已经无法分辨出来。
3.使用平台
使用开发板;普中A5(89C51xxx)
其他头文件可以下载文件
二.实现效果
1-10为数字0 (10为0) 11为确定 12为清除 密码为4位 默认密码为2345
输入正确密码后显示ok输入错误密码后显示error
VID_20230824_151546
三.代码内容如下
1.main.c
#include <REGX52.H>
#include "Delay.h"
#include "MatrixKey.h"
unsigned char KeyNum;
unsigned int Password,Count;
typedef unsigned int u16;
typedef unsigned char u8;
#define SMG_A_DP_PORT P0
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
//共阴极数码管显示0-f的断码数据
u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void delay_10us(u16 ten_us)//延时10us
{
while(ten_us--);
}
void smg_display(int num,int weixuan)//数码管动态显示
{
switch(weixuan)
{
case 0: LSC=1;LSB=1;LSA=1;break;
case 1: LSC=1;LSB=1;LSA=0;break;
case 2: LSC=1;LSB=0;LSA=1;break;
case 3: LSC=1;LSB=0;LSA=0;break;
case 4: LSC=0;LSB=1;LSA=1;break;
case 5: LSC=0;LSB=1;LSA=0;break;
case 6: LSC=0;LSB=0;LSA=1;break;
case 7: LSC=0;LSB=0;LSA=0;break;
}
SMG_A_DP_PORT=gsmg_code[num];//传送段选数据
delay_10us(100);//延时一段时间等待显示稳定
SMG_A_DP_PORT=0x00;//消隐
}
void main()
{
int l=0;//对输入进行计数用于数码管显示合适的位
int p=0;//调整l的值使数码管显示正确的位
int unmkey[8]={0,0,0,0,0,0,0,0};//用于储存输入密码的数组
int erro=0;//密码错误置1 密码正确置2
while(1)
{
KeyNum=MatrixKey();//提取键盘按下的数字
if(KeyNum)
{
if(KeyNum<=10) //如果S1~S10按键按下,输入密码
{
if(Count<4) //如果输入次数小于4
{
Password*=10; //密码左移一位
Password+=KeyNum%10; //获取一位密码
Count++; //计次加一
unmkey[l]=KeyNum%10;//将此次输入的数字传送至数组中
l++;
if(l>4)
{
l=0;
}
}
}
if(KeyNum==11) //如果S11按键按下,确认
{
if(Password==2345) //如果密码等于正确密码
{
Password=0; //密码清零
Count=0; //计次清零
erro=2;//正确置2
}
else //否则
{
Password=0; //密码清零
Count=0; //计次清零
erro=1;//错误
}
}
if(KeyNum==12) //如果S12按键按下,取消
{
Password=0; //密码清零
Count=0; //计次清零
unmkey[0]=0;//数组清零
unmkey[1]=0;
unmkey[2]=0;
unmkey[3]=0;
l=0;//从数组第0位开始显示
erro=0;//错误清零
}
}
p=l;
p--;
if(erro==1)//错误显示error
{
SMG_A_DP_PORT=0x79;
LSC=0;LSB=1;LSA=1;
delay_10us(100);//延迟
SMG_A_DP_PORT=0x00;//消影
SMG_A_DP_PORT=0x70;
LSC=1;LSB=0;LSA=0;
delay_10us(100);//延迟
SMG_A_DP_PORT=0x00;//消影
SMG_A_DP_PORT=0x70;
LSC=1;LSB=0;LSA=1;
delay_10us(100);//延迟
SMG_A_DP_PORT=0x00;//消影
SMG_A_DP_PORT=0x3F;
LSC=1;LSB=1;LSA=0;
delay_10us(100);//延迟
SMG_A_DP_PORT=0x00;//消影
SMG_A_DP_PORT=0x70;
LSC=1;LSB=1;LSA=1;
delay_10us(100);//延迟
SMG_A_DP_PORT=0x00;//消影
}
if(erro==2)//正确
{
LSC=1;LSB=1;LSA=1;
SMG_A_DP_PORT=0x70;//显示k
delay_10us(100);//延迟
SMG_A_DP_PORT=0x00;//消影
LSC=1;LSB=1;LSA=0;
SMG_A_DP_PORT=0x3F;//显示0
delay_10us(100);
SMG_A_DP_PORT=0x00;
}
if(erro==0)
{
smg_display(unmkey[0],0);//在数码管上显示输入的数字
smg_display(unmkey[1],1);
smg_display(unmkey[2],2);
smg_display(unmkey[3],3);
}
}
}
2.MatrixKey
1.MatrixKey.C
#include <REGX52.H>
#include "Delay.h"
/**
* @brief 矩阵键盘读取按键键码
* @param 无
* @retval KeyNumber 按下按键的键码值
如果按键按下不放,程序会停留在此函数,松手的一瞬间,返回按键键码,没有按键按下时,返回0
*/
unsigned char MatrixKey()//列扫描
{
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;
}
2.MatrixKey.h
#ifndef __MATRIXKEY_H__
#define __MATRIXKEY_H__
unsigned char MatrixKey();
#endif
3.Delay
1.Delay.c
void Delay(unsigned int xms)12MHZ 1ms
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
2.Delay.h
#ifndef __DELAY_H__
#define __DELAY_H__
void Delay(unsigned int xms);
#endif